Lambda 계층 만들기 및 공유 - AWS Lambda

Lambda 계층 만들기 및 공유

Lambda 계층은 추가 코드 또는 데이터를 포함할 수 있는 .zip 파일 아카이브입니다. 계층에는 라이브러리, 사용자 정의 런타임, 데이터 또는 구성 파일이 포함될 수 있습니다. 계층은 코드 공유 및 책임 분리를 촉진하므로 비즈니스 로직 작성을 더 빠르게 반복 할 수 있습니다.

.zip 파일 아카이브로 배포된 Lambda 함수에서만 계층을 사용할 수 있습니다. 컨테이너 이미지로 정의된 함수의 경우 컨테이너 이미지를 생성할 때 기본 런타임 및 모든 코드 종속 항목을 패키징합니다. 자세한 내용은 AWS 컴퓨팅 블로그에서 컨테이너 이미지의 Lambda 계층 및 익스텐션 작업을 참조하세요.

Lambda 콘솔, Lambda API, AWS CloudFormation 또는 AWS Serverless Application Model(AWS SAM)를 사용하여 스트림을 계층을 생성할 수 있습니다. AWS SAM으로 계층 작성에 대한 자세한 내용은 AWS Serverless Application Model 개발자 안내서의 계층 작업을 참조하세요.

계층 콘텐츠 만들기

계층을 만들 때 모든 콘텐츠를 .zip 파일 아카이브로 묶어야 합니다. Amazon Simple Storage Service (Amazon S3) 또는 로컬 시스템에서 계층으로 .zip 파일 아카이브를 업로드합니다.Lambda는 함수의 실행 환경을 설정할 때 계층 콘텐츠를 /opt 디렉터리로 추출합니다.

AWS CLI 사용

Lambda 콘솔 또는 AWS Command Line Interface(AWS CLI)을 사용하여 계층의 .zip 파일을 생성하고 업로드할 수 있습니다. 언어별 지침은 다음 주제를 참조하십시오.

계층에 대한 .zip 파일 아카이브 컴파일

함수와 동일한 절차를 사용하여 계층 코드를 .zip 파일 아카이브로 작성합니다. 계층에 네이티브 코드 라이브러리가 포함되어 있는 경우 바이너리가 Amazon Linux와 호환되도록 Linux 개발 시스템을 사용하여 이러한 라이브러리를 컴파일하고 빌드해야 합니다.

Lambda에 대한 라이브러리를 올바르게 패키지하는 한 가지 방법은 AWS Cloud9를 사용하는 것입니다. 자세한 내용은 AWS 컴퓨팅 블로그에서 Lambda 계층을 사용하여 개발 프로세스 단순화를 참조하세요.

계층 내 라이브러리 종속 항목 포함

Lambda 런타임에 대해 PATH 변수는 /opt 디렉터리의 특정 폴더를 포함합니다. layer.zip 파일 아카이브에 동일한 폴더 구조를 정의하면 함수 코드가 경로를 지정하지 않고도 계정 콘텐츠에 액세스할 수 있습니다.

다음 표에는 각 런타임이 지원하는 폴더 경로가 나열되어 있습니다.

각 Lambda 런타임에 대한 계층 경로
런타임 경로

Node.js

nodejs/node_modules

nodejs/node14/node_modules (NODE_PATH)

Python

python

python/lib/python3.8/site-packages(사이트 디렉터리)

Java

java/lib (CLASSPATH)

Ruby

ruby/gems/2.5.0 (GEM_PATH)

ruby/lib (RUBYLIB)

모든 런타임

bin (PATH)

lib (LD_LIBRARY_PATH)

다음 예제는 계층 .zip 아카이브에 폴더를 구성하는 방법을 보여줍니다.

Node.js

예 Node.js 용 AWS X-Ray SDK 파일 구조

xray-sdk.zip └ nodejs/node_modules/aws-xray-sdk
Python

예 Pillow 라이브러리의 파일 구조

pillow.zip │ python/PIL └ python/Pillow-5.3.0.dist-info
Ruby

예 JSON gem에 대한 파일 구조

json.zip └ ruby/gems/2.5.0/ | build_info | cache | doc | extensions | gems | └ json-2.1.0 └ specifications └ json-2.1.0.gemspec
Java

예 Jackson JAR 파일의 파일 구조

jackson.zip └ java/lib/jackson-core-2.2.3.jar
All

예 jq 라이브러리의 파일 구조

jq.zip └ bin/jq

Lambda 실행 환경의 경로 설정에 관한 자세한 내용은 정의된 런타임 환경 변수 단원을 참조하세요.

계층 생성

Lambda 콘솔에서 또는 Lambda API를 사용하여 새 계층을 만들 수 있습니다.

계층에는 하나 이상의 버전이 있을 수 있습니다. 계층을 작성할 때 Lambda에서 계층 버전을 버전 1로 설정합니다. 기존 계층 버전에 대한 권한을 구성할 수 있지만 코드를 업데이트하거나 다른 구성을 변경하려면 계층의 새 버전을 만들어야 합니다.

계층을 생성하려면(콘솔)

  1. Lambda 콘솔의 계층 페이지를 엽니다.

  2. 계층 생성을 선택합니다.

  3. [계층 구성(Layer configuration)]에서 [이름(Name)]에 계층 이름을 입력합니다.

  4. (선택 사항) 설명에 계층에 대한 설명을 입력합니다.

  5. 계층 코드를 업로드하려면 다음 중 하나를 수행하세요.

    • 컴퓨터에서 .zip 파일을 업로드하려면 [zip 파일 업로드(Upload a .zip file)]를 선택합니다. 그리고 [업로드(Upload)]를 선택하여 로컬 .zip 파일을 선택합니다.

    • Amazon S3에서 파일을 업로드하려면 [Amazon S3에서 파일 업로드]를 선택합니다 그런 다음 Amazon S3 링크 URL에 파일 링크를 입력합니다.

  6. (선택 사항) 호환되는 런타임의 경우 최대 15개의 런타임을 선택합니다.

  7. (선택 사항) 라이선스의 경우 필요한 라이선스 정보를 입력합니다.

  8. Create를 선택합니다.

계층을 생성하려면(API)

계층을 생성하려면 이름, 설명, .zip 파일 아카이브, 그리고 해당 계층과 호환되는 런타임 목록과 함께 publish-layer-version 명령을 사용합니다. 런타임 목록은 선택 사항입니다.

aws lambda publish-layer-version --layer-name my-layer --description "My layer" \ --license-info "MIT" --content S3Bucket=lambda-layers-us-east-2-123456789012,S3Key=layer.zip \ --compatible-runtimes python3.6 python3.7 python3.8

다음과 유사한 출력 화면이 표시되어야 합니다.

{ "Content": { "Location": "https://awslambda-us-east-2-layers.s3.us-east-2.amazonaws.com/snapshots/123456789012/my-layer-4aaa2fbb-ff77-4b0a-ad92-5b78a716a96a?versionId=27iWyA73cCAYqyH...", "CodeSha256": "tv9jJO+rPbXUUXuRKi7CwHzKtLDkDRJLB3cC3Z/ouXo=", "CodeSize": 169 }, "LayerArn": "arn:aws:lambda:us-east-2:123456789012:layer:my-layer", "LayerVersionArn": "arn:aws:lambda:us-east-2:123456789012:layer:my-layer:1", "Description": "My layer", "CreatedDate": "2018-11-14T23:03:52.894+0000", "Version": 1, "LicenseInfo": "MIT", "CompatibleRuntimes": [ "python3.6", "python3.7", "python3.8" ] }
참고

publish-layer-version을 호출할 때마다 계층의 새 버전이 생성됩니다.

계층 버전 삭제

계층 버전을 삭제하려면 delete-layer-version 명령을 사용합니다.

aws lambda delete-layer-version --layer-name my-layer --version-number 1

계층 버전을 삭제하면 이를 사용하기 위한 Lambda 함수를 더 이상 구성할 수 없습니다. 그러나 해당 버전을 이미 사용 중인 모든 함수는 이 버전에 계속 액세스할 수 있습니다. 버전 번호는 계층 이름에 절대로 재사용되지 않습니다.

계층 권한 구성

기본적으로 생성한 계층은 AWS 계정에 비공개입니다. 그러나 선택적으로 계층을 다른 계정과 공유하거나 공개로 만들 수 있습니다.

다른 계정에 계층 사용 권한을 부여하려면 add-layer-version-permission 명령을 사용하여 해당 계층 버전의 권한 정책에 명령문을 추가하세요. 각 명령문에서 단일 계정, 모든 계정 또는 조직을 대상으로 권한을 부여할 수 있습니다.

aws lambda add-layer-version-permission --layer-name xray-sdk-nodejs --statement-id xaccount \ --action lambda:GetLayerVersion --principal 210987654321 --version-number 1 --output text

다음과 유사한 출력 화면이 표시되어야 합니다.

e210ffdc-e901-43b0-824b-5fcd0dd26d16 {"Sid":"xaccount","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::210987654321:root"},"Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-east-2:123456789012:layer:xray-sdk-nodejs:1"}

권한은 단일 계층 버전에만 적용됩니다. 새 계층 버전을 생성할 때마다 해당 프로세스를 반복합니다.

더 많은 예제는 계층에 다른 계정에 대한 액세스 권한 부여를 참조하세요.

계층으로 AWS CloudFormation 작업

AWS CloudFormation을 사용하여 계층을 생성하고 해당 계층을 Lambda 함수와 연결할 수 있습니다. 다음 예제 템플릿에서는 blank-nodejs-lib라는 계층을 만들고 [계층(Layers)] 속성을 사용하여 Lambda 함수에 계층을 연결합니다.

AWSTemplateFormatVersion: '2010-09-09' Transform: 'AWS::Serverless-2016-10-31' Description: A Lambda application that calls the Lambda API. Resources: function: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs12.x CodeUri: function/. Description: Call the Lambda API Timeout: 10 # Function's execution role Policies: - AWSLambdaBasicExecutionRole - AWSLambda_ReadOnlyAccess - AWSXrayWriteOnlyAccess Tracing: Active Layers: - !Ref libs libs: Type: AWS::Serverless::LayerVersion Properties: LayerName: blank-nodejs-lib Description: Dependencies for the blank sample app. ContentUri: lib/. CompatibleRuntimes: - nodejs12.x