AWS Lambda
개발자 가이드

AWS Lambda 계층

Lambda 함수는 추가 코드와 콘텐츠를 계층의 형태로 가져오도록 구성할 수 있습니다. 하나의 계층은 라이브러리, 사용자 지정 런타임 또는 그 외 종속성을 포함하는 ZIP 아카이브입니다. 배포 패키지에 라이브러리를 포함시킬 필요 없이 계층을 통해 함수에서 라이브러리를 사용할 수 있습니다.

계층을 사용하면 배포 패키지를 작게 유지할 수 있어 개발이 더 수월합니다. 함수 코드를 사용하여 종속 항목들을 설치하고 패키징할 때 발생할 수 있는 오류를 방지할 수 있습니다. Node.js, Python 및 Ruby 함수의 경우에는 배포 패키지를 3 MB 아래에 유지하는 한, Lambda콘솔에서 함수 코드를 개발할 수 있습니다.

참고

함수는 한 번에 최대 5 layers을 사용할 수 있습니다. 함수 및 모든 계층의 압축되지 않은 총 크기는 압축 해제된 배포 패키지 크기 제한인 250 MB을 초과할 수 없습니다. 자세한 내용은 AWS Lambda 한도 단원을 참조하십시오.

여러 계층을 생성하거나 혹은 AWS 및 다른 AWS 고객들이 게시한 계층들을 사용할 수 있습니다. 계층은 특정 AWS 계정, AWS Organizations 또는 모든 계정에 대한 계층 사용 권한을 부여하기 위한 리소스 기반 정책을 지원합니다.

계층들은 함수 실행 환경에서 /opt 디렉터리로 추출됩니다. 각 런타임은 언어에 따라 /opt 아래의 다른 위치에 있는 라이브러리를 찾습니다. 추가 구성 없이도 함수 코드가 라이브러리에 액세스할 수 있도록 계층을 구조화하십시오.

또한 AWS Serverless Application Model(AWS SAM)을 사용하면 여러 계층과 해당 함수의 계층 구성을 각각 관리할 수 있습니다. 자세한 지침은 AWS Serverless Application Model 개발자 안내서에서 서버리스 리소스 선언 단원을 참조하십시오.

계층을 사용하기 위한 함수 구성

함수를 생성하는 도중 또는 그 이후에 함수의 구성에서 최대 5 layers을 지정할 수 있습니다. 사용할 특정 버전의 계층을 선택합니다. 나중에 다른 버전을 사용하려면 함수의 구성을 업데이트하십시오.

함수에 계층을 추가하려면 update-function-configuration 명령을 사용하십시오. 다음 예제에서는 2개의 계층 즉, 함수와 동일한 계정의 계층 그리고 다른 계정의 계층을 하나씩 추가합니다.

$ aws lambda update-function-configuration --function-name my-function \ --layers arn:aws:lambda:us-east-2:123456789012:layer:my-layer:3 \ arn:aws:lambda:us-east-2:210987654321:layer:their-layer:2 { "FunctionName": "test-layers", "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "Runtime": "nodejs8.10", "Role": "arn:aws:iam::123456789012:role/service-role/lambda-role", "Handler": "index.handler", "CodeSize": 402, "Description": "", "Timeout": 5, "MemorySize": 128, "LastModified": "2018-11-14T22:47:04.542+0000", "CodeSha256": "kDHAEY62Ni3OovMwVO8tNvgbRoRa6IOOKqShm7bSWF4=", "Version": "$LATEST", "TracingConfig": { "Mode": "Active" }, "RevisionId": "81cc64f5-5772-449a-b63e-12330476bcc4", "Layers": [ { "Arn": "arn:aws:lambda:us-east-2:123456789012:layer:my-layer:3", "CodeSize": 169 }, { "Arn": "arn:aws:lambda:us-east-2:210987654321:layer:their-layer:2", "CodeSize": 169 } ] }

계층 버전의 전체 ARN을 제공하여 사용할 각 계층의 버전을 지정해야 합니다. 계층이 이미 있는 함수에 계층을 추가하면 이전 목록은 새 목록이 덮어씁니다. 계층 구성을 업데이트 할 때마다 모든 계층을 포함하십시오. 모든 계층을 제거하려면 빈 목록을 지정합니다.

$ aws lambda update-function-configuration --function-name my-function --layers []

함수는 /opt 디렉터리에서 실행되는 동안 해당 계층의 콘텐츠에 액세스할 수 있습니다. 계층은 지정된 순서대로 적용되며, 동일한 이름의 폴더가 병합됩니다. 동일한 파일이 여러 계층에 나타나면 마지막으로 적용된 계층의 버전이 사용됩니다.

한 계층의 생성자는 사용 중인 해당 계층의 버전을 삭제할 수 있습니다. 이 경우, 마치 해당 계층 버전이 여전히 존재하는 것처럼 함수가 계속 실행됩니다. 다만 계층 구성을 업데이트 할 때에는 삭제된 버전에 대한 참조를 제거해야 합니다.

계층 관리

하나의 계층을 생성하려면 이름, 설명, 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 { "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" ] }

publish-layer-version을 호출할 때마다 새 버전을 생성합니다. 계층을 사용하는 함수들은 계층 버전을 직접 참조합니다. 기존의 계층 버전에서는 권한을 구성할 수 있으며 다만 다른 변경 사항을 적용하려면 새 버전을 만들어야 합니다.

함수의 런타임과 호환되는 계층을 찾으려면 list-layers 명령을 사용하십시오.

$ aws lambda list-layers --compatible-runtime python3.7 { "Layers": [ { "LayerName": "my-layer", "LayerArn": "arn:aws:lambda:us-east-2:123456789012:layer:my-layer", "LatestMatchingVersion": { "LayerVersionArn": "arn:aws:lambda:us-east-2:123456789012:layer:my-layer:2", "Version": 2, "Description": "My layer", "CreatedDate": "2018-11-15T00:37:46.592+0000", "CompatibleRuntimes": [ "python3.6", "python3.7" ] } } ] }

런타임 옵션을 생략하면 모든 계층을 나열할 수 있습니다. 응답의 세부 정보는 최신 버전의 계층을 반영합니다. list-layer-versions를 사용하여 계층의 모든 버전을 확인합니다. 버전에 관한 자세한 내용을 확인하려면 get-layer-version 단원을 참조하십시오.

$ aws lambda get-layer-version --layer-name my-layer --version-number 2 { "Content": { "Location": "https://awslambda-us-east-2-layers.s3.us-east-2.amazonaws.com/snapshots/123456789012/my-layer-91e9ea6e-492d-4100-97d5-a4388d442f3f?versionId=GmvPV.309OEpkfN...", "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:2", "Description": "My layer", "CreatedDate": "2018-11-15T00:37:46.592+0000", "Version": 2, "CompatibleRuntimes": [ "python3.6", "python3.7" ] }

응답 내 링크를 사용하면 계층 아카이브를 다운로드할 수 있으며 이 링크는 10분 동안 유효합니다. 계층 버전을 삭제하려면 delete-layer-version 명령을 사용합니다.

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

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

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

런타임 종속 항목들은 하나의 계층에 배치하여 함수 코드 밖으로 옮길 수 있습니다. 여러 계층에 포함된 라이브러리에 대해 함수 코드가 액세스할 수 있도록 /opt 디렉터리의 경로들이 Lambda 런타임에 포함됩니다.

하나의 계층에 여러 라이브러리를 포함시키려면 런타임에서 지원하는 폴더 중 하나에 라이브러리를 배치하십시오.

  • Node.jsnodejs/node_modules, nodejs/node8/node_modules(NODE_PATH)

    예 Node.js용 AWS X-Ray SDK

    xray-sdk.zip └ nodejs/node_modules/aws-xray-sdk
  • Pythonpython, python/lib/python3.7/site-packages(사이트 디렉터리)

    예 Pillow

    pillow.zip │ python/PIL └ python/Pillow-5.3.0.dist-info
  • Javajava/lib(classpath)

    예 Jackson

    jackson.zip └ java/lib/jackson-core-2.2.3.jar
  • Rubyruby/gems/2.5.0(GEM_PATH), ruby/lib(RUBY_LIB)

    예 JSON

    json.zip └ ruby/gems/2.5.0/ | build_info | cache | doc | extensions | gems | └ json-2.1.0 └ specifications └ json-2.1.0.gemspec
  • 모두bin(PATH), lib(LD_LIBRARY_PATH)

    예 JQ

    jq.zip └ bin/jq

Lambda 실행 환경의 경로 설정에 관한 자세한 내용은 Lambda 함수에서 사용할 수 있는 환경 변수 단원을 참조하십시오.

계층 권한

계층 사용 권한은 리소스에서 관리됩니다. 하나의 계층이 있는 함수를 구성하려면 해당 계층 버전에서 GetLayerVersion을 호출할 수 있는 권한이 필요합니다. 계정 내 함수에 대해서는 사용자 정책 또는 함수의 리소스 기반 정책에서 이러한 권한을 얻을 수 있습니다. 다른 계정에서 계층을 사용하려면 사용자 정책에 대한 권한이 필요하며, 다른 계정의 소유자는 리소스 기반 정책으로 계정 권한을 부여해야 합니다.

더 많은 예제는 계층에 다른 계정에 대한 액세스 권한 부여 단원을 참조하십시오.