Lambda レイヤー - AWS Lambda

Lambda レイヤー

レイヤーは、.zip ファイルアーカイブを使用する関数でデプロイに使用します。コンテナイメージとして定義された関数では、コンテナイメージの作成時に、優先ランタイムとすべてのコード依存関係をパッケージ化します。詳細については、AWS コンピューティングブログの「コンテナイメージの Lambda レイヤーと拡張機能の使用」を参照してください。

Lambda レイヤーを使用して、関数でコードを共有できます。レイヤーには、コードライブラリ、カスタムランタイムやその他の依存関係が含まれます。レイヤーは .zip アーカイブデプロイパッケージのサイズを減らすのに役立ちます。これは、レイヤーがデプロイパッケージに含まれていないためです。

関数では一度に 5 つのレイヤー 使用できます。関数とすべてのレイヤーの解凍後の合計サイズが、解凍後のデプロイパッケージのサイズ制限 250 MB を超えることはできません。詳細については、「Lambda のクォータ」をご参照ください。

独自のレイヤーを作成することも、AWS または AWS のお客様が公開したレイヤーを使用することもできます。レイヤーは、特定の AWS アカウント (AWS Organizations)、またはすべてのアカウントに対して、レイヤーの使用に関するアクセス権限を付与するためのリソースベースのポリシーをサポートしています。

また、AWS サーバーレスアプリケーションモデル (AWS SAM) を使用して、レイヤー、および関数のレイヤー設定を管理することもできます。手順については、AWS サーバーレスアプリケーションモデル 開発者ガイド の「レイヤーの使用」をご参照ください。

レイヤーを作成する

新しいレイヤーを作成すると、Lambda によってレイヤーがバージョン 1 として作成されます。アクセス許可の設定は既存のレイヤーバージョンでできますが、他の変更を加えるには新しいバージョンを作成する必要があります。

レイヤーを作成するには (コンソール)

  1. Lambda コンソールのレイヤーのページを開きます。

  2. [Create layer] (レイヤーの作成) を選択します。

  3. [Name] (名前) で、レイヤーの名前を入力します。

  4. (オプション) [Description] (説明) で、レイヤーの説明を入力します。

  5. レイヤーコードをアップロードするには、次のいずれかを実行します。

    • コンピュータから .zip ファイルをアップロードするには、[Upload a .zip file] (.zip ファイルをアップロード) を選択し、.zip ファイルを選択し、[Open] (開く) を選択します。

    • Amazon Simple Storage Service (Amazon S3) からファイルをアップロードするには、[Upload a file from Amazon S3] (S3 からファイルをアップロードする) を選択します。その後、[Amazon S3 link URL] (S3 のリンク URL) で、ファイルへのリンクを入力します。

  6. (オプション) [Compatible runtimes] (互換性のあるランタイム) で、最大 15 回のランタイムを選択します。

  7. (オプション) [License] (ライセンス) で、必要なライセンス情報を入力します。

  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 を呼び出すたびに、レイヤーの新しいバージョンを作成します。

レイヤーを管理する

Lambda 関数のランタイムと互換性のあるレイヤーを見つけるには、list-layers コマンドを使用します。

aws lambda list-layers --compatible-runtime python3.8

次のような出力が表示されます。

{ "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", "python3.8", ] } } ] }

すべてのレイヤーを一覧表示するには、ランタイムオプションを省略できます。レスポンスの詳細は、レイヤーの最新バージョンが反映されます。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", "python3.8" ] }

レスポンスのリンクを使用すると、レイヤーのアーカイブをダウンロードできます。リンクは 10 分間有効です。

レイヤーのバージョンを削除するには、delete-layer-version コマンドを使用します。

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

レイヤーのバージョンを削除すると、そのバージョンを使用するように関数を設定することはできなくなります。ただし、該当バージョンをすでに使用している関数は引き続きそのバージョンにアクセスできます。バージョン番号はレイヤー名には再利用されません。

ライブラリの依存関係をレイヤーに含める

各 Lambda ランタイムは、PATH 変数に特定の /opt ディレクトリフォルダを追加します。レイヤーが同じフォルダ構造を使用している場合、関数コードはパスを指定しなくても、レイヤーコンテンツにアクセスできます。

次の表に、各ランタイムがサポートするフォルダパスを示します。

各 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

例 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 関数を設定するには、そのレイヤーバージョンの GetLayerVersion を呼び出すためのアクセス権限が必要です。アカウントの関数については、ユーザーポリシーからこの権限を取得できます。

別のアカウントでレイヤーを使用するには、他のアカウントの所有者は、リソースベースのポリシーで自分のアカウントにアクセス許可を付与する必要があります。

レイヤーの使用に関するアクセス許可を別のアカウントに付与するには、add-layer-version-permission コマンドを使用して、ステートメントをレイヤーバージョンのアクセス許可ポリシーに追加します。アクセス許可は、各ステートメントで、1 つのアカウント、すべてのアカウント、または組織に付与することができます。

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"}

アクセス許可は、単一バージョンのレイヤーにのみ適用されます。新しいレイヤーバージョンを作成するたびに、このプロセスを繰り返します。

その他の例については、「他のアカウントへのアクセス権をレイヤーに付与する」を参照してください。

レイヤーを使用するようにするための関数の設定

関数の作成中または作成後に、Lambda 関数の設定で、最大 5 つのレイヤー を指定できます。特定のバージョンのレイヤーを選択できます。後に別のバージョンを使用する場合は、関数の設定を更新できます。

レイヤーを関数に追加するには、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": "nodejs12.x", "Role": "arn:aws:iam::123456789012:role/service-role/lambda-role", "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 } ], "RevisionId": "81cc64f5-5772-449a-b63e-12330476bcc4", ... }

使用する各レイヤーのバージョンを指定するには、レイヤーバージョンの完全な Amazon リソースネーム (ARN) を指定します。既にレイヤーがある関数にレイヤーを追加すると、新しいリストによって前のリストが上書きされます。レイヤー設定が更新されるたびに、すべてのレイヤーが追加されます。すべてのレイヤーを削除するには、空のリストを指定します。

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

実行中の間関数は、/opt ディレクトリ内にあるレイヤーの内容にアクセスできます。レイヤーは、同じ名前のフォルダをマージして、指定した順序で適用されます。複数のレイヤーに同じファイルが表示された場合は、最後に適用されたレイヤーのバージョンが使用されます。

レイヤーの作成者は、使用しているレイヤーのバージョンを削除することができます。この場合、関数は引き続き、あたかもレイヤーが存在しているように実行し続けます。ただし、レイヤー設定を更新する場合は、削除したバージョンへの参照を削除する必要があります。

更新されたレイヤーバージョンを関数に追加する

update-function-configuration コマンドを使用して、更新されたレイヤーバージョンを関数に追加します。

このコマンドの layers パラメータは、関数に追加するすべてのレイヤーバージョンのリストです。関数に既にレイヤーがある場合、新しいリストは前のリストを上書きします。レイヤーバージョンを 1 つだけ更新する場合は、layers パラメーターに既存のレイヤーバージョンの ARN を含める必要があります。

次の手順では、更新されたレイヤーコードを「layer.zip」という名前のローカルファイルにパッケージ化していることを前提としています。

更新されたレイヤーバージョンを関数に追加する

  1. (オプション) 新しいレイヤーバージョンがまだ公開されていない場合は、新しいバージョンを公開します。

    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
  2. (オプション) 関数に複数のレイヤーがある場合は、関数に関連付けられた現在のレイヤーバージョンを取得します。

    aws lambda get-function-config --function-name my-function --query 'Layers[*].Arn' --output yaml

    (オプション) レイヤー名に基づいて、レイヤーの最新バージョンを取得することもできます。

    aws lambda list-layer-versions --layer-name my-layer --query 'LayerVersions[0].LayerVersionArn'
  3. 新しいレイヤーバージョンを関数に追加します。以下のコマンド例では、関数には「other-layer:5」という名前のレイヤーバージョンもあります。

    aws lambda update-function-configuration --function-name my-function \ --layers arn:aws:lambda:us-east-2:123456789012:layer:my-layer:2 \ arn:aws:lambda:us-east-2:123456789012:layer:other-layer:5

AWS CloudFormation および AWS SAM

アプリケーション内のレイヤーの作成とマッピングを自動化するには、AWS CloudFormation テンプレートの AWS SAMを使用します。AWS::Serverless::LayerVersion リソースタイプによって、Lambda 関数設定から参照できるレイヤーバージョンが作成されます。

blank-nodejs/template.yml – サーバーレスリソース

AWSTemplateFormatVersion: '2010-09-09' Transform: 'AWS::Serverless-2016-10-31' Description: An AWS 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 AWS 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

依存関係を更新してデプロイすると、AWS SAM によってレイヤーの新しいバージョンが作成され、マッピングが更新されます。依存関係を変更せずにコードに変更をデプロイすると、AWS SAM はレイヤーの更新をスキップし、アップロード時間を節約します。

サンプルアプリケーション

このガイドの GitHub リポジトリには、依存関係管理のためのレイヤーの使用方法を示すサンプルアプリケーションが用意されています。

空白のサンプルアプリの詳細については、「AWS Lambda の blank 関数サンプルアプリケーション」をご参照ください。