컨테이너 이미지를 사용하여 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, Python 3.12, Java 21, AL2023 이상의 기본 이미지는 Amazon Linux 2023 최소 컨테이너 이미지를 기반으로 합니다. 이전 기본 이미지는 Amazon Linux 2를 사용합니다. AL2023은 작은 배포 공간과 glibc와 같이 업데이트된 라이브러리 버전을 포함하여 Amazon Linux 2에 비해 여러 가지 이점을 제공합니다.

AL2023 기반 이미지는 microdnf(dnf 심볼릭 링크)를 Amazon Linux 2에서 기본 패키지 관리자인 yum 대신 패키지 관리자로 사용합니다. microdnfdnf의 독립 실행형 구현입니다. AL2023 기반 이미지에 포함된 패키지 목록의 경우 Comparing packages installed on Amazon Linux 2023 Container ImagesMinimal Container 열을 참조하세요. AL2023과 Amazon Linux 2의 차이점에 대한 자세한 내용은 AWS 컴퓨팅 블로그의 Introducing the Amazon Linux 2023 runtime for AWS Lambda를 참조하세요.

참고

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 GitHub의 OS 전용 런타임용 Dockerfile

al2

OS 전용 런타임 Amazon Linux 2 GitHub의 OS 전용 런타임용 Dockerfile

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를 지정합니다.

함수를 생성하는 사용자 또는 역할에 대한 권한에 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 함수를 생성하고 업데이트하도록 허용합니다.

  • LambdaECRImageCrossAccountRetrievalPolicy - 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 보안 모범 사례와 일치합니다.

Lambda 권한 외에도 함수를 생성하는 사용자 또는 역할에는 BatchGetImageGetDownloadUrlForLayer 권한도 있어야 합니다.

함수 수명 주기

새 컨테이너 이미지 또는 업데이트된 컨테이너 이미지를 업로드하면 함수가 호출을 처리하기 전에 Lambda가 이미지를 최적화합니다. 최적화 프로세스에는 몇 초가 걸릴 수 있습니다. 이 프로세스가 완료될 때까지 함수는 Pending 상태로 유지됩니다. 그런 다음 함수가 Active 상태로 전환됩니다. 상태가 Pending인 동안 함수를 호출할 수 있지만 함수에 대한 다른 작업은 실패합니다. 이미지 업데이트가 진행되는 동안 발생하는 호출은 이전 이미지의 코드를 실행합니다.

함수가 여러 주 동안 호출되지 않으면 Lambda는 최적화된 버전을 회수하고 함수는 Inactive 상태로 전환됩니다. 함수를 다시 활성화하려면 함수를 호출해야 합니다. Lambda는 첫 번째 호출을 거부하고, Lambda가 이미지를 다시 최적화할 때까지 함수는 Pending 상태가 됩니다. 그런 다음 함수는 Active 상태로 돌아갑니다.

Lambda는 Amazon ECR 리포지토리에서 연관된 컨테이너 이미지를 주기적으로 가져옵니다. 해당 컨테이너 이미지가 더 이상 Amazon ECR에 존재하지 않거나 권한이 취소되면, 함수가 Failed 상태에 들어가고 모든 함수 호출에 대해 Lambda가 실패를 반환합니다.

Lambda API를 사용하여 함수 상태에 대한 정보를 가져올 수 있습니다. 자세한 내용은 Lambda 함수 상태 단원을 참조하십시오.