Lambda 컨테이너 이미지 작업 - AWS Lambda

Lambda 컨테이너 이미지 작업

AWS Lambda 함수의 코드는 스크립트 또는 컴파일된 프로그램과 해당 종속 항목으로 구성됩니다. 함수 코드는 배포 패키지를 사용하여 Lambda에 배포합니다. Lambda는 컨테이너 이미지 및 .zip 파일 아카이브의 두 가지 배포 패키지를 지원합니다.

Lambda 함수의 컨테이너 이미지를 빌드하는 세 가지 방법이 있습니다.

작은 정보

Lambda 컨테이너 함수가 활성 상태가 되는 데 걸리는 시간을 줄이려면 Docker 설명서의 다단계 빌드 사용을 참조하세요. 효율적인 컨테이너 이미지를 빌드하려면 Dockerfile 작성 모범 사례를 따르세요.

컨테이너 이미지에서 Lambda 함수를 생성하려면 이미지를 로컬에서 빌드하고 Amazon Elastic Container Registry(Amazon ECR) 리포지토리에 업로드합니다. 그런 다음 함수를 생성할 때 리포지토리 URI를 지정합니다. Amazon ECR 리포지토리는 Lambda 함수와 동일한 AWS 리전 내에 있어야 합니다. 이미지가 Lambda 함수와 동일한 리전에 있는 한 다른 AWS 계정의 이미지를 사용하여 함수를 생성할 수 있습니다. 자세한 설명은 Amazon ECR 교차 계정 권한 섹션을 참조하세요.

이 페이지에서는 Lambda 호환 컨테이너 이미지 생성을 위한 기본 이미지 유형과 요구 사항을 설명합니다.

참고

기존 함수의 배포 패키지 유형 (.zip 또는 컨테이너 이미지) 은 변경할 수 없습니다. 예를 들어, .zip 파일 아카이브를 사용하도록 컨테이너 이미지 함수를 변환할 수 없습니다. 새로운 함수를 생성해야 합니다.

요구 사항

AWS Command Line Interface(AWS CLI) 버전 2Docker CLI를 설치합니다. 또한 다음 요구 사항에 유의하세요.

  • 컨테이너 이미지는 Lambda 런타임 API를 구현해야 합니다. AWS 오픈 소스 런타임 인터페이스 클라이언트는 이 API를 구현합니다. 런타임 인터페이스 클라이언트를 선호하는 기본 이미지에 추가하여 Lambda와 호환되도록 만들 수 있습니다.

  • 컨테이너 이미지는 읽기 전용 파일 시스템에서 실행할 수 있어야 합니다. 함수 코드는 512MB에서 10,240MB 사이의 스토리지가 있는 쓰기 가능한 /tmp 디렉터리에 1MB 단위로 액세스할 수 있습니다.

  • 기본 Lambda 사용자는 함수 코드를 실행하는 데 필요한 모든 파일을 읽을 수 있어야 합니다. Lambda는 권한이 최소 권한인 기본 Linux 사용자를 정의하여 보안 모범 사례를 따릅니다. 애플리케이션 코드가 다른 Linux 사용자의 실행이 제한된 파일에 의존하지 않는지 확인합니다.

  • Lambda는 Linux 기반 컨테이너 이미지만 지원합니다.

  • Lambda는 다중 아키텍처 기본 이미지를 제공합니다. 하지만 함수에 대해 빌드하는 이미지는 아키텍처 중 하나만 대상으로 해야 합니다. Lambda는 다중 아키텍처 컨테이너 이미지를 사용하는 함수를 지원하지 않습니다.

Lambda용 AWS 기본 이미지 사용

Lambda용 AWS 기본 이미지 중 하나를 사용하여 함수 코드의 컨테이너 이미지를 빌드할 수 있습니다. 기본 이미지는 Lambda에서 컨테이너 이미지를 실행하는 데 필요한 언어 런타임 및 기타 구성 요소가 미리 로드되어 있습니다. 함수 코드와 종속 항목을 기본 이미지에 추가한 다음 컨테이너 이미지로 패키징합니다.

AWS는 Lambda용 AWS 기본 이미지를 주기적으로 업데이트합니다. Dockerfile의 FROM 속성에 이미지 이름이 포함되어 있으면 Docker 클라이언트는 Amazon ECR 리포지토리에서 최신 버전의 이미지를 가져옵니다. 업데이트된 기본 이미지를 사용하려면 컨테이너 이미지를 다시 빌드하고 함수 코드를 업데이트해야 합니다.

Node.js 20, 파이썬 3.12, 자바 21, AL2023 및 이후 버전의 기본 이미지는 아마존 리눅스 2023의 최소 컨테이너 이미지를 기반으로 합니다. 이전 기본 이미지는 Amazon Linux 2를 사용했습니다. AL2023은 작은 배포 공간과 glibc와 같이 업데이트된 라이브러리 버전을 포함하여 Amazon Linux 2에 비해 여러 가지 이점을 제공합니다.

AL2023 기반 이미지는 Amazon Linux 2의 기본 패키지 관리자인 대신 microdnf (심볼릭 링크dnf) 를 패키지 관리자로 사용합니다. yum microdnf의 독립 실행형 구현입니다. dnf AL2023 기반 이미지에 포함된 패키지 목록은 Amazon Linux 2023 컨테이너 이미지에 설치된 패키지 비교의 최소 컨테이너 열을 참조하십시오. AL2023 및 Amazon Linux 2 간의 차이점에 대한 자세한 내용은 AWS Compute AWS Lambda 블로그에서 Amazon Linux 2023 런타임 소개를 참조하십시오.

참고

with AWS Serverless Application Model (AWS SAM) 를 포함하여 AL2023 기반 이미지를 로컬에서 실행하려면 Docker 버전 20.10.10 이상을 사용해야 합니다.

AWS 기본 이미지를 사용하여 컨테이너 이미지를 빌드하려면 선호하는 언어에 대한 지침을 선택합니다.

AWS OS 전용 기본 이미지 사용

AWS OS 전용 기본 이미지는 Amazon Linux 배포판 및 런타임 인터페이스 에뮬레이터를 포함합니다. 이러한 이미지는 일반적으로 GoRust와 같은 컴파일된 언어의 컨테이너 이미지와 Lambda가 기본 이미지를 제공하지 않는 언어 또는 언어 버전(예: Node.js 19)의 컨테이너 이미지를 생성하는 데 사용됩니다. OS 전용 기본 이미지를 사용하여 사용자 지정 런타임을 구현할 수도 있습니다. 이미지가 Lambda와 호환되도록 하려면 해당 언어용 런타임 인터페이스 클라이언트를 이미지에 포함해야 합니다.

태그 런타임 운영 체제 Dockerfile 사용 중단

al2023

OS 전용 런타임 Amazon Linux 2023 OS 전용 런타임용 도커파일 GitHub

al2

OS 전용 런타임 Amazon Linux 2 OS 전용 런타임용 도커파일 켜짐 GitHub

Amazon Elastic Container Registry 퍼블릭 갤러리: gallery.ecr.aws/lambda/provided

비 AWS 기본 이미지 사용

Lambda는 다음 이미지 매니페스트 형식 중 하나에 부합하는 모든 이미지를 지원합니다.

  • Docker 이미지 매니페스트 V2, 스키마 2(Docker 버전 1.10 이상에서 사용됨)

  • Open Container Initiative(OCI) 사양(v1.0.0 이상)

Lambda는 모든 레이어를 포함한 최대 10GB의 비압축 이미지 크기를 지원합니다.

참고

이미지가 Lambda와 호환되도록 하려면 해당 언어용 런타임 인터페이스 클라이언트를 이미지에 포함해야 합니다.

런타임 인터페이스 클라이언트

OS 전용 기본 이미지나 대체 기본 이미지를 사용하는 경우 이미지에 런타임 인터페이스 클라이언트를 포함해야 합니다. 런타임 인터페이스 클라이언트는 Lambda와 함수 코드 간의 상호 작용을 관리하는 Lambda 런타임 API를 확장해야 합니다. AWS는 다음 언어에 대한 오픈 소스 런타임 인터페이스 클라이언트를 제공합니다.

AWS에서 제공하는 런타임 인터페이스 클라이언트가 없는 언어를 사용하는 경우 직접 생성해야 합니다.

Amazon ECR 권한

컨테이너 이미지에서 Lambda 함수를 생성하기 전에 이미지를 로컬로 빌드하고 Amazon ECR 리포지토리에 업로드해야 합니다. 함수를 생성할 때 Amazon ECR 리포지토리 URI를 지정합니다.

함수를 생성하는 사용자 또는 역할에 대한 권한에 AWS 관리형 정책 GetRepositoryPolicySetRepositoryPolicy가 포함되어 있는지 확인합니다.

예를 들어 IAM 콘솔을 사용하여 다음 정책을 포함하는 역할을 생성합니다.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "ecr:SetRepositoryPolicy", "ecr:GetRepositoryPolicy" ], "Resource": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world" } ] }

Amazon ECR 리포지토리 정책

Amazon ECR의 컨테이너 이미지와 동일한 계정의 함수에 대해 Amazon ECR 리포지토리 정책에 ecr:BatchGetImageecr:GetDownloadUrlForLayer 권한을 추가할 수 있습니다. 다음 예제는 최소한의 정책을 보여줍니다.

{ "Sid": "LambdaECRImageRetrievalPolicy", "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": [ "ecr:BatchGetImage", "ecr:GetDownloadUrlForLayer" ] }

Amazon ECR 리포지토리 권한에 대한 자세한 내용은 Amazon Elastic Container Registry 사용 설명서프라이빗 리포지토리 정책을 참조하세요.

Amazon ECR 리포지토리에 이러한 권한이 없는 경우 Lambda는 컨테이너 이미지 리포지토리 권한에 ecr:BatchGetImageecr:GetDownloadUrlForLayer를 추가합니다. Lambda를 호출하는 보안 주체가 ecr:getRepositoryPolicyecr:setRepositoryPolicy 권한을 갖고 있는 경우에만 Lambda가 이러한 권한을 추가할 수 있습니다.

Amazon ECR 리포지토리 권한을 보거나 편집하려면 Amazon Elastic Container Registry 사용 설명서프라이빗 리포지토리 정책 설명 설정의 지침을 따르면 됩니다.

Amazon ECR 교차 계정 권한

동일한 리전의 다른 계정은 사용자 계정이 소유한 컨테이너 이미지를 사용하는 함수를 생성할 수 있습니다. 다음 예제에서 Amazon ECR 리포지토리 권한 정책은 계정 번호 123456789012에 대한 액세스 권한을 부여하는 다음 문이 필요합니다.

  • CrossAccountPermission— 계정 123456789012가 이 ECR 리포지토리의 이미지를 사용하는 Lambda 함수를 생성하고 업데이트할 수 있도록 허용합니다.

  • LambdaECR ImageCrossAccountRetrievalPolicy — 장기간 호출되지 않으면 Lambda는 결국 함수의 상태를 비활성으로 설정합니다. 이 문은 Lambda가 123456789012가 소유한 함수를 대신하여 최적화 및 캐싱을 위해 컨테이너 이미지를 검색할 수 있도록 하는 데 필요합니다.

예 - 리포지토리에 크로스 계정 권한 추가
{ "Version": "2012-10-17", "Statement": [ { "Sid": "CrossAccountPermission", "Effect": "Allow", "Action": [ "ecr:BatchGetImage", "ecr:GetDownloadUrlForLayer" ], "Principal": { "AWS": "arn:aws:iam::123456789012:root" } }, { "Sid": "LambdaECRImageCrossAccountRetrievalPolicy", "Effect": "Allow", "Action": [ "ecr:BatchGetImage", "ecr:GetDownloadUrlForLayer" ], "Principal": { "Service": "lambda.amazonaws.com" }, "Condition": { "StringLike": { "aws:sourceARN": "arn:aws:lambda:us-east-1:123456789012:function:*" } } } ] }

여러 계정에 대한 액세스 권한을 부여하려면 CrossAccountPermission 정책의 보안 주체 목록과 LambdaECRImageCrossAccountRetrievalPolicy의 조건 평가 목록에 계정 ID를 추가합니다.

AWS 조직의 여러 계정으로 작업하는 경우 ECR 권한 정책에서 각 계정 ID를 열거하는 것이 좋습니다. 이 접근 방식은 IAM 정책에서 제한된 권한을 설정하는 AWS 보안 모범 사례와 일치합니다.

컨테이너 이미지 설정

다음은 일반적인 컨테이너 이미지 설정입니다. Dockerfile에서 이러한 설정을 사용하는 경우 Lambda가 이러한 설정을 해석하고 처리하는 방법에 유의하세요.

  • ENTRYPOINT - 애플리케이션에 대한 진입점의 절대 경로를 지정합니다.

  • CMD - ENTRYPOINT를 사용하여 전달할 파라미터를 지정합니다.

  • WORKDIR - 작업 디렉터리의 절대 경로를 지정합니다.

  • ENV - Lambda 함수의 환경 변수를 지정합니다.

Docker가 컨테이너 이미지 설정을 사용하는 방법에 대한 자세한 내용은 Docker Docs 웹 사이트의 Dockerfile 참조에서 ENTRYPOINT를 참조하세요. ENTRYPOINT 및 CMD를 사용하는 방법에 대한 자세한 내용은 AWS 오픈 소스 블로그에서 Demystifying ENTRYPOINT and CMD in Docker를 참조하세요.

이미지를 빌드할 때 Dockerfile에서 컨테이너 이미지 설정을 지정할 수 있습니다. Lambda 콘솔이나 Lambda API를 사용하여 이러한 구성을 재정의할 수도 있습니다. 이를 통해 동일한 컨테이너 이미지를 배포하지만 런타임 구성이 다른 여러 함수를 배포할 수 있습니다.

주의

Dockerfile에서 또는 재정의로 ENTRYPOINT 또는 CMD를 지정할 때 절대 경로를 입력해야 합니다. 또한 심볼릭 링크를 컨테이너의 진입점으로 사용하지 마세요.

컨테이너 이미지의 구성 값을 재정의하려면
  1. Lambda 콘솔의 함수 페이지를 엽니다.

  2. 업데이트할 함수를 선택합니다.

  3. 이미지 구성(Image configuration)에서 편집(Edit)을 선택합니다.

  4. 재정의 설정에 대해 새 값을 입력한 다음 저장(Save)을 선택합니다.

  5. (선택 사항) 환경 변수를 추가하거나 재정의하려면 환경 변수(Environment variables)에서 편집(Edit)을 선택합니다.

자세한 내용은 Lambda 환경 변수 사용을(를) 참조하세요.