AWS Lambda 사용방법 정리
Posted by Albert 67Day 9Hour 5Min 12Sec ago [2025-12-01]
AWS Lambda는 서버를 프로비저닝하거나 관리하지 않고도 코드를 실행할 수 있는 서버리스 컴퓨팅 서비스입니다. 이벤트에 응답하여 코드가 자동으로 실행되고, 사용한 컴퓨팅 시간에 대해서만 비용을 지불합니다.
1. Lambda 기본 개념
Lambda 함수는 다음과 같은 구성요소로 이루어집니다:
- 핸들러(Handler): Lambda가 실행할 메서드
- 런타임(Runtime): Python, Node.js, Java, Go 등 실행 환경
- 트리거(Trigger): Lambda를 실행시키는 이벤트 소스
- 실행 역할(Execution Role): Lambda가 AWS 리소스에 접근할 수 있는 권한
2. Lambda 함수 생성 방법
2-1. AWS 콘솔에서 생성
AWS Lambda 콘솔로 이동 -> "함수 생성" 클릭 -> "새로 작성" 선택 -> 함수 이름, 런타임 선택 -> 실행 역할 설정 -> "함수 생성" 클릭
2-2. AWS CLI로 생성
aws lambda create-function \ --function-name my-function \ --runtime python3.11 \ --role arn:aws:iam::123456789012:role/lambda-role \ --handler lambda_function.lambda_handler \ --zip-file fileb://function.zip
3. 주요 트리거 유형
- API Gateway: REST API 엔드포인트
- S3: 파일 업로드/삭제 이벤트
- DynamoDB: 데이터베이스 변경 스트림
- EventBridge: 스케줄링 또는 이벤트 기반
- SQS/SNS: 메시지 큐/알림
4. 환경 변수 및 설정
Lambda 함수에서 환경 변수를 사용하여 설정값을 관리할 수 있습니다. 메모리(128MB~10GB), 타임아웃(최대 15분), 동시 실행 제한 등을 설정할 수 있습니다.
5. 모니터링 및 로깅
CloudWatch Logs에 자동으로 로그가 저장되며, CloudWatch Metrics를 통해 성능을 모니터링할 수 있습니다.
' =============================================================================
' 1. SAM (Serverless Application Model) 템플릿
' =============================================================================
' template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Lambda 애플리케이션 예제
Globals:
Function:
Timeout: 30
MemorySize: 512
Runtime: python3.11
Environment:
Variables:
STAGE: prod
LOG_LEVEL: INFO
Resources:
' API Gateway + Lambda
ApiFunction:
Type: AWS::Serverless::Function
Properties:
FunctionName: api-handler
CodeUri: src/api/
Handler: app.lambda_handler
Events:
GetUsers:
Type: Api
Properties:
Path: /users
Method: GET
CreateUser:
Type: Api
Properties:
Path: /users
Method: POST
Policies:
- DynamoDBCrudPolicy:
TableName: !Ref UsersTable
' S3 트리거 Lambda
ImageProcessorFunction:
Type: AWS::Serverless::Function
Properties:
FunctionName: image-processor
CodeUri: src/processor/
Handler: processor.lambda_handler
Timeout: 60
MemorySize: 1024
Events:
S3Event:
Type: S3
Properties:
Bucket: !Ref ImageBucket
Events: s3:ObjectCreated:*
Filter:
S3Key:
Rules:
- Name: suffix
Value: .jpg
Policies:
- S3CrudPolicy:
BucketName: !Ref ImageBucket
' EventBridge 스케줄 Lambda
ScheduledFunction:
Type: AWS::Serverless::Function
Properties:
FunctionName: daily-backup
CodeUri: src/backup/
Handler: backup.lambda_handler
Events:
DailySchedule:
Type: Schedule
Properties:
Schedule: cron(0 0 * * ? *)
Description: 매일 자정 실행
Policies:
- S3CrudPolicy:
BucketName: !Ref BackupBucket
' DynamoDB 테이블
UsersTable:
Type: AWS::DynamoDB::Table
Properties:
TableName: Users
BillingMode: PAY_PER_REQUEST
AttributeDefinitions:
- AttributeName: userId
AttributeType: S
KeySchema:
- AttributeName: userId
KeyType: HASH
' S3 버킷
ImageBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Sub ${AWS::StackName}-images
BackupBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Sub ${AWS::StackName}-backups
Outputs:
ApiUrl:
Description: API Gateway 엔드포인트
Value: !Sub https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/
---
' =============================================================================
' 2. Serverless Framework 설정
' =============================================================================
' serverless.yml
service: my-lambda-service
provider:
name: aws
runtime: python3.11
region: ap-northeast-2
stage: ${opt:stage, 'dev'}
memorySize: 512
timeout: 30
environment:
STAGE: ${self:provider.stage}
USERS_TABLE: ${self:custom.usersTable}
iam:
role:
statements:
- Effect: Allow
Action:
- dynamodb:Query
- dynamodb:Scan
- dynamodb:GetItem
- dynamodb:PutItem
- dynamodb:UpdateItem
- dynamodb:DeleteItem
Resource:
- !GetAtt UsersTable.Arn
custom:
usersTable: users-${self:provider.stage}
functions:
' HTTP API 함수
api:
handler: handlers/api.handler
events:
- httpApi:
path: /users
method: GET
- httpApi:
path: /users
method: POST
- httpApi:
path: /users/{id}
method: GET
' S3 이벤트 함수
processImage:
handler: handlers/processor.handler
events:
- s3:
bucket: ${self:service}-images-${self:provider.stage}
event: s3:ObjectCreated:*
rules:
- suffix: .jpg
' SQS 함수
processQueue:
handler: handlers/queue.handler
events:
- sqs:
arn: !GetAtt EmailQueue.Arn
batchSize: 10
' EventBridge 스케줄
dailyTask:
handler: handlers/scheduled.handler
events:
- schedule:
rate: cron(0 0 * * ? *)
enabled: true
resources:
Resources:
UsersTable:
Type: AWS::DynamoDB::Table
Properties:
TableName: ${self:custom.usersTable}
BillingMode: PAY_PER_REQUEST
AttributeDefinitions:
- AttributeName: userId
AttributeType: S
KeySchema:
- AttributeName: userId
KeyType: HASH
EmailQueue:
Type: AWS::SQS::Queue
Properties:
QueueName: ${self:service}-email-queue-${self:provider.stage}
VisibilityTimeout: 300
plugins:
- serverless-python-requirements
- serverless-offline
---
' =============================================================================
' 3. requirements.txt (Python 의존성)
' =============================================================================
boto3==1.28.0
requests==2.31.0
Pillow==10.0.0
python-dateutil==2.8.2
pydantic==2.0.0
---
' =============================================================================
' 4. Docker를 사용한 로컬 테스트
' =============================================================================
' docker-compose.yml
version: '3.8'
services:
lambda:
image: public.ecr.aws/lambda/python:3.11
volumes:
- ./src:/var/task
environment:
- AWS_ACCESS_KEY_ID=test
- AWS_SECRET_ACCESS_KEY=test
- AWS_DEFAULT_REGION=ap-northeast-2
ports:
- "9000:8080"
command: app.lambda_handler
dynamodb-local:
image: amazon/dynamodb-local
ports:
- "8000:8000"
command: -jar DynamoDBLocal.jar -sharedDb -inMemory
---
' =============================================================================
' 5. GitHub Actions CI/CD 파이프라인
' =============================================================================
' .github/workflows/deploy.yml
name: Deploy Lambda Functions
on:
push:
branches:
- main
- develop
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install dependencies
run: |
pip install -r requirements.txt
pip install pytest pytest-cov
- name: Run tests
run: |
pytest tests/ --cov=src
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v2
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-2
- name: Install SAM CLI
run: |
pip install aws-sam-cli
- name: Build and Deploy
run: |
sam build
sam deploy --no-confirm-changeset --no-fail-on-empty-changeset
---
' =============================================================================
' 6. Makefile (편리한 명령어)
' =============================================================================
.PHONY: install test build deploy clean
install:
pip install -r requirements.txt
pip install -r requirements-dev.txt
test:
pytest tests/ -v --cov=src --cov-report=html
build:
sam build
deploy-dev:
sam deploy --config-env dev
deploy-prod:
sam deploy --config-env prod
local-api:
sam local start-api
local-invoke:
sam local invoke ApiFunction --event events/api-event.json
logs:
sam logs -n ApiFunction --tail
clean:
rm -rf .aws-sam
find . -type d -name __pycache__ -exec rm -rf {} +
find . -type f -name "*.pyc" -delete
package:
zip -r function.zip src/ -x "*.pyc" -x "*__pycache__*"
---
' =============================================================================
' 7. 환경별 설정 파일
' =============================================================================
' samconfig.toml
version = 0.1
[dev.deploy.parameters]
stack_name = "my-lambda-dev"
region = "ap-northeast-2"
capabilities = "CAPABILITY_IAM"
parameter_overrides = "Stage=dev"
[prod.deploy.parameters]
stack_name = "my-lambda-prod"
region = "ap-northeast-2"
capabilities = "CAPABILITY_IAM"
parameter_overrides = "Stage=prod"
---
' =============================================================================
' 8. Lambda Layer 생성 스크립트
' =============================================================================
' create-layer.sh
'!/bin/bash
' Python 패키지를 Lambda Layer로 패키징
LAYER_NAME="common-libs"
PYTHON_VERSION="3.11"
' 디렉토리 생성
mkdir -p layer/python/lib/python${PYTHON_VERSION}/site-packages
' 의존성 설치
pip install -r requirements.txt -t layer/python/lib/python${PYTHON_VERSION}/site-packages
' 압축
cd layer
zip -r ../${LAYER_NAME}.zip .
cd ..
' Layer 게시
aws lambda publish-layer-version \
--layer-name ${LAYER_NAME} \
--description "Common libraries for Lambda functions" \
--zip-file fileb://${LAYER_NAME}.zip \
--compatible-runtimes python${PYTHON_VERSION}
' 정리
rm -rf layer ${LAYER_NAME}.zip
---
' =============================================================================
' 9. CloudWatch Alarms 설정
' =============================================================================
' alarms.yaml
Resources:
LambdaErrorAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmName: !Sub ${FunctionName}-errors
AlarmDescription: Lambda 함수 에러 알림
MetricName: Errors
Namespace: AWS/Lambda
Statistic: Sum
Period: 300
EvaluationPeriods: 1
Threshold: 5
ComparisonOperator: GreaterThanThreshold
Dimensions:
- Name: FunctionName
Value: !Ref ApiFunction
AlarmActions:
- !Ref SNSTopic
LambdaThrottleAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmName: !Sub ${FunctionName}-throttles
AlarmDescription: Lambda 함수 쓰로틀링 알림
MetricName: Throttles
Namespace: AWS/Lambda
Statistic: Sum
Period: 300
EvaluationPeriods: 1
Threshold: 10
ComparisonOperator: GreaterThanThreshold
Dimensions:
- Name: FunctionName
Value: !Ref ApiFunction
SNSTopic:
Type: AWS::SNS::Topic
Properties:
TopicName: lambda-alarms
Subscription:
- Endpoint: admin@example.com
Protocol: email
주요 배포 및 관리 팁
배포 명령어
SAM 사용:
' 빌드 sam build ' 로컬 테스트 sam local invoke FunctionName --event event.json sam local start-api ' 배포 sam deploy --guided
Serverless Framework 사용:
' 배포 serverless deploy ' 특정 함수만 배포 serverless deploy function -f functionName ' 로그 확인 serverless logs -f functionName -t
성능 최적화 팁
- 콜드 스타트 최소화: 메모리를 충분히 할당하면 CPU도 증가하여 초기화 시간 단축
- 연결 재사용: 전역 변수에 DB 연결 등을 선언하여 재사용
- Layer 활용: 공통 라이브러리를 Layer로 분리하여 배포 패키지 크기 감소
- 프로비저닝된 동시성: 중요한 함수에는 프로비저닝된 동시성 설정
비용 절감 팁
- 적절한 메모리 설정: CloudWatch Insights로 실제 사용량 분석 후 조정
- 타임아웃 최적화: 필요한 만큼만 설정
- Reserved Concurrency: 예상치 못한 비용 발생 방지
- Step Functions 활용: 장시간 실행 워크플로우는 Step Functions로 분리