Lambda 関数でのレイヤーの使用
Lambda レイヤーは、追加のコードまたはデータを含むことができる .zip ファイルアーカイブです。レイヤーには、ライブラリ、カスタムランタイム、データ、または設定ファイルを含めることができます。レイヤーを使用して、デプロイパッケージのサイズを減らし、コードの共有と責任の分離を促進することで、ビジネスロジックの記述をより迅速に繰り返すことができます。
レイヤーは、.zip ファイルアーカイブとしてデプロイされた Lambda 関数でのみ使用できます。コンテナイメージとして定義された関数では、コンテナイメージの作成時に、優先ランタイムとすべてのコード依存関係をパッケージ化します。詳細については、AWS コンピューティングブログの「コンテナイメージの Lambda レイヤーと拡張機能を使用する
セクション
関数を設定してレイヤーを使用する
Lambda 関数には最大 5 つのレイヤーを追加できます。関数とすべてのレイヤーの解凍後の合計サイズは、解凍後のデプロイパッケージのサイズクォータである 250 MB を超えることはできません。詳細については、「Lambda クォータ」を参照してください。
別の AWS アカウントによって公開されたレイヤーを関数が消費する場合、関数は削除後にレイヤーバージョンを引き続き使用することができます。または、レイヤーへのアクセス権限が呼び出されます。しかし、削除されたレイヤーバージョンを使用して新しい関数を作成することはできません。
関数に追加するレイヤーに、関数のランタイムおよび命令セットアーキテクチャと互換性があることを確認します。
コンソールでレイヤーを設定する
関数にレイヤーを追加する
Lambda コンソールの [Functions
] (関数) ページを開きます。 -
設定する関数を選択します。
-
[Layers] (レイヤー) で [Add a layer] (レイヤーの追加) をクリックします。
-
[Choose a layer (レイヤーを選択する)]で、レイヤーソースを選択します。
-
AWSレイヤーまたはカスタムレイヤーレイヤーソースの場合:
-
プルダウンメニューからレイヤーを選択します。
-
[Version (バージョン)]のプルダウンメニューからレイヤーバージョンを選択します。各レイヤーバージョンエントリには、互換性のあるランタイムとアーキテクチャが一覧表示されます。
[Add] (追加) を選択します。
-
-
ARN を指定するレイヤーソースの場合:
-
テキストボックスに ARN を入力し、[Verify (検証)] を選択します。
[Add] (追加) を選択します。
-
レイヤーを追加する順序は、Lambda が後でレイヤーコンテンツを実行環境にマージする順序と同じです。レイヤーのマージ順序はコンソールを使用して変更できます。
関数のレイヤー順序を更新する
Lambda コンソールの [Functions
] (関数) ページを開きます。 -
設定する関数を選択します。
-
[Layers] (レイヤー) で [Edit] (編集) をクリックします。
-
レイヤーの 1 つを選択します。
-
[Merge earlier (前にマージする)] または [Merge later (後にマージする)] を選択して、レイヤーの順序を調整します。
-
[Save] を選択します。
レイヤーがバージョンされ、各レイヤーバージョンが不変です。レイヤーの所有者は更新されたコンテンツを提供するために新しいレイヤーバージョンをリリースすることができます。関数のレイヤーバージョンを更新するには、コンソールを使用します。
関数のレイヤーバージョンを更新する
Lambda コンソールの [Functions
] (関数) ページを開きます。 -
[Additional resources] (その他のリソース) で、[Layers] (レイヤー) をクリックします。
-
変更するレイヤーを選択します。
-
[Functions using this version] (このバージョンを使用する関数) で変更する関数を選択した後、[Edit] (編集) をクリックします。
-
[Layer version] (レイヤーバージョン) から、変更するレイヤバージョンを選択します。
-
[Update functions] (関数を更新) をクリックします。
AWS アカウントをまたいで関数のレイヤーバージョン更新することはできません。
API を使用してレイヤーを設定する
レイヤーを関数に追加するには、update-function-configuration コマンドを使用します。以下の例では、2 つのレイヤーを追加します。同じ AWS アカウントから関数として追加する場合と、別のアカウントから追加する場合です。
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:111122223333: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:111122223333:layer:their-layer:2", "CodeSize": 169 } ], "RevisionId": "81cc64f5-5772-449a-b63e-12330476bcc4", ... }
使用する各レイヤーのバージョンを指定するには、レイヤーバージョンの完全な Amazon リソースネーム (ARN) を指定します。既にレイヤーがある関数にレイヤーを追加すると、前のリストは上書きされます。レイヤー設定を更新するたびに、全てのレイヤーを含めるように注意してください。レイヤーを追加する順序は、Lambda が後でレイヤーコンテンツを実行環境に抽出する順序と同じです。
すべてのレイヤーを削除するには、空のリストを指定します。
aws lambda update-function-configuration --function-name my-function --layers []
レイヤーの作成者は、バージョンのレイヤーを削除することができます。その関数のレイヤーを使用している場合、レイヤーバージョンがあたかも存在しているように、関数は実行し続けます。ただし、レイヤー設定を更新する場合は、削除したバージョンへの参照を削除する必要があります。
レイヤーがバージョンされ、各レイヤーバージョンが不変です。レイヤーの所有者は更新されたコンテンツを提供するために新しいレイヤーバージョンをリリースすることができます。API を使用して、関数が使用するレイヤーバージョンを更新できます。
関数のレイヤーバージョンを更新する
関数の 1 つ以上のレイヤーバージョンを更新するには、update-function-configurationコマンドを使用します。レイヤーバージョンの 1 つを更新している場合でも、このコマンドに--layers
オプションを使用することで、関数のすべてのレイヤーバージョンを含めることができます。関数に既にレイヤーがある場合、新しいリストは前のリストを上書きします。
次の手順では、更新されたレイヤーコードをlayer.zip
という名前のローカルファイルにパッケージ化していることを前提としています。
-
(オプション) 新しいレイヤーバージョンがまだ公開されていない場合は、新しいバージョンを公開します。
aws lambda publish-layer-version --layer-name
my-layer
--description"My layer"
--license-info"MIT"
\ --zip-file"fileb://layer.zip"
--compatible-runtimespython3.6 python3.7
-
(オプション) 関数に複数のレイヤーがある場合は、関数に関連付けられた現在のレイヤーバージョンを取得します。
aws lambda get-function-configuration --function-name
my-function
--query 'Layers[*].Arn' --output yaml -
新しいレイヤーバージョンを関数に追加します。以下のコマンド例では、関数には「
other-layer:5
」という名前のレイヤーバージョンもあります。aws lambda update-function-configuration --function-name
my-function
\ --layersarn:aws:lambda:us-east-2:123456789012:layer:my-layer:2
\arn:aws:lambda:us-east-2:123456789012:layer:other-layer:5
関数からレイヤーコンテンツにアクセスする
Lambda 関数にレイヤーを含めると、Lambda は関数実行環境で/opt
ディレクトリにレイヤーコンテンツを抽出します。Lambda は、関数によって一覧表示された順序 (低から高) でレイヤーを抽出します。Lambda は同じ名前のフォルダをマージします。複数のレイヤーに同じファイルが表示された場合、関数は最後に抽出されたレイヤーのバージョンを使用します。
各 Lambda ランタイム は、PATH 変数に特定の /opt
ディレクトリフォルダを追加します。関数コードはパスを指定しなくても、レイヤーコンテンツにアクセスできます。Lambda 実行環境のパス設定の詳細については、「定義されたランタイム環境変数」を参照してください。
レイヤー情報の確認
Lambda 関数のランタイムと互換性のあるレイヤーを AWS 関数で特定するには、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", ] } } ] }
アカウントの全てのレイヤーをリスト化するには、 --compatible-runtime
オプションを省略します。レスポンスの詳細は、レイヤーの最新バージョンが反映されます。
list-layer-versions コマンドを使用して、最新バージョンのレイヤーを取得することができます。
aws lambda list-layer-versions --layer-name my-layer --query 'LayerVersions[0].LayerVersionArn
レイヤーのアクセス許可を追加する
レイヤーで Lambda 関数を使用するには、そのレイヤーバージョンの GetLayerVersion API を呼び出すためのアクセス許可が必要です。AWS アカウントの関数については、ユーザーポリシーからこの権限を取得できます。
別のアカウントでレイヤーを使用するには、そのアカウントの所有者は、リソースベースのポリシーで自分のアカウントにアクセス許可を付与する必要があります。
例については、「他のアカウントへのアクセス権をレイヤーに付与する」を参照してください。
AWS SAM を使用して関数にレイヤーを追加する
アプリケーション内のレイヤーの作成とマッピングを自動化するには、AWS Serverless Application Model ( 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 によってレイヤーの新しいバージョンが作成され、マッピングが更新されます。
サンプルアプリケーション
このガイドの GitHub リポジトリには、依存関係管理のためのレイヤーの使用方法を示すサンプルアプリケーションが用意されています。
-
Node.js - blank-nodejs
-
Python - blank-python
-
Ruby - blank-ruby
-
Java - blank-java
空白のサンプルアプリの詳細については、「AWS Lambda の blank 関数サンプルアプリケーション」を参照してください。その他のサンプルについては、「Lambda サンプルアプリケーション」を参照してください。