Lambda レイヤー は、補助的なコードやデータを含む .zip ファイルアーカイブです。レイヤーには通常、ライブラリの依存関係、カスタムランタイム、または設定ファイルが含まれています。レイヤーの作成には、次の 3 つの一般的な手順が含まれます。
-
レイヤーコンテンツのパッケージ化。これは、関数で使用する依存関係を含む .zip ファイルアーカイブを作成することを意味します。
-
Lambda でレイヤーを作成します。
-
レイヤーを関数に追加します。
このトピックには、外部ライブラリの依存関係を持つ Python Lambda レイヤーを適切にパッケージ化して作成する方法に関する手順とガイダンスが含まれています。
トピック
前提条件
このセクションの手順を完了するには、次の事項が必要です。
-
「Python 3.13
」および「pip 」のパッケージインストーラ
このトピック全体では、awsdocs GitHub リポジトリの「layer-python
layer-python
サンプルアプリケーションには、2 つの例があります。
-
最初の例では、「
requests
」ライブラリを Lambda レイヤーにパッケージ化します。 layer/
ディレクトリには、レイヤーを生成するスクリプトが含まれています。function/
ディレクトリには、レイヤーが動作するテストを支援するサンプル関数が含まれています。このチュートリアルの大部分では、このレイヤーを作成してパッケージ化する方法について説明します。 -
2 番目の例では、「
numpy
」ライブラリを Lambda レイヤーにパッケージ化します。 layer-numpy/
ディレクトリには、レイヤーを生成するスクリプトが含まれています。function-numpy/
ディレクトリには、レイヤーが動作するテストを支援するサンプル関数が含まれています。このレイヤーを作成およびパッケージ化する方法の例については、「manylinux ホイールディストリビューションを使用する」を参照してください。
Python レイヤーと Amazon Linux の互換性
レイヤーを作成する最初のステップは、すべてのレイヤーコンテンツを .zip ファイルアーカイブにバンドルすることです。Lambda 関数は Amazon Linux 上で実行されるため、レイヤーコンテンツは Linux 環境でコンパイルおよびビルドできる必要があります。
Python では、ほとんどのパッケージはソースディストリビューションに加え、「ホイール.whl
ファイル) として利用できます。各ホイールは、Python バージョン、オペレーティングシステム、機械語命令セットの特定の組み合わせをサポートするビルド済みディストリビューションの一種です。
ホイールは、レイヤーが Amazon Linux と互換性があることを確認するために便利です。依存関係をダウンロードするとき、可能であればユニバーサルホイールをダウンロードしてください。(デフォルトでは、ユニバーサルホイールが利用可能であれば、pip
がインストールします。) ユニバーサルホイールはプラットフォームタグとして any
が含まれており、Amazon Linux を含むすべてのプラットフォームと互換性があることを示しています。
次の例では、requests
ライブラリを Lambda レイヤーにパッケージ化します。requests
ライブラリは、ユニバーサルホイールとして利用できるパッケージの一例です。
すべての Python パッケージはユニバーサルホイールとして配布されているわけではありません。例えば、「numpy
manylinux
ディストリビューションをダウンロードして Amazon Linux との互換性を確認してください。このような Layer をパッケージ化する方法の詳細な手順については、「manylinux ホイールディストリビューションを使用する」を参照してください。
まれに、Python パッケージがホイールとして利用できない場合があります。「ソースディストリビューション
Python ランタイムのレイヤーパス
関数にレイヤーを追加すると、Lambda はレイヤーのコンテンツをその実行環境の /opt
ディレクトリに読み込みます。Lambda ランタイムごとに、PATH
変数には /opt
ディレクトリ内の特定のフォルダパスがあらかじめ含まれます。Lambda がレイヤーコンテンツを取得できるようにするには、レイヤーの .zip ファイルの依存関係が次のフォルダパスにある必要があります。
-
python
-
python/lib/python3.
x
/site-packages
例えば、このチュートリアルで作成するレイヤーの .zip ファイルは、次のディレクトリ構造になっています。
layer_content.zip
└ python
└ lib
└ python3.13
└ site-packages
└ requests
└ <other_dependencies> (i.e. dependencies of the requests package)
└ ...
「requests
python/lib/python3.13/site-packages
ディレクトリに正しく配置されています。これにより、Lambda は関数の呼び出し中にライブラリを見つけられるようになります。
レイヤーコンテンツのパッケージ化
この例では、Python requests
ライブラリをレイヤーの .zip ファイルにパッケージ化します。レイヤーコンテンツをインストールしてパッケージ化するには、次の手順を実行します。
レイヤーコンテンツをインストールしてパッケージ化する方法
-
sample-apps/layer-python
ディレクトリで必要なサンプルコードを含む「aws-lambda-developer-guide
GitHub リポジトリ」を複製します。 git clone https://github.com/awsdocs/aws-lambda-developer-guide.git
-
layer-python
サンプルアプリのlayer
ディレクトリに移動します。このディレクトリには、レイヤーを適切に作成してパッケージ化するために使用するスクリプトが含まれています。cd aws-lambda-developer-guide/sample-apps/layer-python/layer
-
requirements.txt
ファイルを検証する このファイルは、レイヤー (つまり requests
ライブラリ) に含める依存関係を定義します。このファイルを更新し、独自のレイヤーに含める依存関係を含めることができます。例 requirements.txt
requests==2.31.0
-
両方のスクリプトを実行する許可があることを確認してください。
chmod 744 1-install.sh && chmod 744 2-package.sh
-
次のコマンドを使用して「
1-install.sh
」スクリプトを実行します。 ./1-install.sh
このスクリプトは
venv
を使用し、create_layer
という名前の Python 仮想環境を作成します。次に、必要な依存関係をすべてcreate_layer/lib/python3.11/site-packages
ディレクトリにインストールします。例 1-install.sh
python3.13 -m venv create_layer source create_layer/bin/activate pip install -r requirements.txt
-
次のコマンドを使用して「
2-package.sh
」スクリプトを実行します。 ./2-package.sh
このスクリプトは、
create_layer/lib
ディレクトリからpython
という名前の新しいディレクトリに内容をコピーします。次に、python
ディレクトリの内容をlayer_content.zip
という名前のファイルに圧縮します。これはレイヤーの .zip ファイルです。ファイルを解凍し、Python ランタイムのレイヤーパス セクションで示されている正しいファイル構造が含まれていることを確認できます。例 2-package.sh
mkdir python cp -r create_layer/lib python/ zip -r layer_content.zip python
レイヤーを作成する
このセクションでは、前のセクションで生成した「layer_content.zip
」ファイルを取得し、Lambda レイヤーとしてアップロードします。AWS Command Line Interface (AWS CLI) を介して AWS Management Consoleまたは Lambda API を使用してレイヤーをアップロードできます。レイヤーの .zip ファイルをアップロードするとき、次の「PublishLayerVersion」 AWS CLI コマンドで python3.13
を互換性のあるランタイムとして指定し、arm64
を互換性のあるアーキテクチャとして指定します。
aws lambda publish-layer-version --layer-name python-requests-layer \ --zip-file fileb://layer_content.zip \ --compatible-runtimes python3.13 \ --compatible-architectures "arm64"
レスポンスでは、arn:aws:lambda:us-east-1:
に似ている 123456789012
:layer:python-requests-layer:1LayerVersionArn
に注目してください。この Amazon リソースネーム (ARN) は、このチュートリアルの次の手順で、レイヤーを関数に追加するときに必要になります。
レイヤーを関数に追加する
このセクションでは、関数コードで requests
ライブラリを使用するサンプル Lambda 関数をデプロイし、Layer をアタッチします。関数をデプロイするには、実行ロールが必要です。既存の実行ロールをお持ちでない場合、折りたたみ可能なセクションの手順を実行してください。
実行ロールを作成する
-
IAM コンソールの [ロールページ
] を開きます。 -
[ロールの作成] を選択します。
-
次のプロパティでロールを作成します。
-
信頼されたエンティティ – Lambda。
-
アクセス許可 – AWSLambdaBasicExecutionRole。
-
ロール名 –
lambda-role
。
AWSLambdaBasicExecutionRole ポリシーには、ログを CloudWatch Logs に書き込むために関数が必要とするアクセス許可があります。
-
Lambda 関数コードrequests
ライブラリをインポートし、簡単な HTTP リクエストを行い、ステータスコードおよび本文を返します。
import requests
def lambda_handler(event, context):
print(f"Version of requests library: {requests.__version__}")
request = requests.get('https://api.github.com/')
return {
'statusCode': request.status_code,
'body': request.text
}
Lambda 関数をデプロイする方法
-
function/
ディレクトリに移動します。現在、layer/
ディレクトリにいる場合、次のコマンドを実行します。cd ../function
-
次のコマンドを使用し、.zip ファイルのデプロイパッケージを作成します。
zip my_deployment_package.zip lambda_function.py
-
関数をデプロイします。次の AWS CLI コマンドで、
--role
パラメータを実行ロール ARN に置き換えます。aws lambda create-function --function-name python_function_with_layer \ --runtime python3.13 \ --architectures "arm64" \ --handler lambda_function.lambda_handler \ --role
arn:aws:iam::123456789012:role/lambda-role
\ --zip-file fileb://my_deployment_package.zip -
次に、レイヤーを関数にアタッチします。次の AWS CLI コマンドで、
--layers
パラメーターを先にメモしたレイヤーバージョン ARN に置き換えます。aws lambda update-function-configuration --function-name python_function_with_layer \ --cli-binary-format raw-in-base64-out \ --layers "
arn:aws:lambda:us-east-1:123456789012:layer:python-requests-layer:1
" -
最後に、次の AWS CLI コマンドを使用して関数の呼び出しを試みます。
aws lambda invoke --function-name python_function_with_layer \ --cli-binary-format raw-in-base64-out \ --payload '{ "key": "value" }' response.json
次のような出力が表示されます。
{ "StatusCode": 200, "ExecutedVersion": "$LATEST" }
出力
response.json
ファイルには、レスポンスに関する詳細が含まれています。
このチュートリアル用に作成したリソースは、保持しない場合は削除できます。使用しなくなった AWS リソースを削除することで、AWS アカウント アカウントに請求される料金の発生を防ぎます。
Lambda レイヤーを削除する方法
-
Lambda コンソールの [Layers (レイヤー)] ページ
を開きます。 -
作成したレイヤーを選択します。
-
[削除] を選択したら、[削除] を再度選択します。
Lambda 関数を削除するには
-
Lambda コンソールの関数
ページを開きます。 -
作成した関数を選択します。
-
[アクション] で、[削除] を選択します。
-
テキスト入力フィールドに
confirm
と入力し、[削除] を選択します。
manylinux
ホイールディストリビューションを使用する
依存関係として含めるパッケージにユニバーサルホイールがない (具体的には、プラットフォームタグとして any
がない) 場合があります。この場合は、代わりに manylinux
をサポートするホイールをダウンロードしてください。これにより、レイヤーライブラリが Amazon Linux と互換性があることが保証されます。
「numpy
numpy
パッケージをレイヤーに含める場合、次のサンプルステップを実行し、レイヤーを適切にインストールしてパッケージ化できます。
レイヤーコンテンツをインストールしてパッケージ化する方法
-
sample-apps/layer-python
ディレクトリで必要なサンプルコードを含む「aws-lambda-developer-guide
GitHub リポジトリ」を複製します。 git clone https://github.com/awsdocs/aws-lambda-developer-guide.git
-
layer-python
サンプルアプリのlayer-numpy
ディレクトリに移動します。このディレクトリには、レイヤーを適切に作成してパッケージ化するために使用するスクリプトが含まれています。cd aws-lambda-developer-guide/sample-apps/layer-python/layer-numpy
-
requirements.txt
ファイルを検証する このファイルは、レイヤー (つまり、 numpy
ライブラリ) に含める依存関係を定義します。ここでは、Python 3.11、Amazon Linux、x86_64
指示セットと互換性のあるmanylinux
ホイールディストリビューションの URL を指定します。例 requirements.txt
https://files.pythonhosted.org/packages/3a/d0/edc009c27b406c4f9cbc79274d6e46d634d139075492ad055e3d68445925/numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
-
両方のスクリプトを実行する許可があることを確認してください。
chmod 744 1-install.sh && chmod 744 2-package.sh
-
次のコマンドを使用して「
1-install.sh
」スクリプトを実行します。 ./1-install.sh
このスクリプトは
venv
を使用し、create_layer
という名前の Python 仮想環境を作成します。次に、必要な依存関係をすべてcreate_layer/lib/python3.11/site-packages
ディレクトリにインストールします。--platform
タグをmanylinux2014_x86_64
として指定する必要があるため、この場合のpip
コマンドは異なります。ローカルマシンが MacOS または Windows を使用している場合でも、正しいmanylinux
ホイールをインストールするようにpip
に指示します。例 1-install.sh
python3.11 -m venv create_layer source create_layer/bin/activate pip install -r requirements.txt --platform=manylinux2014_x86_64 --only-binary=:all: --target ./create_layer/lib/python3.11/site-packages
-
次のコマンドを使用して「
2-package.sh
」スクリプトを実行します。 ./2-package.sh
このスクリプトは、
create_layer/lib
ディレクトリからpython
という名前の新しいディレクトリに内容をコピーします。次に、python
ディレクトリの内容をlayer_content.zip
という名前のファイルに圧縮します。これはレイヤーの .zip ファイルです。ファイルを解凍し、Python ランタイムのレイヤーパス セクションに示されている正しいファイル構造が含まれていることを確認できます。例 2-package.sh
mkdir python cp -r create_layer/lib python/ zip -r layer_content.zip python
このレイヤーを Lambda にアップロードするには、次の「PublishLayerVersion」 AWS CLI コマンドを使用します。
aws lambda publish-layer-version --layer-name python-numpy-layer \ --zip-file fileb://layer_content.zip \ --compatible-runtimes python3.11 \ --compatible-architectures "x86_64"
レスポンスでは、arn:aws:lambda:us-east-1:
に似ている 123456789012
:layer:python-numpy-layer:1LayerVersionArn
に注目してください。レイヤーが期待どおりに機能することを確認するには、Lambda 関数を function-numpy
ディレクトリにデプロイします。
Lambda 関数をデプロイする方法
-
function-numpy/
ディレクトリに移動します。現在、layer-numpy/
ディレクトリにいる場合、次のコマンドを実行します。cd ../function-numpy
-
「関数コード
」を確認します。関数は numpy
ライブラリをインポートし、単純なnumpy
配列を作成してダミーのステータスコードおよび本文を返します。import json import numpy as np def lambda_handler(event, context): x = np.arange(15, dtype=np.int64).reshape(3, 5) print(x) return { 'statusCode': 200, 'body': json.dumps('Hello from Lambda!') }
-
次のコマンドを使用し、.zip ファイルのデプロイパッケージを作成します。
zip my_deployment_package.zip lambda_function.py
-
関数をデプロイします。次の AWS CLI コマンドで、
--role
パラメータを実行ロール ARN に置き換えます。aws lambda create-function --function-name python_function_with_numpy \ --runtime python3.11 \ --handler lambda_function.lambda_handler \
--role arn:aws:iam::123456789012:role/lambda-role
\ --zip-file fileb://my_deployment_package.zip -
次に、レイヤーを関数にアタッチします。次の AWS CLI コマンドでは、
--layers
パラメータを以下のレイヤーバージョン ARN に置き換えます。aws lambda update-function-configuration --function-name python_function_with_numpy \ --cli-binary-format raw-in-base64-out \ --layers "
arn:aws:lambda:us-east-1:123456789012:layer:python-requests-layer:1
" -
最後に、次の AWS CLI コマンドを使用して関数の呼び出しを試みます。
aws lambda invoke --function-name python_function_with_numpy \ --cli-binary-format raw-in-base64-out \ --payload '{ "key": "value" }' response.json
次のような出力が表示されます。
{ "StatusCode": 200, "ExecutedVersion": "$LATEST" }
関数ログを調べ、コードが
numpy
配列を標準出力に出力していることを確認できます。