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 ファイルアーカイブにバンドルする必要があります。.zip ファイルアーカイブは、Amazon Simple Storage Service(Amazon S3)またはローカルマシンからレイヤーにアップロードします。Lambdaは、関数の実行環境を設定するときに、レイヤーの内容を /opt ディレクトリに抽出します。

AWS CLI の使用

Lambda コンソールまたは AWS Command Line Interface(AWS CLI)を使用して、レイヤーの .zip ファイルを作成およびアップロードできます。言語固有の手順については、以下のトピックを参照してください。

レイヤーの .zip ファイルアーカイブのコンパイル

関数の場合と同じ手順を使用して、レイヤーコードを .zip ファイルアーカイブに構築します。レイヤー にネイティブコードライブラリが含まれている場合は、Linux 開発マシンを使用してこれらのライブラリをコンパイルしてビルドし、バイナリを Amazon Linux と互換性を持たせる必要があります。

Lambda でライブラリを正しくパッケージ化する方法の 1つは、 AWS Cloud9 を使用することです。詳細については、AWS コンピュートブログの「 Lambda レイヤーを使用して開発プロセスを簡素化する 」を参照してください。

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

Lambdaランタイム ごとに、PATH 変数には /opt ディレクトリ内の特定のフォルダが含まれます。レイヤー .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 を使用して新しいレイヤーを作成できます。

レイヤーには、1 つまたは複数のバージョンを指定できます。レイヤーを作成すると、Lambda はレイヤバージョンをバージョン 1 に設定します。既存のレイヤーバージョンに対して権限を設定できますが、コードを更新したり、その他の設定変更を行うには、レイヤーの新しいバージョンを作成する必要があります。

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

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

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

  3. [ レイヤー設定 ] の [ 名前 ] に、レイヤーの名前を入力します。

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

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

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

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

レイヤーバージョンの削除

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

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

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

レイヤー権限の設定

デフォルトでは、作成したレイヤーは AWS アカウントに対してプライベートになります。ただし、必要に応じて、レイヤーを他のアカウントと共有したり、パブリックにしたりできます。

レイヤーの使用に関するアクセス許可を別のアカウントに付与するには、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"}

アクセス許可は 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