Lambda 컨테이너 이미지 생성
AWS는 컨테이너 이미지를 생성하는 데 사용할 수 있는 일련의 오픈 소스 기본 이미지를 제공합니다. 이러한 기본 이미지에는 Lambda와 함수 코드 간의 상호 작용을 관리하는 런타임 인터페이스 클라이언트가 포함되어 있습니다.
Node.js 예제와 Python 예제를 포함하는 예제 애플리케이션에 대해서는 AWS 블로그에서 Container image support for Lambda
Lambda 컨테이너 함수가 활성 상태가 되는 데 걸리는 시간을 줄이려면 Docker 설명서의 다단계 빌드 사용
참고
중동 (UAE) 지역에서 Lambda 함수에는 컨테이너 이미지가 지원되지 않습니다.
주제
사전 조건
AWS Command Line Interface(AWS CLI) 버전 2와 Docker CLI
-
컨테이너 이미지는 Lambda 런타임 API를 구현해야 합니다. AWS 오픈 소스 런타임 인터페이스 클라이언트는 이 API를 구현합니다. 런타임 인터페이스 클라이언트를 선호하는 기본 이미지에 추가하여 Lambda와 호환되도록 만들 수 있습니다.
-
컨테이너 이미지는 읽기 전용 파일 시스템에서 실행할 수 있어야 합니다. 함수 코드는 512MB에서 10,240MB 사이의 스토리지가 있는 쓰기 가능한
/tmp
디렉터리에 1MB 단위로 액세스할 수 있습니다. -
기본 Lambda 사용자는 함수 코드를 실행하는 데 필요한 모든 파일을 읽을 수 있어야 합니다. Lambda는 권한이 최소 권한인 기본 Linux 사용자를 정의하여 보안 모범 사례를 따릅니다. 애플리케이션 코드가 다른 Linux 사용자의 실행이 제한된 파일에 의존하지 않는지 확인합니다.
-
Lambda는 Linux 기반 컨테이너 이미지만 지원합니다.
-
Lambda는 다중 아키텍처 기본 이미지를 제공합니다. 하지만 함수에 대해 빌드하는 이미지는 아키텍처 중 하나만 대상으로 해야 합니다. Lambda는 다중 아키텍처 컨테이너 이미지를 사용하는 함수를 지원하지 않습니다.
이미지 유형
AWS에서 제공한 기본 이미지나 Alpine, Debian과 같은 대체 기본 이미지를 사용할 수 있습니다. Lambda는 다음 이미지 매니페스트 형식 중 하나에 부합하는 모든 이미지를 지원합니다.
Docker 이미지 매니페스트 V2, 스키마 2(Docker 버전 1.10 이상에서 사용됨)
Open Container Initiative(OCI) 사양(v1.0.0 이상)
Lambda는 모든 레이어를 포함한 최대 10GB의 비압축 이미지 크기를 지원합니다.
컨테이너 도구
컨테이너 이미지를 생성하려면 다음과 같은 컨테이너 이미지 매니페스트 형식 중 하나를 지원하는 개발 도구를 사용할 수 있습니다.
Docker 이미지 매니페스트 V2, 스키마 2(Docker 버전 1.10 이상에서 사용됨)
OCI 사양(v1.0.0 이상)
예를 들어 Docker CLI를 사용하여 컨테이너 이미지를 빌드, 테스트 및 배포할 수 있습니다.
컨테이너 이미지 설정
Lambda는 Dockerfile에서 다음과 같은 컨테이너 이미지 설정을 지원합니다.
-
ENTRYPOINT - 애플리케이션에 대한 진입점의 절대 경로를 지정합니다.
-
CMD - ENTRYPOINT를 사용하여 전달할 파라미터를 지정합니다.
-
WORKDIR - 작업 디렉터리의 절대 경로를 지정합니다.
-
ENV - Lambda 함수의 환경 변수를 지정합니다.
참고
Lambda는 Dockerfile에서 지원되지 않는 컨테이너 이미지 설정의 값을 모두 무시합니다.
Docker가 컨테이너 이미지 설정을 사용하는 방법에 대한 자세한 내용은 Docker Docs 웹 사이트의 Dockerfile 참조에서 ENTRYPOINT
이미지를 빌드할 때 Dockerfile에서 컨테이너 이미지 설정을 지정할 수 있습니다. Lambda 콘솔이나 Lambda API를 사용하여 이러한 구성을 재정의할 수도 있습니다. 이를 통해 동일한 컨테이너 이미지를 배포하지만 런타임 구성이 다른 여러 함수를 배포할 수 있습니다.
주의
Dockerfile에서 또는 재정의로 ENTRYPOINT 또는 CMD를 지정할 때 절대 경로를 입력해야 합니다. 또한 심볼릭 링크를 컨테이너의 진입점으로 사용하지 마세요.
AWS 기본 이미지에서 이미지 생성
새 Lambda 함수에 대한 컨테이너 이미지를 빌드하기 위해 Lambda용 AWS 기본 이미지로 시작할 수 있습니다. Lambda는 두 가지 유형의 기본 이미지를 제공합니다.
-
다중 아키텍처 기본 이미지
기본 이미지 태그(예:
python:3.9
또는java:11
) 중 하나를 지정하여 이 유형의 이미지를 선택합니다. -
아키텍처별 기본 이미지
아키텍처 접미사가 있는 이미지 태그를 지정합니다. 예를 들어
3.9-arm64
를 지정하여 Python 3.9의 arm64 기본 이미지를 선택합니다.
다른 컨테이너 레지스트리의 대체 기본 이미지를 사용할 수도 있습니다. Lambda는 Lambda와 호환될 수 있도록 대체 기본 이미지에 추가하는 오픈 소스 런타임 인터페이스 클라이언트를 제공합니다.
참고
AWS는 Lambda용 AWS 기본 이미지를 주기적으로 업데이트합니다. Dockerfile의 FROM 속성에 이미지 이름이 포함되어 있으면 Docker 클라이언트는 Amazon ECR 리포지토리에서 최신 버전의 이미지를 가져옵니다. 업데이트된 기본 이미지를 사용하려면 컨테이너 이미지를 다시 빌드하고 함수 코드를 업데이트해야 합니다.
Lambda용 AWS 기본 이미지에서 이미지를 생성하려면
-
로컬 컴퓨터에서 새 함수에 대한 프로젝트 디렉터리를 생성합니다.
-
프로젝트 디렉터리에
app
이라는 디렉터리를 생성한 다음 함수 핸들러 코드를 app 디렉터리에 추가합니다. -
텍스트 편집기를 사용하여 새 Dockerfile을 생성합니다.
AWS 기본 이미지는 다음과 같은 환경 변수를 제공합니다.
-
LAMBDA_TASK_ROOT=/var/task
-
LAMBDA_RUNTIME_DIR=/var/runtime
함수 처리기와 함께 ${LAMBDA_TASK_ROOT} 디렉터리 아래에 종속성을 설치하여 Lambda 런타임에서 함수를 호출할 때 해당 종속성을 찾을 수 있도록 합니다.
다음 예제에서는 Node.js, Python, Ruby에 대한 예제 Docker 파일입니다.
-
-
docker build
명령을 사용하여 Docker 이미지를 빌드합니다. 이미지의 이름을 입력합니다. 다음 예제에서는 이미지의 이름을hello-world
로 지정합니다.docker build -t
hello-world
. -
docker run
명령을 사용하여 Docker 이미지를 시작합니다. 이 예에서는hello-world
를 이미지 이름으로 입력합니다.docker run -p 9000:8080
hello-world
-
(선택 사항) 런타임 인터페이스 에뮬레이터를 사용하여 로컬에서 애플리케이션을 테스트합니다. 새 터미널 창에서
curl
명령을 사용하여 다음 엔드포인트에 이벤트를 게시합니다.curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'
이 명령은 컨테이너 이미지에서 실행되는 함수를 호출하고 응답을 반환합니다.
대체 기본 이미지에서 이미지 생성
사전 조건
-
AWS CLI
-
Docker Desktop
-
함수 코드
대체 기본 이미지를 사용하여 이미지를 생성하려면
-
기본 이미지를 선택합니다. Lambda는 Alpine, Debian, Ubuntu 등 모든 리눅스 배포판을 지원합니다.
-
로컬 컴퓨터에서 새 함수에 대한 프로젝트 디렉터리를 생성합니다.
-
프로젝트 디렉터리에
app
이라는 디렉터리를 생성한 다음 함수 핸들러 코드를 app 디렉터리에 추가합니다. -
텍스트 편집기를 사용하여 다음과 같은 구성으로 새 Dockerfile을 생성합니다.
FROM
속성을 기본 이미지의 URI로 설정합니다.런타임 인터페이스 클라이언트를 설치하기 위한 명령을 추가합니다.
ENTRYPOINT
속성을 설정하여 런타임 인터페이스 클라이언트를 호출합니다.CMD
인수를 설정하여 Lambda 함수 핸들러를 지정합니다.
다음 예제에서는 Python용 Dockerfile을 보여줍니다
# Define function directory ARG FUNCTION_DIR="/function" FROM python:buster as build-image # Install aws-lambda-cpp build dependencies RUN apt-get update && \ apt-get install -y \ g++ \ make \ cmake \ unzip \ libcurl4-openssl-dev # Include global arg in this stage of the build ARG FUNCTION_DIR # Create function directory RUN mkdir -p ${FUNCTION_DIR} # Copy function code COPY app/* ${FUNCTION_DIR} # Install the runtime interface client RUN pip install \ --target ${FUNCTION_DIR} \ awslambdaric # Multi-stage build: grab a fresh copy of the base image FROM python:buster # 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 build image dependencies COPY --from=build-image ${FUNCTION_DIR} ${FUNCTION_DIR} ENTRYPOINT [ "/usr/local/bin/python", "-m", "awslambdaric" ] CMD [ "app.handler" ]
-
docker build
명령을 사용하여 Docker 이미지를 빌드합니다. 이미지의 이름을 입력합니다. 다음 예제에서는 이미지의 이름을hello-world
로 지정합니다.docker build -t
hello-world
. -
(선택 사항) 런타임 인터페이스 에뮬레이터를 사용하여 로컬에서 애플리케이션을 테스트합니다.
Amazon ECR 리포지토리에 이미지 업로드
Amazon ECR에 이미지 배포 및 Lambda 함수 생성
-
get-login-password
명령을 실행하여 Amazon ECR 레지스트리에 대해 Docker CLI를 인증합니다. -
--region
값을 Amazon ECR 리포지토리를 생성하려는 AWS 리전으로 설정합니다. -
111122223333
를 사용자의 AWS 계정 ID로 바꿉니다.
aws ecr get-login-password --region
us-east-1
| docker login --username AWS --password-stdin111122223333
.dkr.ecr.us-east-1
.amazonaws.com -
-
create-repository
명령을 사용하여 Amazon ECR에 리포지토리를 생성합니다. aws ecr create-repository --repository-name
hello-world
--image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE성공하면 다음과 같은 응답이 표시됩니다.
{ "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
를 도커 이미지의 이름과 태그로 바꿉니다. -
Amazon ECR 리포지토리 URI를 복사한
repositoryUri
로 바꿉니다. URI 끝에: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 리소스 이름(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 \ --rolearn:aws:iam::111122223333:role/lambda-ex
-
함수를 호출합니다.
aws lambda invoke --function-name
hello-world
response.json다음과 같은 응답이 표시되어야 합니다.
{ "ExecutedVersion": "$LATEST", "StatusCode": 200 }
-
함수의 출력을 보려면
response.json
파일을 확인합니다.
함수 코드를 업데이트하려면 새 이미지 버전을 생성한 다음 Amazon ECR 리포지토리에 이미지를 저장해야 합니다. 자세한 내용은 함수 코드 업데이트 섹션을 참조하세요.
AWS SAM 도구 키트를 사용하여 이미지 생성
AWS Serverless Application Model(AWS SAM) 도구 키트를 사용하여 컨테이너 이미지로 정의된 함수를 생성하고 배포할 수 있습니다. 새 프로젝트의 경우 AWS SAM CLI init
명령을 사용하여 선호하는 런타임에 프로젝트의 스캐폴딩을 설정할 수 있습니다.
AWS SAM 템플릿에서 Runtime
유형을 Image
로 설정하고 기본 이미지의 URI를 제공합니다.
자세한 내용은 AWS Serverless Application Model 개발자 안내서의 애플리케이션 빌드를 참조하세요.