Lambda レイヤー
『Lambda』では、複数の関数で共通して使うライブラリや設定ファイルをレイヤー(Layer)としてまとめて管理できます。レイヤーを使うと、各関数のデプロイパッケージにライブラリを含める必要がなくなり、パッケージサイズの削減・ライブラリのバージョン統一・更新コストの低減が実現できます。レイヤーは aws lambda publish-layer-version で公開し、aws lambda update-function-configuration --layers で関数にアタッチします。レイヤーは最大5つまで同時にアタッチでき、展開後は /opt 以下に配置されます。
構文
# -----------------------------------------------
# レイヤーのディレクトリ構造(Python の場合)
# -----------------------------------------------
# Python ランタイム用のディレクトリ構造を作成します
# python/lib/python3.x/site-packages/ 以下にパッケージを配置します
# 例:
# my-layer/
# └── python/
# └── lib/
# └── python3.12/
# └── site-packages/
# ├── requests/
# └── boto3/
# -----------------------------------------------
# aws lambda publish-layer-version
# -----------------------------------------------
# aws lambda publish-layer-version \
# --layer-name {レイヤー名} \
# --zip-file fileb://{zipファイル} \
# --compatible-runtimes {ランタイム} \
# --description {説明}
# → ZIP ファイルをアップロードして新しいレイヤーバージョンを公開します
# 例: aws lambda publish-layer-version \
# --layer-name eva-common-libs \
# --zip-file fileb://layer.zip \
# --compatible-runtimes python3.12 \
# --description "Shinji 用の共通ライブラリレイヤー"
# -----------------------------------------------
# aws lambda update-function-configuration --layers
# -----------------------------------------------
# aws lambda update-function-configuration \
# --function-name {関数名} \
# --layers {レイヤーARN} [{レイヤーARN} ...]
# → 関数にレイヤーをアタッチします(既存の設定を上書きします)
# レイヤー ARN の形式:
# arn:aws:lambda:{リージョン}:{アカウントID}:layer:{レイヤー名}:{バージョン番号}
# 例: aws lambda update-function-configuration \
# --function-name shinji-handler \
# --layers arn:aws:lambda:ap-northeast-1:111122223333:layer:eva-common-libs:3
# -----------------------------------------------
# レイヤーの一覧・詳細確認
# -----------------------------------------------
# aws lambda list-layers
# → アカウントに登録されているレイヤーの最新バージョン一覧を表示します
# 例: aws lambda list-layers --region ap-northeast-1
# aws lambda list-layer-versions --layer-name {レイヤー名}
# → 指定したレイヤーのすべてのバージョン履歴を表示します
# 例: aws lambda list-layer-versions --layer-name eva-common-libs
# aws lambda get-layer-version \
# --layer-name {レイヤー名} \
# --version-number {バージョン番号}
# → 特定バージョンのレイヤー詳細(ARN・互換ランタイム等)を表示します
# 例: aws lambda get-layer-version \
# --layer-name eva-common-libs \
# --version-number 3
構文一覧
| コマンド / 操作 | 概要 |
|---|---|
aws lambda publish-layer-version | ZIP ファイルからレイヤーの新しいバージョンを公開します。--compatible-runtimes で対応ランタイムを指定します。 |
aws lambda update-function-configuration --layers | 関数にアタッチするレイヤーを設定します。複数の ARN をスペース区切りで指定でき、既存の設定を上書きします。 |
aws lambda list-layers | アカウントに登録されているレイヤーの最新バージョン一覧を表示します。 |
aws lambda list-layer-versions | 指定したレイヤーのすべてのバージョン履歴を表示します。 |
aws lambda get-layer-version | 特定バージョンのレイヤー詳細(ARN・互換ランタイム・サイズ等)を表示します。 |
aws lambda get-function-configuration | 関数の設定情報を取得します。アタッチ済みのレイヤー ARN も確認できます。 |
| レイヤーの ARN 形式 | arn:aws:lambda:{リージョン}:{アカウントID}:layer:{レイヤー名}:{バージョン番号} の形式です。バージョンは 1 から始まる整数で、公開するたびにインクリメントされます。 |
| レイヤーの配置パス(Python) | ZIP 内の python/lib/python3.x/site-packages/ に配置したパッケージが Lambda 実行時に /opt/python/lib/python3.x/site-packages/ として展開されます。 |
| 同時アタッチ数の上限 | 1 つの Lambda 関数にアタッチできるレイヤーは最大 5 つです。展開後の合計サイズ(関数 + レイヤー)は 250 MB(非圧縮)が上限です。 |
| レイヤーの共有 | aws lambda add-layer-version-permission でアカウント間・組織間でのレイヤー共有が可能です。AWS 提供の公開レイヤー(例: AWS SDK for pandas)も利用できます。 |
サンプルコード
# ----------------------------------------------- # Shinji の Lambda 関数で使う requests ライブラリを # レイヤーとしてパッケージ化して公開します # ディレクトリ構造: python/lib/python3.12/site-packages/ # ----------------------------------------------- # レイヤー用のディレクトリ構造を作成します mkdir -p eva-common-layer/python/lib/python3.12/site-packages # pip で site-packages にインストールします pip install requests \ -t eva-common-layer/python/lib/python3.12/site-packages/ # ZIP に圧縮します cd eva-common-layer zip -r ../eva-common-layer.zip python/ cd .. # レイヤーとして公開します(バージョン 1 が作成されます) aws lambda publish-layer-version \ --layer-name eva-common-libs \ --zip-file fileb://eva-common-layer.zip \ --compatible-runtimes python3.12 \ --description "Eva パイロット共通ライブラリ (requests)" \ --region ap-northeast-1
$ mkdir -p eva-common-layer/python/lib/python3.12/site-packages
$ pip install requests -t eva-common-layer/python/lib/python3.12/site-packages/
Collecting requests
Downloading requests-2.31.0-py3-none-any.whl (62 kB)
Successfully installed certifi-2024.2.2 charset-normalizer-3.3.2 idna-3.6 requests-2.31.0 urllib3-2.2.1
$ cd eva-common-layer && zip -r ../eva-common-layer.zip python/ && cd ..
adding: python/ (stored 0%)
adding: python/lib/ (stored 0%)
adding: python/lib/python3.12/ (stored 0%)
adding: python/lib/python3.12/site-packages/ (stored 0%)
adding: python/lib/python3.12/site-packages/requests/ (stored 0%)
$ aws lambda publish-layer-version \
> --layer-name eva-common-libs \
> --zip-file fileb://eva-common-layer.zip \
> --compatible-runtimes python3.12 \
> --description "Eva パイロット共通ライブラリ (requests)" \
> --region ap-northeast-1
{
"Content": {
"Location": "https://awslambda-ap-northeast-1-layers.s3.amazonaws.com/...",
"CodeSha256": "abc123XYZhash==",
"CodeSize": 385024
},
"LayerArn": "arn:aws:lambda:ap-northeast-1:111122223333:layer:eva-common-libs",
"LayerVersionArn": "arn:aws:lambda:ap-northeast-1:111122223333:layer:eva-common-libs:1",
"Description": "Eva パイロット共通ライブラリ (requests)",
"CreatedDate": "2026-03-26T09:00:00.000+0000",
"Version": 1,
"CompatibleRuntimes": [
"python3.12"
]
}
# -----------------------------------------------
# 公開したレイヤー(バージョン 1)を
# Shinji・Rei・Asuka の各 Lambda 関数にアタッチします
# レイヤー ARN にはバージョン番号まで含める必要があります
# -----------------------------------------------
LAYER_ARN="arn:aws:lambda:ap-northeast-1:111122223333:layer:eva-common-libs:1"
# Shinji の関数にレイヤーをアタッチします
aws lambda update-function-configuration \
--function-name shinji-handler \
--layers "${LAYER_ARN}" \
--region ap-northeast-1
# Rei の関数にレイヤーをアタッチします
aws lambda update-function-configuration \
--function-name rei-handler \
--layers "${LAYER_ARN}" \
--region ap-northeast-1
# Asuka の関数にレイヤーをアタッチします
aws lambda update-function-configuration \
--function-name asuka-handler \
--layers "${LAYER_ARN}" \
--region ap-northeast-1
# アタッチ後に Shinji の関数設定を確認します
aws lambda get-function-configuration \
--function-name shinji-handler \
--region ap-northeast-1 \
--query 'Layers'
$ LAYER_ARN="arn:aws:lambda:ap-northeast-1:111122223333:layer:eva-common-libs:1"
$ aws lambda update-function-configuration \
> --function-name shinji-handler \
> --layers "${LAYER_ARN}" \
> --region ap-northeast-1
{
"FunctionName": "shinji-handler",
"FunctionArn": "arn:aws:lambda:ap-northeast-1:111122223333:function:shinji-handler",
"Runtime": "python3.12",
"Layers": [
{
"Arn": "arn:aws:lambda:ap-northeast-1:111122223333:layer:eva-common-libs:1",
"CodeSize": 385024
}
],
"LastModified": "2026-03-26T09:05:00.000+0000",
"State": "Active"
}
$ aws lambda update-function-configuration \
> --function-name rei-handler --layers "${LAYER_ARN}" --region ap-northeast-1
{
"FunctionName": "rei-handler",
"Layers": [
{ "Arn": "arn:aws:lambda:ap-northeast-1:111122223333:layer:eva-common-libs:1", "CodeSize": 385024 }
]
}
$ aws lambda update-function-configuration \
> --function-name asuka-handler --layers "${LAYER_ARN}" --region ap-northeast-1
{
"FunctionName": "asuka-handler",
"Layers": [
{ "Arn": "arn:aws:lambda:ap-northeast-1:111122223333:layer:eva-common-libs:1", "CodeSize": 385024 }
]
}
$ aws lambda get-function-configuration \
> --function-name shinji-handler \
> --region ap-northeast-1 \
> --query 'Layers'
[
{
"Arn": "arn:aws:lambda:ap-northeast-1:111122223333:layer:eva-common-libs:1",
"CodeSize": 385024
}
]
# -----------------------------------------------
# eva-common-libs に boto3 を追加して
# バージョン 2 として公開します
# Misato の関数にはバージョン 2 をアタッチします
# -----------------------------------------------
# boto3 も追加してインストールします
pip install requests boto3 \
-t eva-common-layer/python/lib/python3.12/site-packages/
# 更新した ZIP を作成します
cd eva-common-layer
zip -r ../eva-common-layer-v2.zip python/
cd ..
# バージョン 2 として公開します
aws lambda publish-layer-version \
--layer-name eva-common-libs \
--zip-file fileb://eva-common-layer-v2.zip \
--compatible-runtimes python3.12 \
--description "Eva パイロット共通ライブラリ (requests + boto3)" \
--region ap-northeast-1
# バージョン履歴を確認します
aws lambda list-layer-versions \
--layer-name eva-common-libs \
--region ap-northeast-1 \
--query 'LayerVersions[*].{Version:Version,ARN:LayerVersionArn,Description:Description}'
# Misato の関数にバージョン 2 をアタッチします
aws lambda update-function-configuration \
--function-name misato-command-func \
--layers arn:aws:lambda:ap-northeast-1:111122223333:layer:eva-common-libs:2 \
--region ap-northeast-1
$ aws lambda publish-layer-version \
> --layer-name eva-common-libs \
> --zip-file fileb://eva-common-layer-v2.zip \
> --compatible-runtimes python3.12 \
> --description "Eva パイロット共通ライブラリ (requests + boto3)" \
> --region ap-northeast-1
{
"LayerArn": "arn:aws:lambda:ap-northeast-1:111122223333:layer:eva-common-libs",
"LayerVersionArn": "arn:aws:lambda:ap-northeast-1:111122223333:layer:eva-common-libs:2",
"Description": "Eva パイロット共通ライブラリ (requests + boto3)",
"CreatedDate": "2026-03-26T10:00:00.000+0000",
"Version": 2,
"CompatibleRuntimes": [
"python3.12"
]
}
$ aws lambda list-layer-versions \
> --layer-name eva-common-libs \
> --region ap-northeast-1 \
> --query 'LayerVersions[*].{Version:Version,ARN:LayerVersionArn,Description:Description}'
[
{
"Version": 2,
"ARN": "arn:aws:lambda:ap-northeast-1:111122223333:layer:eva-common-libs:2",
"Description": "Eva パイロット共通ライブラリ (requests + boto3)"
},
{
"Version": 1,
"ARN": "arn:aws:lambda:ap-northeast-1:111122223333:layer:eva-common-libs:1",
"Description": "Eva パイロット共通ライブラリ (requests)"
}
]
$ aws lambda update-function-configuration \
> --function-name misato-command-func \
> --layers arn:aws:lambda:ap-northeast-1:111122223333:layer:eva-common-libs:2 \
> --region ap-northeast-1
{
"FunctionName": "misato-command-func",
"Layers": [
{
"Arn": "arn:aws:lambda:ap-northeast-1:111122223333:layer:eva-common-libs:2",
"CodeSize": 9437184
}
],
"LastModified": "2026-03-26T10:05:00.000+0000"
}
# -----------------------------------------------
# Gendou の関数に eva-common-libs と
# gendou-secret-layer の 2 つのレイヤーをアタッチします
# 複数レイヤーはスペース区切りで指定します
# -----------------------------------------------
# 2 つのレイヤーをまとめてアタッチします
aws lambda update-function-configuration \
--function-name gendou-scenario-func \
--layers \
arn:aws:lambda:ap-northeast-1:111122223333:layer:eva-common-libs:2 \
arn:aws:lambda:ap-northeast-1:111122223333:layer:gendou-secret-layer:1 \
--region ap-northeast-1
# アタッチされているレイヤーの一覧を確認します
aws lambda get-function-configuration \
--function-name gendou-scenario-func \
--region ap-northeast-1 \
--query 'Layers[*].{Arn:Arn,CodeSize:CodeSize}'
# レイヤーの詳細(ダウンロード URL・ランタイム等)を確認します
aws lambda get-layer-version \
--layer-name eva-common-libs \
--version-number 2 \
--region ap-northeast-1
$ aws lambda update-function-configuration \
> --function-name gendou-scenario-func \
> --layers \
> arn:aws:lambda:ap-northeast-1:111122223333:layer:eva-common-libs:2 \
> arn:aws:lambda:ap-northeast-1:111122223333:layer:gendou-secret-layer:1 \
> --region ap-northeast-1
{
"FunctionName": "gendou-scenario-func",
"Layers": [
{
"Arn": "arn:aws:lambda:ap-northeast-1:111122223333:layer:eva-common-libs:2",
"CodeSize": 9437184
},
{
"Arn": "arn:aws:lambda:ap-northeast-1:111122223333:layer:gendou-secret-layer:1",
"CodeSize": 204800
}
]
}
$ aws lambda get-function-configuration \
> --function-name gendou-scenario-func \
> --region ap-northeast-1 \
> --query 'Layers[*].{Arn:Arn,CodeSize:CodeSize}'
[
{
"Arn": "arn:aws:lambda:ap-northeast-1:111122223333:layer:eva-common-libs:2",
"CodeSize": 9437184
},
{
"Arn": "arn:aws:lambda:ap-northeast-1:111122223333:layer:gendou-secret-layer:1",
"CodeSize": 204800
}
]
$ aws lambda get-layer-version \
> --layer-name eva-common-libs \
> --version-number 2 \
> --region ap-northeast-1
{
"Content": {
"Location": "https://awslambda-ap-northeast-1-layers.s3.amazonaws.com/snapshots/...",
"CodeSha256": "xyz789ABChash==",
"CodeSize": 9437184
},
"LayerArn": "arn:aws:lambda:ap-northeast-1:111122223333:layer:eva-common-libs",
"LayerVersionArn": "arn:aws:lambda:ap-northeast-1:111122223333:layer:eva-common-libs:2",
"Description": "Eva パイロット共通ライブラリ (requests + boto3)",
"CreatedDate": "2026-03-26T10:00:00.000+0000",
"Version": 2,
"CompatibleRuntimes": [
"python3.12"
]
}
よくあるミス1: ZIP のディレクトリ構造を間違えてライブラリが読み込めない
Python レイヤーの ZIP 内は python/ 配下(または python/lib/python3.x/site-packages/ 配下)にパッケージを置く必要があります。構造が違うとランタイムがライブラリを見つけられず ModuleNotFoundError になります。
# NG: ルート直下にパッケージを置いてしまう mkdir my-layer pip install requests -t my-layer/ cd my-layer && zip -r ../layer.zip . && cd .. # ZIP の中身: ./requests/, ./certifi/, ... # → Lambda 実行時に "No module named 'requests'" になる
Python は python/ 配下、Node.js は nodejs/node_modules/ 配下にパッケージを置いて ZIP を作成します。
# OK: Python レイヤーは python/ 配下に配置する mkdir -p eva-layer/python pip install requests -t eva-layer/python/ cd eva-layer && zip -r ../layer.zip python/ && cd .. # ZIP の中身: python/requests/, python/certifi/, ... aws lambda publish-layer-version \ --layer-name eva-common-libs \ --zip-file fileb://layer.zip \ --compatible-runtimes python3.12
よくあるミス2: レイヤーのバージョンを指定せずに最新版と思い込む
Lambda 関数へのレイヤーアタッチにはバージョン番号まで含めた ARN が必要です。バージョン番号を省いた ARN は使用できず、update-function-configuration がエラーになります。
# NG: バージョン番号を省いた ARN を指定する aws lambda update-function-configuration \ --function-name shinji-handler \ --layers arn:aws:lambda:ap-northeast-1:111122223333:layer:eva-common-libs # → ValidationException: Layer version ARN must include version number
アタッチ時は必ずバージョン番号まで含めた ARN を指定します。最新バージョンの ARN は list-layer-versions で確認できます。
# OK: バージョン番号まで含めた ARN を指定する
LAYER_VERSION_ARN=$(aws lambda list-layer-versions \
--layer-name eva-common-libs \
--query 'LayerVersions[0].LayerVersionArn' \
--output text)
aws lambda update-function-configuration \
--function-name shinji-handler \
--layers "${LAYER_VERSION_ARN}"
よくあるミス3: レイヤーのランタイム互換性を確認せずに追加する
レイヤーの --compatible-runtimes と Lambda 関数のランタイムが一致していない場合、アタッチ自体はできても実行時にライブラリの読み込みに失敗します。
# NG: python3.9 向けに作ったレイヤーを python3.12 の関数にアタッチする aws lambda publish-layer-version \ --layer-name eva-common-libs \ --zip-file fileb://layer.zip \ --compatible-runtimes python3.9 # python3.12 の関数にアタッチすると # バイナリ依存ライブラリがある場合に実行時エラーになる aws lambda update-function-configuration \ --function-name rei-handler \ --layers arn:aws:lambda:ap-northeast-1:111122223333:layer:eva-common-libs:1
関数のランタイムに合わせたレイヤーを作成します。バイナリ依存ライブラリ(C 拡張を含む NumPy 等)は、Lambda のランタイム環境(Amazon Linux 2)上でビルドする必要があります。
# OK: 関数のランタイムと一致するバージョンでレイヤーを公開する aws lambda publish-layer-version \ --layer-name eva-common-libs \ --zip-file fileb://layer.zip \ --compatible-runtimes python3.12 # 関数のランタイムを確認してから一致するレイヤーをアタッチする aws lambda get-function-configuration \ --function-name rei-handler \ --query 'Runtime'
概要
『Lambda』のレイヤーは、関数コードとは独立してライブラリ・設定ファイル・カスタムランタイムを管理する仕組みです。レイヤーの ZIP ファイルはランタイムごとに決まったディレクトリ構造に従う必要があり、Python の場合は python/lib/python3.x/site-packages/ 以下にパッケージを配置します。展開後は /opt/python/lib/python3.x/site-packages/ として Lambda 実行環境に配置されるため、関数コードから通常の import でそのまま利用できます。レイヤーは公開するたびにバージョン番号(1 から始まる整数)が付与され、ARN は arn:aws:lambda:{リージョン}:{アカウントID}:layer:{レイヤー名}:{バージョン番号} の形式になります。関数へのアタッチには必ずバージョン番号まで含めた ARN を指定する必要があり、バージョンを省いた ARN は使用できません。レイヤーを更新しても既存の関数は自動的には切り替わらないため、新バージョンを使わせるには aws lambda update-function-configuration --layers で明示的に更新する必要があります。同一アカウントのレイヤーだけでなく、aws lambda add-layer-version-permission でアカウント間共有を設定した他アカウントのレイヤーや AWS 提供の公開レイヤー(例: AWSSDKPandas-Python312)も同じ手順でアタッチできます。関数の作成・デプロイについては Lambda関数の作成とデプロイ を、トリガーの設定については Lambdaのトリガー設定 を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。