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

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 개발자 안내서계층 작업을 참조하세요.

참고

Node.js 런타임 16 이하의 경우, Lambda가 계층의 ES 모듈 종속성을 지원하지 않습니다. Lambda는 Node.js 18에 대한 ES 모듈 종속성을 지원합니다.

계층 콘텐츠 만들기

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

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

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

계층을 만들 때 계층이 명령 세트 아키텍처 중 하나 또는 둘 다와 호환되는지 여부를 지정할 수 있습니다. arm64 아키텍처와 호환되는 계층을 빌드하려면 특정 컴파일 플래그를 설정해야 할 수 있습니다.

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

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

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

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

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

Node.js

nodejs/node_modules

nodejs/node14/node_modules (NODE_PATH)

nodejs/node16/node_modules (NODE_PATH)

nodejs/node18/node_modules (NODE_PATH)

Python

python

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

Java

java/lib (CLASSPATH)

Ruby

ruby/gems/2.7.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.7.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 실행 환경의 경로 설정에 관한 자세한 내용은 정의된 런타임 환경 변수 단원을 참조하세요.

언어별 지침

.zip 파일 아카이브를 만드는 방법에 대한 언어별 지침은 다음 주제를 참조하세요.

Node.js

.zip 파일 아카이브를 사용하여 Node.js Lambda 함수 배포

Python

.zip 파일 아카이브를 사용하여 Python Lambda 함수 배포

Ruby

.zip 파일 아카이브를 사용하여 Ruby Lambda 함수 배포

Java

.zip 또는 JAR 파일 아카이브를 사용하여 Java Lambda 함수 배포

Go

.zip 파일 아카이브를 사용하여 Go Lambda 함수 배포

C#

.zip 파일 아카이브를 사용하여 C# Lambda 함수 배포

PowerShell

.zip 파일 아카이브를 사용하여 PowerShell 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에서 파일 업로드(Upload a file from Amazon S3)를 선택합니다. 그런 다음 Amazon S3 링크 URL에 파일 링크를 입력합니다.

  6. (선택 사항) 호환 아키텍처에서 값을 하나 또는 둘 다 선택합니다.

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

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

  9. 생성을 선택합니다.

계층을 생성하려면(API)

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

aws lambda publish-layer-version --layer-name my-layer \ --description "My layer" \ --license-info "MIT" \ --zip-file fileb://layer.zip \ --compatible-runtimes python3.6 python3.7 python3.8 \ --compatible-architectures "arm64" "x86_64"

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

{ "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, "CompatibleArchitectures": [ "arm64", "x86_64" ], "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 111122223333 --version-number 1 --output text

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

e210ffdc-e901-43b0-824b-5fcd0dd26d16 {"Sid":"xaccount","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::111122223333: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라는 계층을 만들고 계층 속성을 사용하여 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::Lambda::LayerVersion Properties: LayerName: blank-nodejs-lib Description: Dependencies for the blank sample app. Content: S3Bucket: my-bucket-region-123456789012 S3Key: layer.zip CompatibleRuntimes: - nodejs12.x