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

성능 최적화 팁

  1. 콜드 스타트 최소화: 메모리를 충분히 할당하면 CPU도 증가하여 초기화 시간 단축
  2. 연결 재사용: 전역 변수에 DB 연결 등을 선언하여 재사용
  3. Layer 활용: 공통 라이브러리를 Layer로 분리하여 배포 패키지 크기 감소
  4. 프로비저닝된 동시성: 중요한 함수에는 프로비저닝된 동시성 설정

비용 절감 팁

  1. 적절한 메모리 설정: CloudWatch Insights로 실제 사용량 분석 후 조정
  2. 타임아웃 최적화: 필요한 만큼만 설정
  3. Reserved Concurrency: 예상치 못한 비용 발생 방지
  4. Step Functions 활용: 장시간 실행 워크플로우는 Step Functions로 분리



LIST

Copyright © 2014 visionboy.me All Right Reserved.