AWS Lambda
開発者ガイド

AWS Lambda レイヤー

追加のコードとコンテンツをレイヤーの形式で取り込むように Lambda 関数を設定することができます。レイヤーは、ライブラリ、カスタムランタイム、またはその他の依存関係を含む ZIP アーカイブです。レイヤーを使用することで、関数のライブラリを使用することができます。デプロイパッケージに含める必要はありません。

レイヤーを使用すると、デプロイパッケージを小さくすることができるため、開発しやすくなります。関数コードを使用して依存関係をインストールしてパッケージ化するときに発生する可能性のあるエラーを回避することができます。Node.js、Python、Ruby 関数の場合は、デプロイパッケージを 3 MB に保管している場合を除き、Lambda コンソールで関数コードをデプロイすることができます。

注記

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

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

レイヤーは、関数実行環境の /opt ディレクトリに抽出されます。ランタイムごとに、言語に応じて、/opt のさまざまな場所のライブラリが検索されます。関数コードを使用して、追加設定せずにライブラリにアクセスできるように、レイヤーを構築します。

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

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

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

レイヤーを関数に追加するには、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": "nodejs8.10", "Role": "arn:aws:iam::123456789012:role/service-role/lambda-role", "Handler": "index.handler", "CodeSize": 402, "Description": "", "Timeout": 5, "MemorySize": 128, "LastModified": "2018-11-14T22:47:04.542+0000", "CodeSha256": "kDHAEY62Ni3OovMwVO8tNvgbRoRa6IOOKqShm7bSWF4=", "Version": "$LATEST", "TracingConfig": { "Mode": "Active" }, "RevisionId": "81cc64f5-5772-449a-b63e-12330476bcc4", "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 } ] }

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

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

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

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

レイヤーを管理する

レイヤーを作成するには、レイヤーと互換性のある名前、説明、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 { "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" ] }

publish-layer-version を呼び出すたびに、新しいバージョンを作成します。レイヤーを使用する関数は、レイヤーバージョンを直接参照します。アクセス許可の設定は既存のレイヤーバージョンでできますが、他の変更を加えるには新しいバージョンを作成する必要があります。

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

$ aws lambda list-layers --compatible-runtime python3.7 { "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" ] } } ] }

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

レスポンスのリンクを使用すると、レイヤーのアーカイブをダウンロードできます。このリンクは 10 分間有効です。レイヤーのバージョンを削除するには、delete-layer-version コマンドを使用します。

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

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

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

関数コードからランタイム依存関係を移動するには、それらをレイヤーに配置します。Lambda ランタイムには、関数コードを使用して、レイヤーに含まれるライブラリにアクセスできることを確認する、/opt ディレクトリのパスが含まれます。

ライブラリをレイヤーに含めるには、ランタイムでサポートされているいずれかのフォルダにそれらを配置します。

  • Node.jsnodejs/node_modulesnodejs/node8/node_modules (NODE_PATH)

    例 AWS X-Ray SDK for Node.js

    xray-sdk.zip └ nodejs/node_modules/aws-xray-sdk
  • Pythonpython, python/lib/python3.7/site-packages (サイトディレクトリ)

    例 Pillow

    pillow.zip │ python/PIL └ python/Pillow-5.3.0.dist-info
  • Javajava/lib (classpath)

    例 Jackson

    jackson.zip └ java/lib/jackson-core-2.2.3.jar
  • Rubyruby/gems/2.5.0 (GEM_PATH)、ruby/lib (RUBY_LIB)

    例 JSON

    json.zip └ ruby/gems/2.5.0/ | build_info | cache | doc | extensions | gems | └ json-2.1.0 └ specifications └ json-2.1.0.gemspec
  • すべてbin (PATH)、lib (LD_LIBRARY_PATH)

    例 JQ

    jq.zip └ bin/jq

Lambda 実行環境のパス設定の詳細については、「Lambda 関数で使用できる環境変数」を参照してください。

レイヤーのアクセス許可

レイヤーの使用に関するアクセス許可は、リソース上で管理されます。レイヤーで関数を設定するには、そのレイヤーバージョンの GetLayerVersion を呼び出すためのアクセス許可が必要です。アカウントの関数では、このアクセス許可をユーザーポリシーか、関数のリソースベースのポリシーから取得できます。別のアカウントでレイヤーを使用するには、ユーザーポリシーに対するアクセス許可が必要で、他のアカウントの所有者はリソースベースのポリシーでアカウントのアクセス許可を付与する必要があります。

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