

# レイヤーによる Lambda 依存関係の管理
<a name="chapter-layers"></a>

Lambda レイヤーは、補助的なコードやデータを含む .zip ファイルアーカイブです。レイヤーには通常、ライブラリの依存関係、[カスタムランタイム](runtimes-custom.md)、または設定ファイルが含まれています。

レイヤーの使用を検討する理由は複数あります。
+ **デプロイパッケージのサイズを小さくするため。**関数コードとともにすべての関数依存関係をデプロイパッケージに含める代わりに、レイヤーに配置します。これにより、デプロイパッケージは小さく整理された状態に保たれます。
+ **コア関数ロジックを依存関係から分離するため。**レイヤーを使用すると、関数コードと独立して関数の依存関係を更新でき、その逆も可能となります。これにより、関心事の分離が促進され、関数ロジックに集中することができます。
+ **複数の関数間で依存関係を共有するため。**レイヤーを作成したら、それをアカウント内の任意の数の関数に適用できます。レイヤーがない場合、個々のデプロイパッケージに同じ依存関係を含める必要があります。
+ **Lambda コンソールのコードエディターを使用するため。**コードエディターは、関数コードの軽微な更新をすばやくテストするのに便利なツールです。ただし、デプロイパッケージのサイズが大きすぎる場合は、エディターを使用できません。レイヤーを使用すると、パッケージのサイズが小さくなり、コードエディターの使用制限を解除できます。
+ **組み込み SDK バージョンをロックするため。**AWS が新しいサービスや機能をリリースすると、組み込み SDK は予告なく変更される場合があります。SDK バージョンは、必要な特定のバージョンで [Lambda レイヤーを作成](#chapter-layers)することでロックできます。その後、サービスに組み込まれたバージョンが変更されても、関数は常にレイヤーのバージョンを使用します。

Go や Rust で Lambda 関数を使用している場合は、レイヤーを使用しないことをお勧めします。Go 関数と Rust 関数の場合、関数コードが実行可能ファイルになります。つまり、コンパイル済みの関数コードがそのすべての依存関係と共に含まれています。レイヤーに依存関係を配置した場合、他に必要なアセンブリがあれば、初期化フェーズ中にいちいちロードされるため、コールドスタート時間が長くなる可能性があります。Go 関数と Rust 関数で最適なパフォーマンスが得られるよう、デプロイパッケージと共に依存関係を含めてください。

次の図は、依存関係を共有する 2 つの関数間の大まかなのアーキテクチャの違いを示しています。一方は Lambda レイヤーを使用し、もう一方は使用しません。

![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/lambda-layers-diagram.png)


関数にレイヤーを追加すると、Lambda は関数の[実行環境](lambda-runtime-environment.md)の `/opt` ディレクトリにレイヤーのコンテンツを抽出します。ネイティブにサポートされているすべての Lambda ランタイムには、`/opt` ディレクトリ内の特定のディレクトリへのパスが含まれています。これにより、関数はレイヤーコンテンツにアクセスできるようになります。これらの特定のパスの詳細とレイヤーを適切にパッケージ化する方法については、[レイヤーコンテンツのパッケージング](packaging-layers.md) を参照してください。

各関数につき最大 5 つのレイヤーを含めることができます。また、レイヤーは、[.zip ファイルアーカイブとしてデプロイされた](configuration-function-zip.md) Lambda 関数でのみ使用できます。[コンテナイメージとして定義された](images-create.md)関数では、コンテナイメージの作成時に、優先ランタイムとすべてのコード依存関係をパッケージ化します。詳細については、AWS コンピューティングブログの「[コンテナイメージの Lambda レイヤーと拡張機能を使用する](https://aws.amazon.com/blogs/compute/working-with-lambda-layers-and-extensions-in-container-images/)」を参照してください。

**Topics**
+ [

## レイヤーの使用方法
](#lambda-layers-overview)
+ [

## レイヤーとレイヤーバージョン
](#lambda-layer-versions)
+ [

# レイヤーコンテンツのパッケージング
](packaging-layers.md)
+ [

# Lambda でのレイヤーの作成と削除
](creating-deleting-layers.md)
+ [

# 関数へのレイヤーの追加
](adding-layers.md)
+ [

# AWS CloudFormation を使用したレイヤー
](layers-cfn.md)
+ [

# AWS SAM を使用したレイヤー
](layers-sam.md)

## レイヤーの使用方法
<a name="lambda-layers-overview"></a>

レイヤーを作成するには、[通常のデプロイパッケージの作成](configuration-function-zip.md)と同様に、依存関係を .zip ファイルにパッケージ化します。具体的には、レイヤーの作成と使用の一般的なプロセスには、次の 3 つのステップが含まれます。
+ **まず、レイヤーコンテンツをパッケージ化します。**これは .zip ファイルアーカイブを作成することを意味します。詳細については、「[レイヤーコンテンツのパッケージング](packaging-layers.md)」を参照してください。
+ **次に、Lambda でレイヤーを作成します。**詳細については、「[Lambda でのレイヤーの作成と削除](creating-deleting-layers.md)」を参照してください。
+ **レイヤーを関数に追加します。**詳細については、「[関数へのレイヤーの追加](adding-layers.md)」を参照してください。

## レイヤーとレイヤーバージョン
<a name="lambda-layer-versions"></a>

レイヤーのバージョンは、レイヤーの特定のバージョンの不変のスナップショットです。新しいレイヤーを作成すると、Lambda はバージョン番号 1 の新しいレイヤーバージョンを作成します。レイヤーの更新を発行するたびに、Lambda はバージョン番号を増やし、新しいレイヤーバージョンを作成します。

すべてのレイヤーバージョンは、一意の Amazon リソースネーム (ARN) により識別されます。レイヤーを関数に追加する際、使用するレイヤーバージョンを正確に指定する必要があります (`arn:aws:lambda:us-east-1:123456789012:layer:my-layer:1` など)。

# レイヤーコンテンツのパッケージング
<a name="packaging-layers"></a>

Lambda レイヤーは、補助的なコードやデータを含む .zip ファイルアーカイブです。レイヤーには通常、ライブラリの依存関係、[カスタムランタイム](runtimes-custom.md)、または設定ファイルが含まれています。

このセクションでは、レイヤーコンテンツを適切にパッケージングする方法について説明します。レイヤーの概念的な情報とその使用を検討する理由の詳細については、[レイヤーによる Lambda 依存関係の管理](chapter-layers.md) を参照してください。

レイヤーを作成する最初のステップは、すべてのレイヤーコンテンツを .zip ファイルアーカイブにバンドルすることです。Lambda 関数は [Amazon Linux](https://docs.aws.amazon.com/linux/al2023/ug/what-is-amazon-linux.html) 上で実行されるため、レイヤーコンテンツは Linux 環境でコンパイルおよびビルドできる必要があります。

Linux 環境でレイヤーコンテンツを正しく動作させるためには、[Docker](https://docs.docker.com/get-docker) などのツールを使用してレイヤーコンテンツを作成することをお勧めします。

**Topics**
+ [

## 各 Lambda ランタイムのレイヤーパス
](#packaging-layers-paths)

## 各 Lambda ランタイムのレイヤーパス
<a name="packaging-layers-paths"></a>

関数にレイヤーを追加すると、Lambda はレイヤーのコンテンツをその実行環境の `/opt` ディレクトリに読み込みます。Lambda ランタイムごとに、`PATH` 変数には `/opt` ディレクトリ内の特定のフォルダパスがあらかじめ含まれます。Lambda がレイヤーコンテンツを確実に取得できるようにするには、レイヤーの .zip ファイルの依存関係が次のフォルダパスにある必要があります。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/packaging-layers.html)

次の例は、レイヤーの .zip アーカイブでフォルダを設定する方法を示しています。

------
#### [ Node.js ]

**Example Node.js 用の AWS X-Ray SDK のファイル構造**  

```
xray-sdk.zip
└ nodejs/node_modules/aws-xray-sdk
```

------
#### [ Python ]

**Example**  

```
python/              # Required top-level directory
└── requests/
└── boto3/
└── numpy/
└── (dependencies of the other packages)
```

------
#### [ Ruby ]

**Example JSON gem のファイル構造**  

```
json.zip
└ ruby/gems/3.4.0/
               | build_info
               | cache
               | doc
               | extensions
               | gems
               | └ json-2.1.0
               └ specifications
                 └ json-2.1.0.gemspec
```

------
#### [ Java ]

**Example Jackson JAR ファイルのファイル構造**  

```
layer_content.zip
└ java
    └ lib
        └ jackson-core-2.17.0.jar
        └ <other potential dependencies>
        └ ...
```

------
#### [ All ]

**Example JQ ライブラリのファイル構造**  

```
jq.zip
└ bin/jq
```

------

レイヤーのパッケージ化、作成、追加に関する言語固有の手順については、次のページを参照してください。
+ **Node.js** – [Node.js Lambda 関数のレイヤーを操作する](nodejs-layers.md)
+ **Python** – [Python Lambda 関数にレイヤーを使用する](python-layers.md)
+ **Ruby** – [Ruby Lambda 関数のレイヤーを操作する](ruby-layers.md)
+ **Java** – [Java Lambda 関数のレイヤーを操作する](java-layers.md)

Go および Rust で書かれた Lambda 関数の依存関係を管理するためにレイヤーを使用することはお勧め**しません**。これは、これらの言語で書かれた Lambda 関数が単一の実行可能ファイルにコンパイルされて、関数をデプロイしたときにそのファイルが Lambda に渡されるためです。この実行可能ファイルには、コンパイルされた関数コードがそのすべての依存関係と共に含まれています。レイヤーを使用すると、このプロセスが複雑になります。そのうえ、他に必要なアセンブリがあれば、初期化フェーズ中にいちいちメモリにロードしなければならないため、コールドスタート時間が長くなります。

Go および Rust Lambda 関数で外部依存関係を使用するには、その依存関係をデプロイパッケージに直接含めます。

# Lambda でのレイヤーの作成と削除
<a name="creating-deleting-layers"></a>

Lambda レイヤーは、補助的なコードやデータを含む .zip ファイルアーカイブです。レイヤーには通常、ライブラリの依存関係、[カスタムランタイム](runtimes-custom.md)、または設定ファイルが含まれています。

このセクションでは、Lambda でレイヤーを作成および削除する方法を説明します。レイヤーの概念的な情報とその使用を検討する理由の詳細については、[レイヤーによる Lambda 依存関係の管理](chapter-layers.md) を参照してください。

あなたが[レイヤーコンテンツをパッケージ化](packaging-layers.md)したら、次のステップは Lambda でのレイヤーの作成です。このセクションでは、Lambda コンソールまたは Lambda API のみを使用して、レイヤーを作成および削除する方法を示します。AWS CloudFormation を使用してレイヤーを作成するには、[AWS CloudFormation を使用したレイヤー](layers-cfn.md) を参照してください。AWS Serverless Application Model (AWS SAM) を使用してレイヤーを作成するには、[AWS SAM を使用したレイヤー](layers-sam.md) を参照してください。

**Topics**
+ [

## レイヤー作成
](#layers-create)
+ [

## レイヤーバージョンの削除
](#layers-delete)

## レイヤー作成
<a name="layers-create"></a>

レイヤーを作成するには、ローカルマシンから、または Amazon Simple Storage Service (Amazon S3) から .zip ファイルのアーカイブをアップロードします。Lambda は、関数の実行環境を設定する際に、レイヤーの内容を `/opt` ディレクトリに抽出します。

レイヤーには、1 つまたは複数の[レイヤーバージョン](chapter-layers.md#lambda-layer-versions)を含めることができます。レイヤーを作成すると、Lambda はレイヤーのバージョンをバージョン 1 に設定します。既存のレイヤーバージョンの権限はいつでも変更することができます。ただし、コードを更新したり、その他の構成を変更したりするには、新しいバージョンのレイヤーを作成する必要があります。

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

1. Lambda コンソールの [[Layers (レイヤー)] ページ](https://console.aws.amazon.com/lambda/home#/layers)を開きます。

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

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

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

1. レイヤーコードをアップロードするには、次のいずれかを実行します。
   + コンピューターから .zip ファイルをアップロードするには、[** .zip ファイルをアップロード **] を選択します。[**Upload**] (アップロード) を選択して、ローカルの .zip ファイルを選択します。
   + Amazon S3 からファイルをアップロードするには、[**Upload a file from Amazon S3**] (Amazon S3 からファイルをアップロードする) を選択します。その後、[**Amazon S3 link URL**] (Amazon S3 のリンク URL) で、ファイルへのリンクを入力します。

1. (オプション) **[互換性のあるアーキテクチャ]** では、1 つまたは両方の値を選択します。詳細については、「[Lambda 関数の命令セットアーキテクチャの選択と設定](foundation-arch.md)」を参照してください。

1. (オプション) **[互換性のあるランタイム]** では、お使いのレイヤーと互換性のあるランタイムを選択します。

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

1. **[作成]** を選択します。

または、[publish-layer-version](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/publish-layer-version.html) AWS Command Line Interface (CLI) コマンドを実行することもできます。例:

```
aws lambda publish-layer-version --layer-name my-layer --zip-file fileb://layer.zip --compatible-runtimes python3.14
```

`publish-layer-version` を実行するたびに、Lambda は新しい[レイヤーバージョン](chapter-layers.md#lambda-layer-versions)を作成します。

## レイヤーバージョンの削除
<a name="layers-delete"></a>

レイヤーバージョンを削除するには、[DeleteLayerVersion](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteLayerVersion.html) の API オペレーションを使用します。例えば、レイヤー名およびレイヤーバージョンが指定された状態で [delete-layer-version](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/delete-layer-version.html) AWS CLI コマンドを実行します。

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

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

[クォータ](gettingstarted-limits.md)を計算する場合、レイヤーバージョンを削除すると、関数とレイヤーの保存に関するデフォルトの 75 GB クォータの一部としてカウントされなくなります。ただし、削除されたレイヤーバージョンを使用する関数の場合、レイヤーコンテンツは引き続き関数のデプロイパッケージサイズのクォータ (.zip ファイルアーカイブの場合は 250MB) にカウントされます。

# 関数へのレイヤーの追加
<a name="adding-layers"></a>

Lambda レイヤーは、補助的なコードやデータを含む .zip ファイルアーカイブです。レイヤーには通常、ライブラリの依存関係、[カスタムランタイム](runtimes-custom.md)、または設定ファイルが含まれています。

このセクションでは、Lambda 関数にレイヤーを追加する方法を説明します。レイヤーの概念的な情報とその使用を検討する理由の詳細については、[レイヤーによる Lambda 依存関係の管理](chapter-layers.md) を参照してください。

レイヤーを使用するよう Lambda 関数を設定する前に、以下を実行する必要があります。
+ [レイヤーコンテンツのパッケージ化](packaging-layers.md)
+ [Lambda でレイヤーを作成](creating-deleting-layers.md)
+ レイヤーバージョンで [GetLayerVersion](https://docs.aws.amazon.com/lambda/latest/api/API_GetLayerVersion.html) API を呼び出す権限があることを確認する。AWS アカウント の関数については、[ユーザーポリシー](access-control-identity-based.md)でこの権限を持っている必要があります。別のアカウントでレイヤーを使用するには、そのアカウントの所有者は、[リソースベースのポリシー](access-control-resource-based.md)で自分のアカウントにアクセス許可を付与する必要があります。例については、「[他のアカウントに Lambda レイヤーへのアクセス許可を付与する](permissions-layer-cross-account.md)」を参照してください。

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

関数は、すでに追加したレイヤーバージョンであれば、そのレイヤーバージョンが削除された後でも、またはレイヤーへのアクセス権限が取り消された後でも、そのレイヤーバージョンを引き続き使用できます。しかし、削除されたレイヤーバージョンを使用して新しい関数を作成することはできません。

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

1. Lambda コンソールの [[関数]](https://console.aws.amazon.com/lambda/home#/functions) ページを開きます。

1. 関数を選択します。

1. **[レイヤー]** セクションまで下にスクロールし、**[レイヤーの追加]** を選択します。

1. **[レイヤーを選択する]** で、レイヤーソースを選択します。

   1. **[AWS レイヤー]**: [AWS マネージド拡張機能](extensions-api-partners.md#aws-managed-extensions)のリストから選択します。

   1. **[カスタムレイヤー]**: AWS アカウントで作成したレイヤーを選択します。

   1. **[ARN の指定]**: [サードパーティ拡張機能](extensions-api-partners.md)など、[別の AWS アカウント](permissions-layer-cross-account.md)のレイヤーを使用するには、Amazon リソースネーム (ARN) を入力します。

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

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

**関数のレイヤーのマージ順序を更新するには (コンソール)**

1. Lambda コンソールの [[関数]](https://console.aws.amazon.com/lambda/home#/functions) ページを開きます。

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

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

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

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

1. **[保存]** を選択します。

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

**関数のレイヤーバージョンを更新するには (コンソール)**

1. Lambda コンソールの [[Layers (レイヤー)] ページ](https://console.aws.amazon.com/lambda/home#/layers)を開きます。

1. バージョンを更新したいレイヤーを選択します。

1. **[Functions using this version]** (このバージョンを使用する関数) タブを選択します。

1. 変更したい関数を選択してから、**[Edit]** (編集) を選択します。

1. **[Layer version]** (レイヤーバージョン) では、変更するレイヤーのバージョンを選択します。

1. **[Update functions]** (関数を更新) をクリックします。

AWS アカウント間で、関数のレイヤーバージョン更新することはできません。

## レイヤー情報の確認
<a name="finding-layer-information"></a>

関数のランタイムと互換性のあるレイヤーをアカウントで検索するには、[ListLayers](https://docs.aws.amazon.com/lambda/latest/api/API_ListLayers.html) API を使用します。例えば、以下の [list-layers](https://docs.aws.amazon.com/cli/latest/reference/lambda/list-layers.html) AWS Command Line Interface (CLI) コマンドを使用できます。

```
aws lambda list-layers --compatible-runtime python3.14
```

次のような出力が表示されます:

```
{
    "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": "2025-04-15T00:37:46.592+0000",
                "CompatibleRuntimes": [
                    "python3.14"
                ]
            }
        }
    ]
}
```

アカウント内のすべてのレイヤーをリスト化するには、`--compatible-runtime` オプションを省略します。レスポンスの詳細には、各レイヤーの最新バージョンが表示されます。

[ListLayerVersions](https://docs.aws.amazon.com/lambda/latest/api/API_ListLayerVersions.html) API を使用して、最新バージョンのレイヤーを取得することもできます。たとえば、次の `list-layer-versions` CLI コマンドを使用することができます。

```
aws lambda list-layer-versions --layer-name my-layer
```

次のような出力が表示されます:

```
{
    "LayerVersions": [
        {
            "LayerVersionArn": "arn:aws:lambda:us-east-2:123456789012:layer:my-layer:2",
            "Version": 2,
            "Description": "My layer",
            "CreatedDate": "2023-11-15T00:37:46.592+0000",
            "CompatibleRuntimes": [
                "java11"
            ]
        },
        {
            "LayerVersionArn": "arn:aws:lambda:us-east-2:123456789012:layer:my-layer:1",
            "Version": 1,
            "Description": "My layer",
            "CreatedDate": "2023-11-15T00:27:46.592+0000",
            "CompatibleRuntimes": [
                "java11"
            ]
        }
    ]
}
```

# AWS CloudFormation を使用したレイヤー
<a name="layers-cfn"></a>

CloudFormation を使用してレイヤーを作成し、そのレイヤーを Lambda 関数に関連付けることができます。次のテンプレートの例では、`my-lambda-layer` という名前のレイヤーを作成し、そのレイヤーを **Layers** プロパティを使用して Lambda 関数にアタッチします。

この例では、テンプレートは既存の IAM [実行ロール](lambda-intro-execution-role.md)の Amazon リソースネーム (ARN) を指定します。CloudFormation [AWS::IAM::Role](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html) リソースを使用して、テンプレートに新しい実行ロールを作成することもできます。

関数には、レイヤーを使用するための特別なアクセス許可は必要ありません。

```
---
Description: CloudFormation Template for Lambda Function with Lambda Layer
Resources:
  MyLambdaLayer:
    Type: AWS::Lambda::LayerVersion
    Properties:
      LayerName: my-lambda-layer
      Description: My Lambda Layer
      Content:
        S3Bucket: amzn-s3-demo-bucket
        S3Key: my-layer.zip
      CompatibleRuntimes:
        - python3.9
        - python3.10
        - python3.11

  MyLambdaFunction:
    Type: AWS::Lambda::Function
    Properties:
      FunctionName: my-lambda-function
      Runtime: python3.9
      Handler: index.handler
      Timeout: 10
      Role: arn:aws:iam::111122223333:role/my_lambda_role
      Layers:
        - !Ref MyLambdaLayer
```

# AWS SAM を使用したレイヤー
<a name="layers-sam"></a>

AWS Serverless Application Model (AWS SAM) を使用して、アプリケーションでレイヤーの作成を自動化できます。`AWS::Serverless::LayerVersion` リソースタイプによって、Lambda 関数設定から参照できるレイヤーバージョンが作成されます。

```
AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Description: AWS SAM Template for Lambda Function with Lambda Layer

Resources:
  MyLambdaLayer:
    Type: AWS::Serverless::LayerVersion
    Properties:
      LayerName: my-lambda-layer
      Description: My Lambda Layer
      ContentUri: s3://amzn-s3-demo-bucket/my-layer.zip
      CompatibleRuntimes:
        - python3.9
        - python3.10
        - python3.11

  MyLambdaFunction:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: MyLambdaFunction
      Runtime: python3.9
      Handler: app.handler
      CodeUri: s3://amzn-s3-demo-bucket/my-function
      Layers:
        - !Ref MyLambdaLayer
```