기준: DVA-C02 시험 가이드오류 제보
Week 3에서 다룬 Lambda는 단순한 "서버리스 함수"가 아니다. Firecracker MicroVM의 실행 모델, 세 가지 호출 방식의 신뢰성 모델, 버전·별칭·레이어의 배포 라이프사이클, 동시성 제어의 네 계층 — 이 모든 것이 유기적으로 연결된 시스템이다.
오늘은 암기로 외우는 것이 아니라, "왜 이렇게 설계됐는가"라는 질문을 가지고 전체 지도를 다시 그려본다. 그런 다음 시험에서 실제로 나오는 형태인 시나리오 문제 12개로 실전 감각을 확인한다.
실행 환경
├── 런타임: Python 3.12/3.11/3.10, Node.js 20/18, Java 21/17/11/8
│ Go(provided.al2023 OS 전용 런타임), .NET 8/6, Ruby 3.3, Custom Runtime
├── 메모리: 128MB ~ 10,240MB (1MB 단위, 1,769MB = 1 vCPU)
├── 타임아웃: 1초 ~ 900초 (15분)
├── /tmp: 512MB ~ 10,240MB
├── 환경 변수: 4KB 전체
└── 배포
├── ZIP 직접: 50MB
├── ZIP S3 경유: 250MB (압축 해제)
├── 컨테이너 이미지: 10GB
└── 레이어: 최대 5개, 코드+레이어 합계 250MB
페이로드
├── 동기 (요청/응답): 6MB
├── 비동기: 1MB (2025년 10월 256KB에서 상향)
└── Response Streaming: 200MB (2025년 7월 20MB에서 상향)
동시성
├── 계정/리전 기본: 1,000 (증가 요청 가능)
└── 스케일링 속도: 함수마다 10초에 +1,000 (2023년 말 변경)
Lambda의 세 가지 호출 방식은 각각 다른 신뢰성 요구에서 탄생했다.
동기 호출은 "즉각적인 응답이 필요한 요청"에서 출발했다. API Gateway가 HTTP 요청을 받으면 클라이언트는 응답을 기다리고 있다. Lambda가 실패하면 API Gateway가 바로 클라이언트에 오류를 반환한다. 재시도는 클라이언트의 결정이다. 단순하지만 내구성 없음.
비동기 호출은 "이벤트를 잃으면 안 되는 경우"에서 탄생했다. S3에 파일이 업로드됐다는 이벤트는 처리될 때까지 Lambda 서비스가 내구적으로 보관한다. 2회 재시도 후에도 실패하면 DLQ로 보내 나중에 분석한다. 내구성 높음, 즉각 응답 없음.
ESM 폴링은 "큐/스트림을 소비하는 워커"에서 나왔다. SQS나 Kinesis는 이미 데이터를 내구적으로 보관하고 있다. Lambda가 능동적으로 폴링해서 처리하는 것이 자연스럽다. 큐/스트림의 내구성을 그대로 활용.
호출 방식 → 사용 사례 매핑
API Gateway → Lambda (동기)
→ RESTful API, 실시간 조회, 동기 처리
S3 이벤트 → Lambda (비동기)
→ 파일 처리, 이미지 리사이즈, 업로드 트리거
SNS → Lambda (비동기, 팬아웃)
→ 여러 처리 함수에 이벤트 분배
EventBridge → Lambda (비동기, 이벤트 버스)
→ 이벤트 패턴 매칭, 스케줄 실행
SQS → Lambda (ESM, 부하 분산)
→ 주문 처리, 이메일 발송, 비동기 작업 큐
Kinesis → Lambda (ESM, 순서 보장)
→ 클릭스트림 분석, 실시간 집계, 시계열 처리
DynamoDB Streams → Lambda (ESM, 변경 반응)
→ 검색 인덱스 동기화, 캐시 갱신, 감사 로그
Lambda의 배포 모델을 이해하는 가장 쉬운 방법은 Git 비유다.
Git Lambda
────────────────────────────────────────
커밋 해시 버전 번호 (불변)
HEAD $LATEST (수정 가능)
브랜치 포인터 별칭 (변경 가능 포인터)
Git Tag 버전 + Description
.npmignore 레이어 (공유 의존성)
git checkout feature-branch처럼 별칭을 바꾸면 다른 버전으로 트래픽이 이동한다. git merge --ff-only처럼 카나리 배포로 10%씩 점진적 병합이 가능하다.
| 계층 | 설정 위치 | 비용 | 콜드 스타트 | 목적 |
|---|---|---|---|---|
| 계정 한도 | AWS Support 티켓 | - | - | 전체 상한 |
| Reserved Concurrency | 함수 | 없음 | 영향 없음 | 함수별 격리·상한 |
| Provisioned Concurrency | 버전/별칭 | 있음 | 제거 | 콜드 스타트 해결 |
| 버스트 한도 | 리전 고정 | - | - | 스케일아웃 속도 제한 |
공동 책임 관계:
Lambda에서 에러 발생?
│
├── 동기 호출이면?
│ → 즉시 에러 응답 (HTTP 200 + FunctionError 헤더)
│ → 재시도: 클라이언트 책임
│ → DLQ: 없음
│
├── 비동기 호출이면?
│ → Lambda 서비스가 1분 후 재시도 (1회)
│ → 2분 후 재시도 (2회)
│ → 최종 실패 → DLQ 또는 Destinations OnFailure
│ → 이벤트 나이 최대 6시간
│
└── ESM 폴링이면?
├── SQS?
│ → 가시성 타임아웃 후 메시지 복귀
│ → maxReceiveCount 초과 → SQS DLQ
│ → ReportBatchItemFailures로 부분 실패 격리
│
└── Kinesis/DDB Streams?
→ 기본 무한 재시도 (샤드 블록 위험)
→ MaximumRetryAttempts 설정 필수
→ BisectBatchOnFunctionError로 격리
→ OnFailure Destination으로 최종 실패 처리
콜드 스타트가 문제인가?
│
├── Java 함수?
│ → SnapStart (무료, 버전 필요)
│
├── 응답 SLA가 엄격한가 (p99 < 100ms)?
│ → Provisioned Concurrency (비용 발생)
│
├── 패키지 크기가 큰가 (>50MB)?
│ → 레이어로 분리
│ → 컨테이너 이미지 (Lambda SnapStart 활용)
│
├── 대용량 라이브러리 import가 느린가?
│ → 지연 import (필요할 때만 import)
│ → 메모리 증가 (CPU 비례 증가 → INIT 빨라짐)
│
└── VPC Lambda?
→ Hyperplane ENI 이후 크게 개선
→ 여전히 느리면 단일 AZ 서브넷 → 다중 AZ로
함정 1: Provisioned Concurrency는 $LATEST에 설정할 수 없다.
→ 버전을 발행하거나 별칭을 만든 후 그것에 설정해야 한다.
함정 2: SnapStart는 버전 발행 시 스냅샷이 생성된다.
→ $LATEST에서는 동작하지 않는다. 코드 변경 후 반드시 버전 발행 필요.
함정 3: Kinesis ESM의 기본 재시도는 무한이다.
→ MaximumRetryAttempts를 명시적으로 설정하지 않으면 샤드가 영구 블록될 수 있다.
함정 4: VPC 연결 Lambda는 퍼블릭 서브넷이어도 인터넷 직접 접근 불가. → NAT Gateway + 프라이빗 서브넷 필요.
함정 5: Lambda 별칭 가중치는 2개 버전만. → 3분할 불가능.
함정 6: SQS DLQ와 Lambda DLQ는 다른 개념이다. → SQS-Lambda ESM 실패는 SQS DLQ, S3/SNS 비동기 실패는 Lambda DLQ.
함정 7: API 키는 인증이 아니다. → 사용량 추적과 제한 목적.
함정 8: Lambda 컨테이너 이미지는 레이어를 사용할 수 없다.
함정 9: /tmp는 같은 실행 환경의 다음 호출에서 공유된다. → 민감 데이터 주의. 실행 환경이 다르면 공유 안 됨.
함정 10: 비동기 재시도는 2회, 간격은 1분/2분. → 무한이 아니다.
| 도메인 | Lambda 관련 키워드 |
|---|---|
| 개발(32%) | 런타임, 핸들러, 이벤트 구조, 컨텍스트 객체, 레이어 |
| 보안(26%) | Execution Role, Function Policy, VPC, IMDSv2, 환경 변수 암호화 |
| 배포(24%) | 버전, 별칭, CodeDeploy, SnapStart, SAM, CloudFormation |
| 문제 해결(18%) | CloudWatch 메트릭, X-Ray 트레이싱, 콜드 스타트 진단 |
선택지를 클릭하면 정답·해설이 펼쳐집니다.
문제 1
결제 API Lambda 함수가 트래픽 급증 시 높은 레이턴시를 보인다. CloudWatch ConcurrentExecutions는 정상 범위이고, Duration P99이 3,000ms를 넘는 상황이다. 가장 가능성 높은 원인과 해결책은?
문제 2
S3에 이미지가 업로드되면 Lambda가 썸네일을 생성해 같은 버킷의 thumbnails/ 디렉토리에 저장한다. 운영 중 Lambda가 무한 루프에 빠진 것을 발견했다. 원인과 해결책은?
문제 3
주문 처리 시스템에서 Lambda가 SQS를 폴링해 주문을 처리한다. 배치 크기는 100이고, 하나의 주문이 외부 API 타임아웃으로 실패했다. 나머지 99개도 다시 처리되는 문제가 발생했다. 어떻게 해결하는가?
문제 4
Java Spring Boot를 Lambda로 운영 중이다. 콜드 스타트가 3~5초에 달해 API 응답 SLA를 위반한다. 비용 효율적인 해결책은?
문제 5
Lambda 함수의 환경 변수에 DB 비밀번호를 저장했다. 보안팀이 이것이 기본 KMS 관리 키로만 암호화되어 계정 내 다른 팀도 잠재적으로 접근 가능하다고 지적했다. 가장 효과적인 해결책은?
문제 6
한 팀이 Lambda 함수에 Reserved Concurrency 500을 설정했다. 계정 전체 동시성 한도는 1,000이다. 다음 날 다른 팀의 함수가 급격한 트래픽 증가로 스로틀링됐다. 원인은?
문제 7
Lambda 함수가 Kinesis Data Streams를 폴링하는데, CloudWatch에서 IteratorAge 메트릭이 지속적으로 증가하고 있다. 무엇을 의미하며 어떻게 대응하는가?
문제 8
여러 Lambda 함수에서 동일한 pandas, numpy 라이브러리를 사용한다. 각 함수의 ZIP 크기가 200MB에 달해 배포 속도가 느리다. 어떻게 개선하는가?
문제 9
Lambda Destinations와 DLQ를 동시에 설정한 경우 어떻게 동작하는가?
문제 10
Lambda 함수 코드에서 DB 연결을 핸들러 함수 내부에 생성하고 있다. 운영팀이 DB 연결 수 급증으로 RDS Connection Limit 오류가 난다고 보고했다. 가장 효과적인 해결책은?
문제 11
Lambda 비동기 호출의 이벤트 나이(event age) 최대값은?
문제 12
Lambda 함수가 사내 온프레미스 데이터베이스에 접근해야 한다. 이 DB는 VPN 연결을 통해서만 접근 가능하다. 어떻게 구성하는가?
| 정답 수 | 평가 |
|---|---|
| 11-12 | Lambda 마스터 — DVA 시험 준비 완료 |
| 9-10 | 우수 — 틀린 문제 시나리오 재검토 |
| 7-8 | 양호 — Day 11-14 재독 후 재도전 |
| 5-6 | 보통 — Firecracker MicroVM부터 다시 |
| 0-4 | 미흡 — Week 3 전체 처음부터 |