AWS Lambda
- 서버를 직접 관리하지 않고도 코드를 실행할 수 있는 서버리스(Serverless) 컴퓨팅 서비스서버를 - 만들지 않아도 코드를 실행할 수 있고,
- 요청이 들어올 때만 실행되며,
- 사용한 만큼만 비용을 내는 구조예요.
동작 구조
- 이벤트 기반 구조
[이벤트 발생] → [Lambda 함수 실행] → [결과 반환]
- ex
- S3 버킷에 파일이 업로드됨 → Lambda가 자동 실행되어 이미지 리사이즈 수행
- API Gateway로 HTTP 요청이 들어옴 → Lambda가 백엔드 코드 실행 후 응답
- CloudWatch 이벤트 → Lambda로 스케줄링 작업 수행
- DynamoDB 데이터 변경 → Lambda로 후속 처리
장단점
| 구분 | 장점 | 단점 |
|---|
| 운영 측면 | 서버 관리 불필요 (No EC2, No Maintenance) | 컨테이너 기반이므로 OS 제어 불가 |
| 비용 측면 | 실행한 만큼만 과금 (저비용) | 고빈도 트래픽 시 EC2보다 비쌀 수 있음 |
| 확장성 | 자동 스케일링 (요청 수만큼 동시 실행) | Cold Start(첫 실행 지연) 발생 가능 |
| 개발 측면 | 빠른 배포, 함수 단위로 관리 | 실행 제한: 15분, 10GB 메모리 등 한계 존재 |
실행 순서 예시 (API 호출 시)
- 사용자가 API Gateway로 HTTP 요청 전송
- API Gateway가 Lambda 함수를 트리거
- Lambda 함수가 코드를 실행 (예: DB 조회, 로직 처리 등)
- 결과를 API Gateway → 사용자에게 반환
- 백엔드 서버처럼 동작하지만 서버 인스턴스가 없음
구조 예시
def lambda_handler(event, context):
name = event.get("name", "Guest")
return {
"statusCode": 200,
"body": f"Hello, {name}!"
}
- event: 트리거(요청)의 데이터
- context: 실행 환경 정보 (함수 이름, 메모리, 타임아웃 등)
- return: JSON 형식의 응답 반환
주요 트리거(Trigger)
| 트리거 | 설명 |
|---|
| Amazon S3 | 파일 업로드/삭제 시 Lambda 실행 |
| Amazon API Gateway | HTTP 요청 시 Lambda 실행 |
| Amazon DynamoDB Streams | 데이터 변경 시 Lambda 실행 |
| Amazon CloudWatch Events / Schedule | 특정 시간대(스케줄) 실행 |
| AWS SNS / SQS | 메시지 수신 시 Lambda 실행 |
| AWS EventBridge | 이벤트 중심 애플리케이션 연결 |
Lambda의 사용 예시
| 분야 | 예시 |
|---|
| 이미지 처리 | S3 업로드 시 자동으로 썸네일 생성 |
| 데이터 파이프라인 | DynamoDB → Lambda → RDS 데이터 이관 |
| API 서버 대체 | API Gateway + Lambda로 백엔드 구성 |
| 로그 처리 / 알림 | CloudWatch 로그 분석 후 Slack 알림 |
| 크론잡(스케줄러) | 매일 0시에 백업, 리포트 전송 등 자동 실행 |
Lambda Layer (공유 라이브러리)
- 여러 Lambda 함수에서 공통으로 사용하는 라이브러리나
- 코드(예: requests, boto3)를 Layer로 분리하여 재사용 가능
- 예: requests 라이브러리를 zip으로 만들어 Layer에 업로드 후 각 Lambda에서 import
boto3
- AWS(Amazon Web Services)를 파이썬 코드로 제어할 수 있게 해주는 공식 SDK
- 즉, 터미널이나 AWS 콘솔에서 하는 일을 Python 코드로 자동화할 수 있게 해줌
역할
- boto3는 AWS의 각 서비스와 연결해서 다음과 같은 작업을 수행 가능
- S3 (저장소)
- EC2 (서버)
- RDS (데이터베이스)
- IAM (권한관리)
- Lambda
- CloudWatch
기능
S3 파일 업로드 / 다운로드
import boto3
s3 = boto3.client('s3')
s3.upload_file('local.txt', 'mybucket', 'remote.txt')
s3.download_file('mybucket', 'remote.txt', 'downloaded.txt')
Resource vs Client 차이
| 구분 | 설명 | 예시 |
|---|
| client | 저수준 API, AWS SDK 문서 그대로 | s3.list_buckets(), ec2.start_instances() |
| resource | 객체지향 스타일, 좀 더 Pythonic | s3.Bucket('mybucket').objects.all() |
Elastic Beanstalk
- AWS에서 웹 애플리케이션을 손쉽게 배포하고 운영하기 위한 서비스
- 즉, Elastic Beanstalk는
- 서버를 직접 EC2로 띄우기
- 보안 그룹 설정하기
- 로드 밸런서 붙이기
- Auto Scaling 설정하기
- RDS 연결
- 이런걸 일일이 수동으로 하지 않아도 됨 ,Elastic Beanstalk는 이런걸 자동으로 해줌
핵심 개념
| 구성요소 | 역할 | 설명 |
|---|
| Application | 애플리케이션 전체 묶음 | FastAPI나 Flask 같은 프로젝트 단위 |
| Environment | 실행 환경 | "개발용", "운영용" 같은 환경 구분 |
| Platform | 런타임 종류 | Python, Node.js, Java, Go, Docker 등 |
동작원리(간단)
- 로컬 코드 준비
- app.py, requirements.txt, Procfile
- 코드 업로드
- AWS 콘솔에서 ZIP 업로드 or eb cli로 배포
- eb init : 환경 설정(지역, 플랫폼 선택)
- eb create : 새 환경 생성
- eb deploy : 코드 배포
- 이렇게하면 Elastic Beanstalk이 알아서 함
- EC2 인스턴스 생성
- Load Balancer 연결
- Auto Scaling 설정
- CloudWatch 로그 연결
- 배포 상태 관리
- 결과
구조 이해
[Your Code]
↓
Elastic Beanstalk
↓
┌──────────────────────┐
│ EC2 인스턴스 │ ← 실제 서버
│ Load Balancer │ ← 트래픽 분산
│ Auto Scaling Group │ ← 부하 대응
│ CloudWatch │ ← 모니터링
└──────────────────────┘
RDS 연결도 가능
- Beanstalk은 RDS(PostgreSQL/MySQL 등)를 함께 띄우거나 이미 만든 RDS를 연결도 가능
- settings.py나 .env에 DATABASE_URL을 Beanstalk 환경변수로 등록하면 자동으로 연결