컨테이너 이미지로서 Lambda 함수 배포 - AWS Lambda

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

Lambda 함수를 만들 때 배포 패키지에 함수 코드를 패키징합니다. Lambda는 컨테이너 이미지.zip 파일 아카이브라는 두 가지 배포 패키지를 지원합니다. 함수를 만드는 워크플로는 배포 패키지 유형에 따라 다릅니다. .zip 파일 아카이브로 정의된 함수를 구성하려면 .zip 파일 아카이브를 사용하여 Lambda 함수 배포 섹션을 참조하세요.

Lambda 콘솔과 Lambda API를 사용하여 컨테이너 이미지로 정의된 함수를 생성하고, 이미지 코드를 업데이트 및 테스트하고, 기타 함수 설정을 구성할 수 있습니다.

참고

기존 .zip 파일 아카이브 함수를 컨테이너 이미지를 사용하도록 변환할 수 없습니다. 새로운 함수를 생성해야 합니다.

이미지 태그를 사용하여 이미지를 선택하면 Lambda가 태그를 기본 이미지 다이제스트로 변환합니다. 이미지의 다이제스트를 검색하려면 GetFunctionConfiguration API 작업을 사용합니다. 함수를 최신 이미지 버전으로 업데이트하려면 Lambda 콘솔을 사용하여 함수 코드를 업데이트하거나 UpdateFunctionCode API 작업을 사용해야 합니다. UpdateFunctionConfiguration 등의 구성 작업은 함수의 컨테이너 이미지를 업데이트하지 않습니다.

사전 조건

다음 단계를 완료하려면 AWS Command Line Interface(AWS CLI) 버전 2가 필요합니다. 명령과 예상 결과는 별도의 블록에 나열됩니다.

aws --version

다음 결과가 표시됩니다.

aws-cli/2.0.57 Python/3.7.4 Darwin/19.6.0 exe/x86_64

긴 명령의 경우 이스케이프 문자(\)를 사용하여 명령을 여러 행으로 분할합니다.

Linux 및 macOS는 선호 셸과 패키지 관리자를 사용합니다.

참고

Windows에서는 Lambda와 함께 일반적으로 사용하는 일부 Bash CLI 명령(예:zip)은 운영 체제의 기본 제공 터미널에서 지원되지 않습니다. Ubuntu와 Bash의 Windows 통합 버전을 가져오려면 Linux용 Windows Subsystem을 설치합니다. 이 안내서의 예제 CLI 명령은 Linux 형식을 사용합니다. Windows CLI를 사용하는 경우 인라인 JSON 문서를 포함하는 명령의 형식을 다시 지정해야 합니다.

함수를 생성하기 전에 컨테이너 이미지를 생성하여 Amazon ECR에 업로드해야 합니다.

권한

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

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

{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": ["ecr:SetRepositoryPolicy","ecr:GetRepositoryPolicy"], "Resource": "arn:aws:ecr:<region>:<account>:repository/<repo name>/" } ] }

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는 Lambda를 호출하는 보안 주체가 ecr:getRepositoryPolicyecr:setRepositoryPolicy 권한을 갖고 있는 경우에만 이러한 권한을 추가할 수 있습니다.

Amazon ECR 리포지토리 권한을 보거나 편집하려면 Amazon Elastic 컨테이너 레지스트리 사용 설명서리포지토리 정책 설명 설정의 지침을 따르면 됩니다.

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

함수 생성

컨테이너 이미지로 정의된 함수를 생성하려면 먼저 이미지를 생성한 다음 Amazon ECR 리포지토리에 이미지를 저장해야 합니다.

함수를 만들려면
  1. Lambda 콘솔의 함수 페이지를 엽니다.

  2. 함수 생성(Create function)을 선택합니다.

  3. 컨테이너 이미지(Container image) 옵션을 선택합니다.

  4. 기본 정보에서 다음과 같이 합니다.

    1. 함수 이름(Function name)에 함수 이름을 입력합니다.

    2. [컨테이너 이미지 URI(Container image URI)]에서 함수 코드에 대해 원하는 명령 세트 아키텍처와 호환되는 컨테이너 이미지를 제공합니다.

      Amazon ECR 이미지 URI를 입력하거나 Amazon ECR 이미지를 찾아볼 수 있습니다.

      • Amazon ECR 이미지 URI를 입력합니다.

      • 또는 이미지의 Amazon ECR 리포지토리를 찾아보려면 이미지 찾아보기를 선택합니다. 드롭다운 목록에서 Amazon ECR 리포지토리를 선택한 다음 이미지를 선택합니다.

  5. (선택 사항) Dockerfile에 포함된 구성 설정을 재정의하려면 컨테이너 이미지 재정의(Container image overrides)를 확장합니다. 다음과 같은 설정을 재정의할 수 있습니다.

    • 진입점(Entrypoint)에 런타임 실행 파일의 전체 경로를 입력합니다. 다음 예제에서는 Node.js 함수의 진입점을 보여줍니다.

      "/usr/bin/npx", "aws-lambda-ric"
    • 명령(Command)진입점(Entrypoint)을 사용하여 이미지에 전달할 추가 파라미터를 입력합니다. 다음 예제에서는 Node.js 함수에 대한 명령을 보여줍니다.

      "app.handler"
    • 작업 디렉터리(Working directory)에 함수에 대한 작업 디렉터리의 전체 경로를 입력합니다. 다음 예제에서는 Lambda의 AWS 기본 이미지에 대한 작업 디렉터리를 보여줍니다.

      "/var/task"
    참고

    재정의 설정의 경우 각 문자열을 따옴표(” “)로 묶어야 합니다.

  6. (선택 사항) [아키텍처(Architecture)]에서 함수에 대한 명령 세트 아키텍처를 선택합니다. 기본 아키텍처는 x86_64입니다. 참고: 함수의 컨테이너 이미지를 빌드할 때 해당 이미지가 이 명령 세트 아키텍처와 호환되는지 확인하세요.

  7. (선택 사항) 권한(Permissions)에서 기본 실행 역할 변경(Change default execution role)을 확장합니다. 그런 다음 새 실행 역할(Execution role)을 만들거나 기존 역할을 사용하도록 선택합니다.

  8. 함수 생성(Create function)을 선택합니다.

Lambda는 사용자의 함수와, 로그 업로드 권한을 함수에 부여하는 실행 역할을 생성합니다. Lambda는 함수가 호출될 때 실행 역할을 맡아 해당 실행 역할을 사용하여 AWS SDK에 대한 자격 증명을 생성하고 이벤트 소스에서 데이터를 읽습니다.

Lambda 함수에 컨테이너 이미지로 코드를 배포하면 이미지가 Lambda에서 실행되도록 최적화 프로세스를 거칩니다. 이 프로세스는 몇 초가 걸릴 수 있으며, 이 기간 동안 함수는 보류 상태입니다. 최적화 프로세스가 완료되면 함수는 활성 상태로 전환됩니다.

함수 테스트

콘솔에 제공된 샘플 이벤트 데이터를 사용하여 Lambda 함수를 호출합니다.

함수를 호출하려면
  1. 함수를 선택한 후 테스트(Test) 탭을 선택합니다.

  2. Test event action(테스트 이벤트 작업)에서 Create new event(새 이벤트 생성)를 선택합니다.

  3. [이벤트 이름(Event name)]에 테스트 이벤트의 이름을 입력합니다.

  4. Event sharing settings(이벤트 공유 설정)에서 Private(프라이빗)을 선택합니다.

  5. Template(템플릿)에서 기본 hello-world 옵션을 그대로 둡니다.

  6. 변경 사항 저장테스트를 차례로 선택합니다. Lambda가 사용자를 대신하여 함수를 실행합니다. 함수 핸들러가 샘플 이벤트를 수신하여 처리합니다.

  7. 실행 결과세부 정보 검토:

    • Summary(요약) 섹션에는 호출 로그의 REPORT 줄에 있는 주요 정보가 표시됩니다.

    • Log output(로그 출력) 섹션에는 전체 호출 로그가 표시됩니다. Lambda는 모든 호출 로그를 Amazon CloudWatch에 기록합니다.

컨테이너 설정 재정의

Lambda 콘솔 또는 Lambda API를 사용하여 다음과 같은 컨테이너 이미지 설정을 재정의할 수 있습니다.

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

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

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

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

Lambda 콘솔 또는 Lambda API에서 제공하는 모든 값은 Dockerfile의 값을 재정의합니다.

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

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

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

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

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

    자세한 내용은 AWS Lambda 환경 변수 사용 섹션을 참조하세요.

함수 코드 업데이트

컨테이너 이미지를 함수에 배포한 후 이미지는 읽기 전용입니다. 함수 코드를 업데이트하려면 먼저 새 이미지 버전을 배포해야 합니다. 새 이미지 버전을 생성한 다음 Amazon ECR 리포지토리에 이미지를 저장합니다.

업데이트된 컨테이너 이미지를 사용하도록 함수를 구성하려면
  1. Lambda 콘솔의 함수 페이지를 엽니다.

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

  3. 이미지(Image)에서 새 이미지 배포(Deploy new image)를 선택합니다.

  4. 이미지 찾아보기(Browse images)를 선택합니다.

  5. 컨테이너 이미지 선택 대화 상자의 드롭다운 목록에서 Amazon ECR 리포지토리를 선택한 다음 새 이미지 버전을 선택합니다.

  6. Save를 선택합니다.

함수 버전 $LATEST

함수 버전을 게시할 경우 해당 버전의 사용자를 위한 일관된 환경을 유지하기 위해 코드와 대부분 구성 설정이 잠깁니다. 게시되지 않은 버전의 함수에서만 코드와 많은 구성 설정을 변경할 수 있습니다. 기본적으로 콘솔에는 게시되지 않은 버전의 함수에 대한 구성 정보가 표시됩니다. 함수의 버전을 확인하려면 구분자(Qualifiers)를 선택합니다. 게시되지 않은 버전의 이름은 $LATEST입니다.

Amazon Elastic Container Registry(Amazon ECR)도 latest 태그를 사용하여 컨테이너 이미지의 최신 버전을 나타냅니다. 이 태그와 $LATEST 함수 버전을 혼동하지 않도록 주의하세요.

버전 관리에 대한 자세한 내용은 Lambda 함수 버전 섹션을 참조하세요.

Lambda API 사용

컨테이너 이미지로 정의된 함수를 관리하려면 다음과 같은 API 작업을 사용합니다.

컨테이너 이미지로 정의된 함수를 생성하려면 create-function 명령을 사용합니다. package-typeImage로 설정하고 code 파라미터를 사용하여 컨테이너 이미지 URI를 지정합니다.

함수를 생성할 때 명령 세트 아키텍처를 지정할 수 있습니다. 기본 아키텍처는 x86-64입니다. 컨테이너 이미지의 코드가 아키텍처와 호환되는지 확인합니다.

컨테이너 레지스트리와 동일한 계정 또는 Amazon ECR의 컨테이너 레지스트리와 동일한 리전의 다른 계정에서 함수를 생성할 수 있습니다. 교차 계정 액세스의 경우 이미지에 대한 Amazon ECR 권한을 조정합니다.

aws lambda create-function --region sa-east-1 --function-name my-function \ --package-type Image \ --code ImageUri=<ECR Image URI> \ --role arn:aws:iam::123456789012:role/lambda-ex

함수 코드를 업데이트하려면 update-function-code 명령을 사용합니다. image-uri 파라미터를 사용하여 컨테이너 이미지 위치를 지정합니다.

참고

함수의 package-type은 변경할 수 없습니다.

aws lambda update-function-code --region sa-east-1 --function-name my-function \ --image-uri <ECR Image URI> \

함수 파라미터를 업데이트하려면 update-function-configuration 작업을 사용합니다. EntryPointCommand를 문자열 배열로 지정하고 WorkingDirectory를 문자열로 지정합니다.

aws lambda update-function-configuration --function-name my-function \ --image-config '{"EntryPoint": ["/usr/bin/npx", "aws-lambda-ric"], \ "Command": ["app.handler"] , \ "WorkingDirectory": "/var/task"}'

AWS CloudFormation

AWS CloudFormation을 사용하여 컨테이너 이미지로 정의된 Lambda 함수를 생성할 수 있습니다. AWS CloudFormation 템플릿에서 AWS::Lambda::Function 리소스는 Lambda 함수를 지정합니다. AWS::Lambda::Function 리소스의 속성에 대한 설명은 AWS CloudFormation 사용 설명서AWS::Lambda::Function을 참조하세요.

AWS::Lambda::Function 리소스에서 다음 속성을 설정하여 컨테이너 이미지로 정의된 함수를 생성합니다.

  • AWS::Lambda::Function

    • PackageType - Image(으)로 설정합니다.

    • Code - ImageUri 필드에 컨테이너 이미지 URI를 입력합니다.

    • ImageConfig - (선택 사항) 컨테이너 이미지 구성 속성을 재정의합니다.

ImageConfigAWS::Lambda::Function 속성에는 다음 필드가 포함됩니다.

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

  • EntryPoint - 애플리케이션에 대한 진입점을 지정합니다.

  • WorkingDirectory - 작업 디렉터리를 지정합니다.

참고

ImageConfig 템플릿에서 AWS CloudFormation 속성을 선언하는 경우 세 가지 ImageConfig 속성 모두에 값을 제공해야 합니다.

자세한 내용은 AWS CloudFormation 사용 설명서에서 ImageConfig를 참조하세요.