Python Lambda 함수를 컨테이너 이미지로 배포하기
Python Lambda 함수를 컨테이너 이미지로 배포하기 (Deploy Python Lambda functions with container images)
Python Lambda 함수용 컨테이너 이미지를 만드는 방법은 세 가지가 있어요.
- AWS 기본 이미지(AWS base image) 사용 — AWS 기본 이미지에는 언어 런타임, Lambda와 함수 코드 사이의 상호작용을 관리하는 런타임 인터페이스 클라이언트(runtime interface client), 로컬 테스트용 런타임 인터페이스 에뮬레이터(runtime interface emulator)가 미리 로드돼 있어요.
- AWS OS-only 기본 이미지 사용 — AWS OS-only 기본 이미지에는 Amazon Linux 배포판과 런타임 인터페이스 에뮬레이터가 들어 있어요. 이 이미지는 Go나 Rust 같은 컴파일 언어, 그리고 Lambda가 기본 이미지를 제공하지 않는 언어·버전(예: Node.js 19)의 컨테이너 이미지에 주로 쓰여요. OS-only 기본 이미지로 커스텀 런타임을 구현할 수도 있어요. 이미지를 Lambda와 호환되게 하려면 Python용 런타임 인터페이스 클라이언트를 이미지에 포함해야 해요.
- 비-AWS 기본 이미지 사용 — Alpine Linux나 Debian 같은 다른 컨테이너 레지스트리의 대체 기본 이미지를 쓸 수 있어요. 조직이 만든 커스텀 이미지도 사용 가능해요. 이미지를 Lambda와 호환되게 하려면 Python용 런타임 인터페이스 클라이언트를 이미지에 포함해야 해요.
팁 Lambda 컨테이너 함수가 활성화되는 시간을 줄이려면 Docker 문서의 다단계 빌드(multi-stage builds) 사용하기를 참고하세요. 효율적인 컨테이너 이미지를 만들려면 Dockerfile 작성 모범 사례를 따르세요.
이 페이지에서는 Lambda용 컨테이너 이미지를 빌드·테스트·배포하는 방법을 설명해요.
Topics
- Python용 AWS 기본 이미지
- Python용 AWS 기본 이미지 사용하기
- 런타임 인터페이스 클라이언트와 함께 대체 기본 이미지 사용하기
본문
Python용 AWS 기본 이미지
AWS는 Python용 기본 이미지를 다음과 같이 제공해요.
| 태그(Tags) | 런타임 | 운영체제 | Dockerfile | 폐기 예정(Deprecation) |
|---|---|---|---|---|
| 3.15 | Python 3.15 | Amazon Linux 2023 | GitHub의 Python 3.15용 Dockerfile | 예정 없음 |
| 3.14 | Python 3.14 | Amazon Linux 2023 | GitHub의 Python 3.14용 Dockerfile | 2029년 6월 30일 |
| 3.13 | Python 3.13 | Amazon Linux 2023 | GitHub의 Python 3.13용 Dockerfile | 2029년 6월 30일 |
| 3.12 | Python 3.12 | Amazon Linux 2023 | GitHub의 Python 3.12용 Dockerfile | 2028년 10월 31일 |
| 3.11 | Python 3.11 | Amazon Linux 2 | GitHub의 Python 3.11용 Dockerfile | 2027년 6월 30일 |
| 3.10 | Python 3.10 | Amazon Linux 2 | GitHub의 Python 3.10용 Dockerfile | 2026년 10월 31일 |
Amazon ECR 저장소: gallery.ecr.aws/lambda/python
Python 3.12 이상 기본 이미지는 Amazon Linux 2023 최소 컨테이너 이미지를 기반으로 해요. Python 3.8~3.11 기본 이미지는 Amazon Linux 2 이미지를 기반으로 하죠. AL2023 기반 이미지는 Amazon Linux 2에 비해 배포 공간이 더 작고 glibc 같은 라이브러리의 업데이트된 버전을 제공하는 등 여러 장점이 있어요.
AL2023 기반 이미지는 Amazon Linux 2의 기본 패키지 매니저인 yum 대신 microdnf(dnf로 심볼릭 링크됨)를 패키지 매니저로 사용해요. microdnf는 dnf의 독립형 구현이에요. AL2023 기반 이미지에 포함된 패키지 목록은 Amazon Linux 2023 Container Images에 설치된 패키지 비교의 Minimal Container 열을 참고하세요. AL2023와 Amazon Linux 2의 차이에 대한 자세한 내용은 AWS Compute Blog의 Introducing the Amazon Linux 2023 runtime for AWS Lambda를 참고하세요.
참고 AL2023 기반 이미지(AWS SAM 포함)를 로컬에서 실행하려면 Docker 20.10.10 이상을 사용해야 해요.
기본 이미지의 의존성 검색 경로
코드에서 import 문을 쓰면 Python 런타임이 검색 경로의 디렉터리를 모듈이나 패키지를 찾을 때까지 검색해요. 기본적으로 런타임은 {LAMBDA_TASK_ROOT} 디렉터리를 먼저 검색해요. 이미지에 런타임 포함 라이브러리 버전을 포함했다면, 그 버전이 런타임에 포함된 버전보다 우선해요.
검색 경로의 다른 단계는 사용 중인 Lambda Python 기본 이미지 버전에 따라 달라져요.
- Python 3.11 이상 — 런타임 포함 라이브러리와 pip 설치 라이브러리가
/var/lang/lib/python3.11/site-packages디렉터리에 설치돼요. 이 디렉터리는 검색 경로에서/var/runtime보다 우선해요. pip로 더 새 버전의 SDK를 설치해 SDK를 덮어쓸 수 있어요. pip로 런타임 포함 SDK와 그 의존성이 설치하려는 패키지와 호환되는지 확인할 수 있어요. - Python 3.8~3.10 — 런타임 포함 라이브러리는
/var/runtime디렉터리에 설치돼요. pip 설치 라이브러리는/var/lang/lib/python3.x/site-packages디렉터리에 설치되죠. 검색 경로에서/var/runtime디렉터리가/var/lang/lib/python3.x/site-packages보다 우선해요.
다음 코드 조각을 추가하면 Lambda 함수의 전체 검색 경로를 볼 수 있어요.
import sys
search_path = sys.path
print(search_path)
Python용 AWS 기본 이미지 사용하기
이 섹션의 단계를 완료하려면 다음이 필요해요.
- AWS CLI version 2
- Docker(최소 25.0.0)
- Docker buildx 플러그인
- Python
AWS 기본 이미지에서 컨테이너 이미지 만들기
- 프로젝트용 디렉터리를 만들고 그 디렉터리로 이동해요.
mkdir example
cd example
lambda_function.py라는 새 파일을 만들어요. 테스트용으로 다음 샘플 함수 코드를 파일에 추가하거나 여러분 코드를 사용해도 돼요.
import sys
def handler(event, context):
return 'Hello from AWS Lambda using Python' + sys.version + '!'
requirements.txt라는 새 파일을 만들어요. 이전 단계의 샘플 함수 코드를 쓴다면 의존성이 없으므로 파일을 비워 두면 돼요. 그 외에는 필요한 각 라이브러리를 나열해요. 예를 들어 함수가 AWS SDK for Python(Boto3)을 쓴다면requirements.txt는 이렇게 생겼어요.
boto3
- 다음 구성을 가진 새 Dockerfile을 만들어요.
FROM속성을 기본 이미지의 URI로 설정하고,COPY명령으로 함수 코드와 런타임 의존성을 Lambda가 정의한 환경 변수인{LAMBDA_TASK_ROOT}로 복사하며,CMD인자를 Lambda 함수 핸들러로 설정해요. 예시 Dockerfile에는 USER 지시문이 없어요. 컨테이너 이미지를 Lambda에 배포하면 Lambda가 자동으로 최소 권한(least-privileged)의 기본 Linux 사용자를 정의해요.USER지시문이 없으면root사용자로 기본 설정되는 표준 Docker 동작과는 달라요.
FROM public.ecr.aws/lambda/python:3.12
# Copy requirements.txt
COPY requirements.txt ${LAMBDA_TASK_ROOT}
# Install the specified packages
RUN pip install -r requirements.txt
# Copy function code
COPY lambda_function.py ${LAMBDA_TASK_ROOT}
# Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile)
CMD [ "lambda_function.handler" ]
- docker build 명령으로 Docker 이미지를 빌드해요. 다음 예시는 이미지 이름을
docker-image로, 태그를test로 지정해요. 이미지를 Lambda와 호환되게 하려면--provenance=false옵션을 사용해야 해요.
docker buildx build --platform linux/amd64 --provenance=false -t docker-image:test .
참고 명령의
--platform linux/amd64옵션은 빌드 머신의 아키텍처와 무관하게 컨테이너가 Lambda 실행 환경과 호환되도록 보장해요. ARM64 명령어 집합 아키텍처의 Lambda 함수를 만들려면 명령을--platform linux/arm64옵션으로 바꿔야 해요.
- docker run 명령으로 Docker 이미지를 시작해요. 이 예시에서
docker-image는 이미지 이름이고test는 태그예요.
docker run --platform linux/amd64 -p 9000:8080 docker-image:test
이 명령은 이미지를 컨테이너로 실행하고 localhost:9000/2015-03-31/functions/function/invocations에 로컬 엔드포인트를 만들어요.
참고 ARM64 명령어 집합 아키텍처로 Docker 이미지를 빌드했다면
--platform linux/amd64대신--platform linux/arm64`` 옵션을 사용해야 해요.
- 새 터미널 창에서 로컬 엔드포인트에 이벤트를 게시해요.
Linux/macOS — 다음 curl 명령을 실행해요.
curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'
이 명령은 빈 이벤트로 함수를 호출하고 응답을 반환해요. 샘플 함수 코드 대신 여러분 코드를 쓴다면 JSON 페이로드로 함수를 호출하고 싶을 수도 있어요. 예시:
curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"payload":"hello world!"}'
PowerShell — 다음 Invoke-WebRequest 명령을 실행해요.
Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{}' -ContentType "application/json"
이 명령은 빈 이벤트로 함수를 호출하고 응답을 반환해요. 샘플 함수 코드 대신 여러분 코드를 쓴다면 JSON 페이로드로 함수를 호출하고 싶을 수도 있어요. 예시:
Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{"payload":"hello world!"}' -ContentType "application/json"
- 컨테이너 ID를 가져와요.
docker ps
- docker kill 명령으로 컨테이너를 중지해요. 이 명령에서
3766c4ab331c를 이전 단계의 컨테이너 ID로 바꿔요.
docker kill 3766c4ab331c
이미지를 Amazon ECR에 업로드하고 Lambda 함수 만들기
- get-login-password 명령으로 Docker CLI를 Amazon ECR 레지스트리에 인증해요.
--region값은 Amazon ECR 저장소를 만들 AWS 리전으로 설정하고,111122223333를 AWS 계정 ID로 바꿔요.
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 111122223333.dkr.ecr.us-east-1.amazonaws.com
- create-repository 명령으로 Amazon ECR에 저장소를 만들어요.
aws ecr create-repository --repository-name hello-world --region us-east-1 --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
참고 Amazon ECR 저장소는 Lambda 함수와 같은 AWS 리전에 있어야 해요. 성공하면 다음과 같은 응답이 보여요.
{
"repository": {
"repositoryArn": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world",
"registryId": "111122223333",
"repositoryName": "hello-world",
"repositoryUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world",
"createdAt": "2023-03-09T10:39:01+00:00",
"imageTagMutability": "MUTABLE",
"imageScanningConfiguration": {
"scanOnPush": true
},
"encryptionConfiguration": {
"encryptionType": "AES256"
}
}
}
- 이전 단계 출력에서
repositoryUri를 복사해요. - docker tag 명령으로 로컬 이미지를 Amazon ECR 저장소에 최신 버전으로 태그해요. 이 명령에서
docker-image:test는 Docker 이미지의 이름과 태그예요.docker build명령에서 지정한 이미지 이름과 태그죠.<ECRrepositoryUri>를 복사한repositoryUri로 바꾸고 URI 끝에:latest를 꼭 포함하세요.
docker tag docker-image:test <ECRrepositoryUri>:latest
예시:
docker tag docker-image:test 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
- docker push 명령으로 로컬 이미지를 Amazon ECR 저장소에 배포해요. 저장소 URI 끝에
:latest를 꼭 포함하세요.
docker push 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
- 아직 없다면 함수용 실행 역할을 만들어요. 다음 단계에서 역할의 Amazon Resource Name(ARN)이 필요해요.
- Lambda 함수를 만들어요.
ImageUri에는 앞서 가져온 저장소 URI를 지정해요. URI 끝에:latest를 꼭 포함하세요.
aws lambda create-function \
--function-name hello-world \
--package-type Image \
--code ImageUri=111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \
--role arn:aws:iam::111122223333:role/lambda-ex
참고 이미지가 Lambda 함수와 같은 리전에 있다면 다른 AWS 계정의 이미지로도 함수를 만들 수 있어요. 자세한 내용은 Amazon ECR 크로스 계정 권한을 참고하세요.
- 함수를 호출해요.
aws lambda invoke --function-name hello-world response.json
다음과 같은 응답이 보여요.
{
"ExecutedVersion": "$LATEST",
"StatusCode": 200
}
- 함수의 출력을 보려면
response.json파일을 확인해요.
함수 코드를 업데이트하려면 이미지를 다시 빌드하고, 새 이미지를 Amazon ECR 저장소에 업로드한 다음, update-function-code 명령으로 이미지를 Lambda 함수에 배포해야 해요.
Lambda는 이미지 태그를 특정 이미지 다이제스트(digest)로 해석해요. 함수를 배포하는 데 쓰인 이미지 태그를 Amazon ECR의 새 이미지를 가리키게 해도 Lambda는 함수를 새 이미지로 자동 업데이트하지 않아요.
새 이미지를 같은 Lambda 함수에 배포하려면 Amazon ECR의 이미지 태그가 그대로여도 update-function-code 명령을 사용해야 해요. 다음 예시에서 --publish 옵션은 업데이트된 컨테이너 이미지로 함수의 새 버전을 만들어요.
aws lambda update-function-code \
--function-name hello-world \
--image-uri 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \
--publish
런타임 인터페이스 클라이언트와 함께 대체 기본 이미지 사용하기
OS-only 기본 이미지나 대체 기본 이미지를 쓴다면 이미지에 런타임 인터페이스 클라이언트를 포함해야 해요. 런타임 인터페이스 클라이언트는 Lambda와 함수 코드 사이의 상호작용을 관리하는 Runtime API를 확장해요.
pip 패키지 매니저로 Python용 런타임 인터페이스 클라이언트를 설치해요.
pip install awslambdaric
GitHub에서 Python 런타임 인터페이스 클라이언트를 다운로드할 수도 있어요.
다음 예시는 비-AWS 기본 이미지로 Python용 컨테이너 이미지를 만드는 방법을 보여줘요. 예시 Dockerfile은 공식 Python 기본 이미지를 사용하고, Python용 런타임 인터페이스 클라이언트를 포함해요.
이 섹션의 단계를 완료하려면 다음이 필요해요.
- AWS CLI version 2
- Docker(최소 25.0.0)
- Docker buildx 플러그인
- Python
비-AWS 기본 이미지에서 컨테이너 이미지 만들기
- 프로젝트용 디렉터리를 만들고 그 디렉터리로 이동해요.
mkdir example
cd example
lambda_function.py라는 새 파일을 만들어요. 테스트용으로 다음 샘플 함수 코드를 파일에 추가하거나 여러분 코드를 사용해도 돼요.
import sys
def handler(event, context):
return 'Hello from AWS Lambda using Python' + sys.version + '!'
requirements.txt라는 새 파일을 만들어요. 이전 단계의 샘플 함수 코드를 쓴다면 의존성이 없으므로 파일을 비워 두면 돼요. 그 외에는 필요한 각 라이브러리를 나열해요. 예를 들어 함수가 AWS SDK for Python(Boto3)을 쓴다면requirements.txt는 이렇게 생겼어요.
boto3
- 새 Dockerfile을 만들어요. 다음 Dockerfile은 AWS 기본 이미지 대신 공식 Python 기본 이미지를 사용해요. Dockerfile에는 이미지를 Lambda와 호환되게 하는 런타임 인터페이스 클라이언트가 포함돼 있어요. 다음 예시 Dockerfile은 다단계 빌드를 사용해요.
FROM속성을 기본 이미지로 설정하고,ENTRYPOINT를 Docker 컨테이너가 시작할 때 실행할 모듈(이 경우 런타임 인터페이스 클라이언트)로 설정하며,CMD를 Lambda 함수 핸들러로 설정해요. 예시 Dockerfile에는 USER 지시문이 없어요. 컨테이너 이미지를 Lambda에 배포하면 Lambda가 자동으로 최소 권한의 기본 Linux 사용자를 정의해요.USER지시문이 없으면root사용자로 기본 설정되는 표준 Docker 동작과는 달라요.
# Define custom function directory
ARG FUNCTION_DIR="/function"
FROM python:3.12 AS build-image
# Include global arg in this stage of the build
ARG FUNCTION_DIR
# Copy function code
RUN mkdir -p ${FUNCTION_DIR}
COPY . ${FUNCTION_DIR}
# Install the function's dependencies
RUN pip install \
--target ${FUNCTION_DIR} \
awslambdaric
# Use a slim version of the base Python image to reduce the final image size
FROM python:3.12-slim
# Include global arg in this stage of the build
ARG FUNCTION_DIR
# Set working directory to function root directory
WORKDIR ${FUNCTION_DIR}
# Copy in the built dependencies
COPY --from=build-image ${FUNCTION_DIR} ${FUNCTION_DIR}
# Set runtime interface client as default command for the container runtime
ENTRYPOINT [ "/usr/local/bin/python", "-m", "awslambdaric" ]
# Pass the name of the function handler as an argument to the runtime
CMD [ "lambda_function.handler" ]
- docker build 명령으로 Docker 이미지를 빌드해요. 다음 예시는 이미지 이름을
docker-image로, 태그를test로 지정해요. 이미지를 Lambda와 호환되게 하려면--provenance=false옵션을 사용해야 해요.
docker buildx build --platform linux/amd64 --provenance=false -t docker-image:test .
참고 명령의
--platform linux/amd64옵션은 빌드 머신의 아키텍처와 무관하게 컨테이너가 Lambda 실행 환경과 호환되도록 보장해요. ARM64 명령어 집합 아키텍처의 Lambda 함수를 만들려면 명령을--platform linux/arm64옵션으로 바꿔야 해요.
이미지를 로컬로 테스트하려면 런타임 인터페이스 에뮬레이터를 사용해요. 에뮬레이터를 이미지에 빌드하거나, 다음 절차로 로컬 머신에 설치할 수 있어요.
로컬 머신에 런타임 인터페이스 에뮬레이터 설치·실행하기
- 프로젝트 디렉터리에서 다음 명령으로 GitHub에서 런타임 인터페이스 에뮬레이터(x86-64 아키텍처)를 다운로드해 로컬 머신에 설치해요.
Linux/macOS:
mkdir -p ~/.aws-lambda-rie && \
curl -Lo ~/.aws-lambda-rie/aws-lambda-rie https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie && \
chmod +x ~/.aws-lambda-rie/aws-lambda-rie
arm64 에뮬레이터를 설치하려면 이전 명령의 GitHub 저장소 URL을 다음으로 바꿔요.
https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie-arm64
PowerShell:
$dirPath = "$HOME\.aws-lambda-rie"
if (-not (Test-Path $dirPath)) { New-Item -Path $dirPath -ItemType Directory }
$downloadLink = "https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie"
$destinationPath = "$HOME\.aws-lambda-rie\aws-lambda-rie"
Invoke-WebRequest -Uri $downloadLink -OutFile $destinationPath
arm64 에뮬레이터를 설치하려면 $downloadLink를 다음으로 바꿔요.
https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie-arm64
- docker run 명령으로 Docker 이미지를 시작해요. 다음을 주의하세요.
docker-image는 이미지 이름이고test는 태그예요./usr/local/bin/python -m awslambdaric lambda_function.handler는 Dockerfile의CMD뒤에 오는ENTRYPOINT예요.
Linux/macOS:
docker run --platform linux/amd64 -d -v ~/.aws-lambda-rie:/aws-lambda -p 9000:8080 \
--entrypoint /aws-lambda/aws-lambda-rie \
docker-image:test \
/usr/local/bin/python -m awslambdaric lambda_function.handler
PowerShell:
docker run --platform linux/amd64 -d -v "$HOME\.aws-lambda-rie:/aws-lambda" -p 9000:8080 ` --entrypoint /aws-lambda/aws-lambda-rie ` `docker-image:test` ` `/usr/local/bin/python -m awslambdaric lambda_function.handler`
이 명령은 이미지를 컨테이너로 실행하고 localhost:9000/2015-03-31/functions/function/invocations에 로컬 엔드포인트를 만들어요.
참고 ARM64 명령어 집합 아키텍처로 Docker 이미지를 빌드했다면
--platform linux/amd64대신--platform linux/arm64옵션을 사용해야 해요.
- 로컬 엔드포인트에 이벤트를 게시해요.
Linux/macOS — 다음 curl 명령을 실행해요.
curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'
이 명령은 빈 이벤트로 함수를 호출하고 응답을 반환해요. 샘플 함수 코드 대신 여러분 코드를 쓴다면 JSON 페이로드로 함수를 호출하고 싶을 수도 있어요. 예시:
curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"payload":"hello world!"}'
PowerShell — 다음 Invoke-WebRequest 명령을 실행해요.
Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{}' -ContentType "application/json"
이 명령은 빈 이벤트로 함수를 호출하고 응답을 반환해요. 샘플 함수 코드 대신 여러분 코드를 쓴다면 JSON 페이로드로 함수를 호출하고 싶을 수도 있어요. 예시:
Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{"payload":"hello world!"}' -ContentType "application/json"
- 컨테이너 ID를 가져와요.
docker ps
- docker kill 명령으로 컨테이너를 중지해요. 이 명령에서
3766c4ab331c를 이전 단계의 컨테이너 ID로 바꿔요.
docker kill 3766c4ab331c
이미지를 Amazon ECR에 업로드하고 Lambda 함수 만들기
- get-login-password 명령으로 Docker CLI를 Amazon ECR 레지스트리에 인증해요.
--region값은 Amazon ECR 저장소를 만들 AWS 리전으로 설정하고,111122223333를 AWS 계정 ID로 바꿔요.
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 111122223333.dkr.ecr.us-east-1.amazonaws.com
- create-repository 명령으로 Amazon ECR에 저장소를 만들어요.
aws ecr create-repository --repository-name hello-world --region us-east-1 --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
참고 Amazon ECR 저장소는 Lambda 함수와 같은 AWS 리전에 있어야 해요. 성공하면 다음과 같은 응답이 보여요.
{
"repository": {
"repositoryArn": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world",
"registryId": "111122223333",
"repositoryName": "hello-world",
"repositoryUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world",
"createdAt": "2023-03-09T10:39:01+00:00",
"imageTagMutability": "MUTABLE",
"imageScanningConfiguration": {
"scanOnPush": true
},
"encryptionConfiguration": {
"encryptionType": "AES256"
}
}
}
- 이전 단계 출력에서
repositoryUri를 복사해요. - docker tag 명령으로 로컬 이미지를 Amazon ECR 저장소에 최신 버전으로 태그해요.
<ECRrepositoryUri>를 복사한repositoryUri로 바꾸고 URI 끝에:latest를 꼭 포함하세요.
docker tag docker-image:test <ECRrepositoryUri>:latest
예시:
docker tag docker-image:test 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
- docker push 명령으로 로컬 이미지를 Amazon ECR 저장소에 배포해요. 저장소 URI 끝에
:latest를 꼭 포함하세요.
docker push 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
- 아직 없다면 함수용 실행 역할을 만들어요. 다음 단계에서 역할의 ARN이 필요해요.
- Lambda 함수를 만들어요.
ImageUri에는 앞서 가져온 저장소 URI를 지정해요. URI 끝에:latest를 꼭 포함하세요.
aws lambda create-function \
--function-name hello-world \
--package-type Image \
--code ImageUri=111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \
--role arn:aws:iam::111122223333:role/lambda-ex
참고 이미지가 Lambda 함수와 같은 리전에 있다면 다른 AWS 계정의 이미지로도 함수를 만들 수 있어요. 자세한 내용은 Amazon ECR 크로스 계정 권한을 참고하세요.
- 함수를 호출해요.
aws lambda invoke --function-name hello-world response.json
다음과 같은 응답이 보여요.
{
"ExecutedVersion": "$LATEST",
"StatusCode": 200
}
- 함수의 출력을 보려면
response.json파일을 확인해요.
함수 코드를 업데이트하려면 이미지를 다시 빌드하고, 새 이미지를 Amazon ECR 저장소에 업로드한 다음, update-function-code 명령으로 이미지를 Lambda 함수에 배포해야 해요.
Lambda는 이미지 태그를 특정 이미지 다이제스트로 해석해요. 함수를 배포하는 데 쓰인 이미지 태그를 Amazon ECR의 새 이미지를 가리키게 해도 Lambda는 함수를 새 이미지로 자동 업데이트하지 않아요. 새 이미지를 같은 Lambda 함수에 배포하려면 Amazon ECR의 이미지 태그가 그대로여도 update-function-code 명령을 사용해야 해요. 다음 예시에서 --publish 옵션은 업데이트된 컨테이너 이미지로 함수의 새 버전을 만들어요.
aws lambda update-function-code \
--function-name hello-world \
--image-uri 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \
--publish
Alpine 기본 이미지에서 Python 이미지를 만드는 예시는 AWS Blog의 Container image support for Lambda를 참고하세요.