본문 바로가기

Backend/Study

[DevOps] AWS Lambda로 서버리스 백앤드 구축하기

반응형

0. 개요

  1. AWS Lambda로 서버리스 백엔드 구축하기
  2. 아키텍처 개요와 선택지
    • API Gateway vs ALB vs Event-Driven
    • Lambda 적합/부적합 워크로드
  3. 핵심 컴포넌트 맵
    • Lambda·API Gateway·DynamoDB·S3
    • EventBridge·SQS·SNS·Step Functions
  4. 보안·네트워킹 베스트 프랙티스
    • 최소 권한 IAM·시크릿 관리
    • VPC 연결·RDS Proxy·엔드포인트
  5. 개발 생산성과 코드 구조
    • 언어 선택·핸들러 패턴·레이어
    • Idempotency·리트라이·에러 전략
  6. 배포: SAM·CDK·Serverless Framework
    • IaC 템플릿·환경 변수·스테이지
    • 블루/그린·카나리 배포
  7. 데이터 설계
    • DynamoDB 파티션 키·GSI·TTL
    • Aurora Serverless·Data API
  8. 성능·비용 최적화
    • 콜드스타트·메모리/스토리지 튜닝
    • 동시성·프로비저닝·캐싱
  9. 관측성: 로그·메트릭·트레이싱
    • CloudWatch·X-Ray·Powertools
    • 대시보드와 알람 설계
  10. 레퍼런스 코드와 템플릿
    • 핸들러·SAM 템플릿·CDK 스택
  11. 트러블슈팅
    • 429/Throttling·타임아웃·DLQ
  12. 체크리스트 & 운영 플레이북
  13. 결론 요약
  14. FAQ

1. AWS Lambda로 서버리스 백엔드 구축하기

이 글은 API 요청 처리부터 비동기 이벤트 파이프라인까지, 현업에서 바로 써먹는 서버리스 백엔드 설계·구현·운영 방법을 단계별로 정리했습니다. 처음 시작하시는 분도 따라 하기 쉽도록 코드와 템플릿을 함께 제공합니다.

2. 아키텍처 개요와 선택지

2-1. API Gateway vs ALB vs Event-Driven

  • API Gateway: REST/HTTP API로 요청 라우팅·인증·스테이지·스로틀링 제공. 다수의 엔드포인트를 빠르게 구성할 때 적합합니다.
  • ALB + Lambda: HTTP(S) 경량 라우팅만 필요하고 비용을 더 낮추고 싶을 때 고려합니다(기능은 단순).
  • Event-Driven: S3 업로드, EventBridge 일정, SQS 메시지 등 이벤트 기반 처리에 최적. 백오피스·배치·웹훅 수신에 유리합니다.

2-2. Lambda 적합/부적합 워크로드

  • 적합: 단명 요청(수초), 간헐적 트래픽, 이벤트 처리, 이미지/문서 변환, 웹훅, ETL 조각 작업.
  • 부적합: 장시간 스트리밍, 저지연 고정 커넥션, 대형 바이너리 장시간 처리(대안: Fargate/ECS·EC2).

3. 핵심 컴포넌트 맵

3-1. Lambda·API Gateway·DynamoDB·S3

  • API GatewayLambdaDynamoDB에 CRUD, 정적 파일은 S3 + CloudFront로 분리하여 지연과 비용을 줄입니다.

3-2. EventBridge·SQS·SNS·Step Functions

  • EventBridge: 느슨한 결합, 규칙 기반 라우팅.
  • SQS: 버퍼링·재시도·DLQ로 내결함성 강화.
  • SNS: 팬아웃(푸시) 알림, 멀티 구독자.
  • Step Functions: 장기 워크플로우·사가 패턴에 적합.

4. 보안·네트워킹 베스트 프랙티스

4-1. 최소 권한 IAM·시크릿 관리

  • 함수별 최소 권한 정책을 부여하고, 시크릿은 Secrets Manager/Parameter Store로 관리합니다.
  • KMS로 암호화(환경 변수·S3·DynamoDB 테이블 키)와 감사 추적을 활성화하세요.

4-2. VPC 연결·RDS Proxy·엔드포인트

  • RDS와 통신하려면 Lambda를 프라이빗 서브넷에 연결하고 RDS Proxy로 커넥션 풀을 안정화합니다.
  • 외부망 없이 AWS 서비스에 접근하려면 VPC 엔드포인트(S3, DynamoDB, SSM 등)를 사용합니다.

5. 개발 생산성과 코드 구조

5-1. 언어 선택·핸들러 패턴·레이어

  • Node.js·Python이 흔하고 콜드스타트가 빠릅니다. 공통 유틸은 Lambda Layers로 분리하세요.
  • 핸들러는 입력 검증 → 비즈니스 로직 → 외부 I/O 3단계로 나누면 테스트가 쉬워집니다.

5-2. Idempotency·리트라이·에러 전략

  • 요청 키 기반 멱등성(DynamoDB 조건식/TTL)을 구현하면 중복 실행에도 안전합니다.
  • 비동기 트리거는 자동 재시도됩니다. 실패는 DLQ(SQS/SNS) 또는 온-페일 알림으로 분기하세요.

6. 배포: SAM·CDK·Serverless Framework

6-1. IaC 템플릿·환경 변수·스테이지

  • SAM: CloudFormation 상위 레벨. 빠르게 시작하기 좋습니다.
  • CDK: 코드로 스택 구성(TS/JS/Python 등). 재사용성·테스팅 용이.
  • 스테이지(dev/stg/prd)별 파라미터환경 변수를 분리하세요.

6-2. 블루/그린·카나리 배포

  • Lambda 버전·Alias트래픽 가중치를 활용해 점진 배포(예: 10% → 100%).

7. 데이터 설계

7-1. DynamoDB 파티션 키·GSI·TTL

  • 핫 파티션을 피하기 위해 균등한 파티션 키를 설계하고, 조회 패턴에 맞춘 GSI를 정의합니다.
  • 임시 데이터는 TTL로 자동 만료.

7-2. Aurora Serverless·Data API

  • 관계형이 필요하면 Aurora Serverless v2 + Data API로 커넥션 문제를 줄입니다.

8. 성능·비용 최적화

8-1. 콜드스타트·메모리/스토리지 튜닝

  • 메모리를 늘리면 vCPU가 함께 증가하여 지연이 줄고 종종 비용도 절감됩니다.
  • ephemeral storage(/tmp)는 512MB~10GB 범위에서 필요 시 확장.
  • 프로비저닝 동시성으로 콜드스타트를 제거할 수 있습니다(핫 경로에만 적용).

8-2. 동시성·프로비저닝·캐싱

  • 계정별 동시성 한도를 고려해 예약 동시성으로 중요 함수의 자원을 보장합니다.
  • 외부 API 결과는 DynamoDB/ElastiCache에 캐시하여 반복 호출을 줄입니다.

9. 관측성: 로그·메트릭·트레이싱

9-1. CloudWatch·X-Ray·Powertools

  • 구조화 로그(JSON)로 필드 검색을 쉽게 하고, X-Ray로 호출 체인을 추적합니다.
  • Lambda Powertools(Python/Node): 로깅·트레이싱·메트릭·멱등성 유틸을 표준화.

9-2. 대시보드와 알람 설계

  • 핵심 지표: 오류율, 지연 p95, 동시 실행, 스로틀링, 재시도, DLQ 적체량.

10. 레퍼런스 코드와 템플릿

핸들러·SAM 템플릿·CDK 스택

# Node.js 핸들러(HTTP API) export const handler = async (event) => { try { const body = JSON.parse(event.body || "{}"); return { statusCode: 200, body: JSON.stringify({ ok: true, echo: body }) }; } catch (e) { console.error(e); return { statusCode: 500, body: JSON.stringify({ message: "error" }) }; } }; 
# SAM 템플릿(요약) AWSTemplateFormatVersion: "2010-09-09" Transform: AWS::Serverless-2016-10-31 Resources: ApiFunction: Type: AWS::Serverless::Function Properties: Runtime: nodejs20.x Handler: index.handler MemorySize: 512 Timeout: 10 Events: Api: Type: HttpApi Properties: Path: /echo Method: POST 
// CDK (TypeScript) 스택 스니펫 const fn = new lambda.Function(this, "ApiFn", { runtime: lambda.Runtime.NODEJS_20_X, handler: "index.handler", code: lambda.Code.fromAsset("dist"), memorySize: 512, timeout: cdk.Duration.seconds(10), }); new apigw.HttpApi(this, "HttpApi", { defaultIntegration: new integrations.HttpLambdaIntegration("Int", fn), }); 

11. 트러블슈팅

  • 429/Throttling: 예약/계정 동시성 확인, 스로틀링 발생 시 큐(SQS) 버퍼링 적용.
  • 타임아웃: 외부 API 지연이면 타임아웃·재시도·서킷브레이커 설정, VPC 연결 시 ENI 생성 지연 점검.
  • DLQ 적체: 실패 페이로드를 샘플링·재처리하고, 멱등성 키를 적용해 중복 실행에 대비.

12. 체크리스트 & 운영 플레이북

  • 보안: 최소 권한 IAM, 시크릿은 Secrets Manager, KMS 암호화.
  • 성능: 메모리·타임아웃·동시성 튜닝, 프로비저닝은 필요 경로만.
  • 신뢰성: 재시도/백오프, DLQ, SQS 적체 알람, Step Functions로 긴 흐름 관리.
  • 데이터: DynamoDB 파티션 설계·GSI·TTL, RDS는 RDS Proxy 또는 Data API.
  • 배포: IaC(SAM/CDK), 스테이지 분리, 카나리/롤백 자동화.
  • 관측성: 구조화 로그·X-Ray·알람 대시보드 표준화.

13. 결론 요약

API Gateway + Lambda + DynamoDB 조합에 이벤트 기반( EventBridge·SQS·SNS) 패턴을 더하면, 적은 운영 부담으로 확장성과 민첩성을 얻을 수 있습니다. 보안·데이터·관측성 표준을 미리 잡고 IaC로 자동화하면 서버리스 백엔드는 “만들고 끝”이 아니라 “지속 운영 가능한 시스템”이 됩니다.

14. FAQ

Q1. 콜드스타트가 걱정됩니다. 어떻게 줄일 수 있나요?

A1. Node/Python 런타임 사용, 의존성 번들 최소화, VPC 미연결 또는 ENI 재사용 튜닝, 프로비저닝 동시성을 핫 경로에 한정 적용하세요.

Q2. RDBMS가 필요한데 Lambda와 궁합이 괜찮나요?

A2. Aurora Serverless v2 + Data API 또는 RDS Proxy가 권장됩니다. 커넥션 풀 문제를 완화하고 멀티 동시성에 안전합니다.

Q3. 비용이 예측 가능할까요?

A3. 요청 수·실행 시간·메모리 크기 조합으로 결정됩니다. 피크가 드문 워크로드일수록 온디맨드 과금의 장점이 커지며, 지연을 줄이면 총 실행 시간도 줄어 비용이 함께 내려갑니다.

반응형