目次Category
はじめに
今回の記事では、AWS LambdaのLambda Layerを実際に作成し、Lambda関数からLayer内の共通処理を利用する方法について説明します。
Lambda Layerを利用すると、Lambda関数本体とは別にライブラリや共通処理を管理できます。複数のLambda関数で同じ処理を利用する場合に、同じコードを各関数へ配置せず共通化できます。
- Lambda関数を作成する
- Layer内の共通処理をimportするコードを記述する
- Layerがない状態でテストし、ImportModuleErrorを確認する
- Layer用の共通処理を作成する
- Layer用ファイルをZIP化する
- Lambda Layerを作成する
- Lambda関数へLayerを追加する
- 再度テストして正常実行を確認する
- 作成したリソースを削除する
この記事では最初にLambda Layerの仕組みを説明し、その後に実際の操作手順を進めます。
Lambda関数
ojt-lambda-layer-[name]-01
│
│ import
↓
Lambda Layer
ojt-common-layer-[name]-01
│
└── python/
└── common_utils.py
└── create_message()
Lambda関数本体には common_utils.py を配置せず、Layer側に配置した共通処理をimportして利用します。
0. Lambda Layerについて
Lambda Layerは、Lambda関数から利用するライブラリや共通処理を、関数本体とは別に管理できる仕組みです。
複数のLambdaで同じ処理を使用する場合、それぞれのLambdaに同じコードを配置すると重複が発生します。
Layerを使用しない場合
Lambda A
├── lambda_function.py
└── common_utils.py
Lambda B
├── lambda_function.py
└── common_utils.py
Layerを使用する場合
Lambda Layer
common_utils.py
↑ ↑
│ │
Lambda A Lambda B
共通処理をLayerへ分離することで、複数のLambdaから再利用できます。
- 共通処理
- ログ出力処理
- 日付変換処理
- 入力チェック処理
- 外部ライブラリ
1. Lambda関数を作成する
まずはLayerを利用する側となるLambda関数を作成します。この時点ではLayerはまだ作成しません。
1-1. Lambda関数を作成する
1. AWSマネジメントコンソールで「Lambda」を検索し、AWS Lambdaを開きます。
2. 「関数の作成」をクリックします。
3. 「一から作成」を選択し、以下を設定します。
関数名:
ojt-lambda-layer-[name]-01
ランタイム:
Python 3.13
アーキテクチャ:
x86_64
その他:
デフォルト
4. 「関数の作成」をクリックします。
[name] の部分は、自分の識別名へ置き換えてください。2. Layerを使用するLambdaコードを作成する
今回はLambda本体から common_utils という別ファイルを読み込むコードを記述します。
ただし、この時点では common_utils.py はまだ存在しません。そのため、最初のテストではエラーになります。
2-1. lambda_function.pyを変更する
作成したLambda関数の「コード」タブを開き、lambda_function.py を以下に変更します。
from common_utils import create_message
def lambda_handler(event, context):
name = event.get("name", "AWS")
message = create_message(name)
return {
"statusCode": 200,
"message": message
}
コードを変更したら「Deploy」をクリックします。
2-2. Layerなしでテストする
1. 「Test」をクリックします。
2. テストイベントを作成します。
イベント名:
layer-test
イベントJSONは次の内容にします。
{
"name": "自身の名前"
}
3. テストを実行します。
この時点では common_utils.py が存在しないため、次のようなエラーになることを確認します。
Runtime.ImportModuleError: Unable to import module 'lambda_function': No module named 'common_utils'
Lambda
↓
common_utilsをimport
↓
common_utils.pyが存在しない
↓
エラー
3. Lambda Layer用のファイルを作成する
Python用のLambda Layerでは、ZIPファイルの直下に python フォルダを配置します。今回は、その中に common_utils.py を配置します。
lambda-layer ├── python │ └── common_utils.py └── common-utils-layer.zip
3-1. フォルダを作成する
1. PC上に lambda-layer フォルダを作成します。
2. その中に python フォルダを作成します。
3-2. common_utils.pyを作成する
python フォルダ内に common_utils.py を作成し、次のコードを記述します。
def create_message(name):
return f"Hello, {name}! This message came from Lambda Layer."
3-3. ZIPファイルを作成する
Lambda Layerへアップロードするため、python フォルダをZIPファイルにします。
ZIPファイルを開いたとき、
python フォルダがZIPの直下に存在する必要があります。common-utils-layer.zip
└── python
└── common_utils.py
PowerShellで lambda-layer フォルダを開き、次のコマンドを実行します。
Compress-Archive -Path .\python -DestinationPath .\common-utils-layer.zip
4. Lambda Layerを作成する
作成した common-utils-layer.zip をAWS Lambdaへアップロードし、Lambda Layerとして登録します。その後、作成したLayerをLambda関数へ追加します。
4-1. Lambda Layerを作成する
1. AWS Lambdaを開きます。
2. 左側メニューから「Layers」を開きます。
3. 「レイヤーの作成」をクリックします。
4. 以下を設定します。
レイヤー名:
ojt-common-layer-[name]-01
アップロード:
.zipファイルをアップロード
ファイル:
common-utils-layer.zip
互換性のあるランタイム:
Python 3.13
5. 「作成」をクリックします。
4-2. Lambda関数にLayerを追加する
1. ojt-lambda-layer-[name]-01 を開きます。
2. 関数画面の「Layers」を開きます。
3. 「Add a layer」をクリックします。
4. 「Custom layers」を選択します。
5. 以下を選択します。
Layer:
ojt-common-layer-[name]-01
Version:
1
6. 「Add」をクリックします。
5. Layer追加後の動作を確認する
作成したLayerをLambda関数へ関連付けることで、Lambda本体からLayer内の common_utils.py をimportできるようになります。
5-1. 再度テストする
1. 「Test」をクリックします。
2. 先ほど作成した layer-test を使用します。
{
"name": "自身の名前"
}
3. テストを実行します。
正常に動作すると、以下のような結果になります。
{
"statusCode": 200,
"message": "Hello, Yoshida! This message came from Lambda Layer."
}
5-2. 動作を整理する
Layer追加前
Lambda
↓
common_utilsをimport
↓
ファイルがない
↓
エラー
Layer追加後
Lambda
↓
common_utilsをimport
↓
Lambda Layer
↓
common_utils.py
↓
create_message()実行
↓
成功
Lambda本体には common_utils.py を配置していません。それでもLayerを追加することで、以下のように共通処理を利用できます。
from common_utils import create_message
6. Lambda LayerのメリットとVersionを確認する
Layerを使用することで、共通コードやライブラリをLambda本体から分離できます。
Layerなし: Lambda A → common_utils.py Lambda B → common_utils.py Lambda C → common_utils.py
複数のLambdaで同じ処理を利用する場合は、共通処理をLayerへまとめることで再利用できます。
1つのLambdaでしか使用しない小さな処理をLayerへ分離すると、構成が複雑になる場合もあります。複数のLambdaで共通利用するものかを判断して使用することが重要です。
6-1. Lambda LayerのVersion
ojt-common-layer-[name]-01 ├── Version 1 ├── Version 2 └── Version 3
Lambda関数側では、どのLayer Versionを使用するか指定します。
Lambda A → Layer Version 1 Lambda B → Layer Version 2
Layerの新しいVersionを作成しただけで、既存Lambdaが自動的に新しいVersionへ切り替わるわけではありません。
6-2. 今回のポイント
Lambda: プログラムを実行するサービス Lambda Layer: Lambdaから利用する共通コードやライブラリを Lambda本体とは別に管理する仕組み 今回確認した内容: Lambdaのみ → common_utils.pyがないためエラー Layer追加 → common_utils.pyを利用できる → Lambda実行成功
7. ハンズオンで作成したリソースを削除する
- Lambda関数
- Lambda Layer
- Lambda実行用IAMロール(Lambda作成時に新規作成された場合のみ)
7-1. Lambda関数を削除する
1. AWS Lambdaを開きます。
2. 「Functions」を開きます。
3. ojt-lambda-layer-[name]-01 を選択します。
4. 「Actions」→「Delete」をクリックします。
5. 画面の指示に従って削除します。
7-2. Lambda Layerを削除する
1. Lambda左側メニューの「Layers」を開きます。
2. ojt-common-layer-[name]-01 を開きます。
3. Version 1を選択します。
4. 「Delete」を実行します。
7-3. IAMロールを削除する
Lambda作成時に新しいIAMロールを作成した場合のみ削除します。
1. IAMを開きます。
2. 「ロール」を開きます。
3. 今回のLambda用に作成されたロールを探します。
ojt-lambda-layer-[name]-01-role-xxxxxxxx
4. 他のリソースで使用していないことを確認します。
5. ロールを削除します。
他のLambda関数やAWSリソースで利用されていないことを確認してから削除してください。
まとめ
今回の記事では、AWS LambdaのLambda Layerを作成し、Lambda関数本体とは別に配置した共通処理を利用する方法を確認しました。
今回の流れは次のとおりです。
Lambda関数作成
↓
Layer内の処理をimport
↓
Layerがないためエラー
↓
common_utils.py作成
↓
ZIPファイル作成
↓
Lambda Layer作成
↓
LambdaにLayerを追加
↓
再テスト
↓
正常実行
Lambda Layerは、Lambdaから利用する共通コードやライブラリを、Lambda本体とは別に管理する仕組みです。
特に、複数のLambdaで同じコードやライブラリを使用する場合に活用できます。
参考にした記事
Lambda Layerの仕様やLayerの構成について、以下のAWS公式ドキュメントを参考にしました。
-
「Managing Lambda dependencies with layers」
https://docs.aws.amazon.com/lambda/latest/dg/chapter-layers.html -
「Working with layers for Python Lambda functions」
https://docs.aws.amazon.com/lambda/latest/dg/python-layers.html
同じカテゴリーの記事
同じカテゴリの記事を読む