Lambda 関数でのレイヤーの使用 - AWS Lambda

Lambda 関数でのレイヤーの使用

Lambda レイヤーは、追加のコードまたはデータを含むことができる .zip ファイルアーカイブです。レイヤーには、ライブラリ、カスタムランタイム、データ、または設定ファイルを含めることができます。レイヤーを使用して、デプロイパッケージのサイズを減らし、コードの共有と責任の分離を促進することで、ビジネスロジックの記述をより迅速に繰り返すことができます。

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

関数を設定してレイヤーを使用する

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

別の AWS アカウントによって公開されたレイヤーを関数が消費する場合、関数は削除後にレイヤーバージョンを引き続き使用することができます。または、レイヤーへのアクセス権限が呼び出されます。しかし、削除されたレイヤーバージョンを使用して新しい関数を作成することはできません。

注記

関数に追加するレイヤーに、関数のランタイムおよび命令セットアーキテクチャと互換性があることを確認します。

コンソールでレイヤーを設定する

関数にレイヤーを追加する

  1. Lambda コンソールの [Functions] (関数) ページを開きます。

  2. 設定する関数を選択します。

  3. [Layers] (レイヤー) で [Add a layer] (レイヤーの追加) をクリックします。

  4. [Choose a layer (レイヤーを選択する)]で、レイヤーソースを選択します。

  5. AWSレイヤーまたはカスタムレイヤーレイヤーソースの場合:

    1. プルダウンメニューからレイヤーを選択します。

    2. [Version (バージョン)]のプルダウンメニューからレイヤーバージョンを選択します。各レイヤーバージョンエントリには、互換性のあるランタイムとアーキテクチャが一覧表示されます。

    3. [Add] (追加) を選択します。

  6. ARN を指定するレイヤーソースの場合:

    1. テキストボックスに ARN を入力し、[Verify (検証)] を選択します。

    2. [Add] (追加) を選択します。

レイヤーを追加する順序は、Lambda が後でレイヤーコンテンツを実行環境にマージする順序と同じです。レイヤーのマージ順序はコンソールを使用して変更できます。

関数のレイヤー順序を更新する

  1. Lambda コンソールの [Functions] (関数) ページを開きます。

  2. 設定する関数を選択します。

  3. [Layers] (レイヤー) で [Edit] (編集) をクリックします。

  4. レイヤーの 1 つを選択します。

  5. [Merge earlier (前にマージする)] または [Merge later (後にマージする)] を選択して、レイヤーの順序を調整します。

  6. [Save] を選択します。

レイヤーがバージョンされ、各レイヤーバージョンが不変です。レイヤーの所有者は更新されたコンテンツを提供するために新しいレイヤーバージョンをリリースすることができます。関数のレイヤーバージョンを更新するには、コンソールを使用します。

関数のレイヤーバージョンを更新する

  1. Lambda コンソールの [Functions] (関数) ページを開きます。

  2. [Additional resources] (その他のリソース) で、[Layers] (レイヤー) をクリックします。

  3. 変更するレイヤーを選択します。

  4. [Functions using this version] (このバージョンを使用する関数) で変更する関数を選択した後、[Edit] (編集) をクリックします。

  5. [Layer version] (レイヤーバージョン) から、変更するレイヤバージョンを選択します。

  6. [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という名前のローカルファイルにパッケージ化していることを前提としています。

  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-configuration --function-name my-function --query 'Layers[*].Arn' --output yaml
  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

関数からレイヤーコンテンツにアクセスする

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 リポジトリには、依存関係管理のためのレイヤーの使用方法を示すサンプルアプリケーションが用意されています。

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