Lambda Layerとは
Lambda Layerは、AWS Lambda関数が共有のコードやライブラリ、設定などを取り込む仕組みです。具体的には、あらかじめ作成されたコードやライブラリのセットをLambda関数とは独立して管理し、必要な関数にアタッチすることができます。これにより、関数ごとに同じコードやライブラリを再度含める必要がなくなり、コードの再利用性と管理が向上します。
Lambda Layer使用上の制限
デプロイパッケージの最大サイズは50MB(ZIPファイル)
1つのレイヤーの最大サイズは解凍後に250MBに抑える必要あり
5つまで登録可能
Lambda Layerの使い方
Layerの作成:
Lambda Layerを作成し、共有したいコードやライブラリを含むZIPアーカイブをアップロードします。
Layerのバージョン管理:
Layerにバージョンを付けて、関数が特定のバージョンのLayerを利用できるようにします。
関数へのLayerのアタッチ:
各Lambda関数の設定で、関数に使用するLayerを指定します。
関数コード内での利用:
関数のコード内で、Lambda Layerに含まれるコードやライブラリを通常のimportステートメントで利用します。
コード例:
以下は、Lambda Layerを使用してBoto3(AWS SDK for Python)を共有する例です。
Lambda Layerは、複数のLambda関数で同じコードやライブラリを再利用するための仕組みです。以下に、一般的なLambda Layerの使い方とそのコード例を示します。
Lambda Layerの使い方:
Layerの作成:
Lambda Layerを作成し、共有したいコードやライブラリを含むZIPアーカイブをアップロードします。
Layerのバージョン管理:
Layerにバージョンを付けて、関数が特定のバージョンのLayerを利用できるようにします。
関数へのLayerのアタッチ:
各Lambda関数の設定で、関数に使用するLayerを指定します。
関数コード内での利用:
関数のコード内で、Lambda Layerに含まれるコードやライブラリを通常のimportステートメントで利用します。
コード例:
以下は、Lambda Layerを使用してBoto3(AWS SDK for Python)を共有する例です。
このモジュールはBoto3を使用してS3のバケット一覧を取得するコードです。
Layerに含まれるコード:my_layer_code.py
# my_layer_code.py
import boto3
def my_layer_function():
# Boto3を使用した処理
s3 = boto3.client('s3')
response = s3.list_buckets()
return response
Lambda関数のコード:
# my_lambda_function.py
from my_layer_code import my_layer_function
def lambda_handler(event, context):
# Lambda Layerに含まれるコードを使用
result = my_layer_function()
return {
'statusCode': 200,
'body': result
}
Lambda Layerの作成:
my_layer_codeディレクトリ全体をZIPアーカイブにし、AWS LambdaコンソールでLambda Layerとしてアップロードします。
関数へのLayerのアタッチ:
各Lambda関数の設定画面で、作成したLambda Layerをアタッチします。
これにより、複数のLambda関数が同じBoto3コードを再度含めることなく、Lambda Layerを通じて共有できます。Lambda関数は、共有されたLayerに含まれるコードを通常のimportステートメントで利用することができます。
Lambda Layer使用しないとどうなる?
使用しないと以下のようなコード例になる
# 重複する処理: データの取得前後に共通する処理
def common_processing(data):
# データ取得前の処理
print(f"Start processing for {data}...")
# データ取得後の処理
print(f"Processing completed for {data}.")
# 関数1: ユーザーのデータを取得する処理
def get_user_data(user_id):
# 重複してしまう処理
common_processing("user_data")
# ユーザーデータを取得する処理
user_data = {"user_id": user_id, "name": "John Doe"}
# 重複してしまう処理
common_processing("user_data")
return user_data
# 関数2: 商品のデータを取得する処理
def get_product_data(product_id):
# 重複してしまう処理
common_processing("product_data")
# 商品データを取得する処理
product_data = {"product_id": product_id, "name": "Product XYZ"}
# 重複してしまう処理
common_processing("product_data")
return product_data
Lambda Layerを使うとこのようになる
Lambda関数1 (get_user_data.py):
Lambda関数1では、Lambda Layerに登録されたcommon_moduleをインポートして使用します。
# get_user_data.py
from common_module import common_processing
def get_user_data(user_id):
# 共通の処理を呼び出す
common_processing("user_data")
# ユーザーデータを取得する処理
user_data = {"user_id": user_id, "name": "John Doe"}
# 共通の処理を呼び出す
common_processing("user_data")
return user_data
Lambda関数2 (get_product_data.py):
Lambda関数2も同様にcommon_moduleをインポートして使用します。
# get_product_data.py
from common_module import common_processing
def get_product_data(product_id):
# 共通の処理を呼び出す
common_processing("product_data")
# 商品データを取得する処理
product_data = {"product_id": product_id, "name": "Product XYZ"}
# 共通の処理を呼び出す
common_processing("product_data")
return product_data
これにより、common_moduleがLambda Layerに登録され、複数のLambda関数が同じ共通処理を共有できるようになります。Lambda関数はLambda Layerで提供されるリソースを通常のimportステートメントで利用することができます。