본문 바로가기
Amazon AWS/Lambda

도커 컨테이너 이미지로 Lambda 함수 배포

by 홍띠 2023. 10. 15.

Lambda에서 컨테이너 이미지를 사용하는 방법에는 세가지가 있으며, Python을 기준으로 설명한다.

  • Lambda용 AWS 기본 이미지 사용
    • 언어 runtime 지정됨
    • 운영체제: Amazon Linux 2(Python 3.8 ~), Amazon Linux(Python 3.7)
    • 런타임 인터페이스 클라이언트/에뮬레이터 포함
  • 사용자 지정 런타임용 AWS 기본 이미지 사용
    • 사용자가 runtime 설정
    • 운영체제: Amazon Linux 또는 Amazon Linux 2
    • 런타임 인터페이스 에뮬레이터 포함
    • Lambda 호환을 위해 런타임 인터페이스 클라이언트를 포함 시켜야함
  • AWS 이미지가 아닌 별개 이미지 사용
    • 런타임, 운영체제 모두 사용자 지정
    • 로컬 테스트를 하려면 런타임 인터페이스 에뮬레이터를 포함 시켜야함 (선택)
    • Lambda 호환을 위해 런타임 인터페이스 클라이언트를 포함 시켜야함 (필수)
  •  

위의 세가지 방법 중, 런타임과 운영체제를 모두 자유롭게 지정할 수 있는 3번째 방법으로 진행하려고 한다.

AWS 이미지가 아닌 도커 이미지를 사용해서 Lambda 함수 배포

💡 Prerequisites
- AWS CLI ver2, Docker, Python 설치
- 이미지를 올릴 ECR 레포지토리

이미지 빌드

  • 프로젝트 디렉토리 생성
mkdir test-lambda 
cd test-lambda
  • 실행 코드 작성 - lambda_function.py
import sys
def handler(event, context):
    return 'Hello from AWS Lambda using Python' + sys.version + '!'
  • (optional)requirements.txt 작성
boto3==1.28.55
  • Dockerfile 작성
# Use a slim version of the base Python image to reduce the final image size
FROM python:3.11-slim

# Define custom function directory
ARG FUNCTION_DIR="/function"

RUN mkdir -p ${FUNCTION_DIR}
COPY . ${FUNCTION_DIR}

# Set working directory to function root directory
WORKDIR ${FUNCTION_DIR}

# Install the runtime interface client
RUN pip install awslambdaric

# Install requirements.txt
RUN pip install -r requirements.txt

# Set runtime interface client as default command for the container runtime
ENTRYPOINT [ "/usr/local/bin/python", "-m", "awslambdaric" ]
# entrypoint 실행시 argument로써 전달
CMD [ "lambda_function.handler" ]
  • 이미지 빌드
docker build --platform linux/amd64 -t docker-image:test .

ECR 레포지토리에 이미지 push

  • ECR 로그인
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 111122223333.dkr.ecr.ap-northeast-2.amazonaws.com
  • 이미지 푸시
docker tag docker-image:test 111122223333.dkr.ecr.ap-northeast-2.amazonaws.com/<repository name>:test docker push 111122223333.dkr.ecr.ap-northeast-2.amazonaws.com/<repository name>:test

Lambda 함수 생성

aws lambda create-function \
  --function-name test-lambda \
  --package-type Image \
  --code ImageUri=111122223333.dkr.ecr.us-east-1.amazonaws.com/<repository name>:test \
  --role arn:aws:iam::111122223333:role/lambda-excution-role
  • 람다실행
aws lambda invoke --function-name test-lambda response.json

# response.json
{
  "ExecutedVersion": "$LATEST", 
  "StatusCode": 200
}

 

참고: https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/python-image.html#python-image-instructions