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 ディレクトリに抽出します。

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

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

レイヤーを作成するときに、レイヤーにいずれかの命令セットアーキテクチャと互換性を持たせるかどうかを指定できます。特定のコンパイルフラグを設定して、arm64アーキテクチャと互換性のあるレイヤーを構築する必要があります。

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

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

Lambda ランタイムごとに、PATH 変数に /opt ディレクトリ内の特定のフォルダが含まれます。レイヤー .zip ファイルアーカイブに同じフォルダ構造を定義すると、関数コードはパスを指定しなくても、レイヤーコンテンツにアクセスできます。

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

各 Lambda ランタイムのレイヤーパス
実行時間 パス

Node.js

nodejs/node_modules

nodejs/node14/node_modules (NODE_PATH)

Python

python

python/lib/python3.9/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.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 実行環境のパス設定の詳細については、「定義されたランタイム環境変数」を参照してください。

言語固有の手順

.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 を使用して新しいレイヤーを作成できます。

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

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

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

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

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

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

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

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

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

  6. (オプション) 互換性のある命令セットアーキテクチャで、1 つまたは両方の値を選択します。

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

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

  9. [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 --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 コマンドを使用して、ステートメントをレイヤーバージョンのアクセス許可ポリシーに追加します。アクセス許可は、各ステートメントで、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"}

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

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

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::Serverless::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