Cookie の設定を選択する

当社は、当社のサイトおよびサービスを提供するために必要な必須 Cookie および類似のツールを使用しています。当社は、パフォーマンス Cookie を使用して匿名の統計情報を収集することで、お客様が当社のサイトをどのように利用しているかを把握し、改善に役立てています。必須 Cookie は無効化できませんが、[カスタマイズ] または [拒否] をクリックしてパフォーマンス Cookie を拒否することはできます。

お客様が同意した場合、AWS および承認された第三者は、Cookie を使用して便利なサイト機能を提供したり、お客様の選択を記憶したり、関連する広告を含む関連コンテンツを表示したりします。すべての必須ではない Cookie を受け入れるか拒否するには、[受け入れる] または [拒否] をクリックしてください。より詳細な選択を行うには、[カスタマイズ] をクリックしてください。

Python Lambda 関数にレイヤーを使用する

フォーカスモード
Python Lambda 関数にレイヤーを使用する - AWS Lambda

Lambda レイヤー は、補助的なコードやデータを含む .zip ファイルアーカイブです。レイヤーには通常、ライブラリの依存関係、カスタムランタイム、または設定ファイルが含まれています。レイヤーの作成には、次の 3 つの一般的な手順が含まれます。

  1. レイヤーコンテンツのパッケージ化。これは、関数で使用する依存関係を含む .zip ファイルアーカイブを作成することを意味します。

  2. Lambda でレイヤーを作成します。

  3. レイヤーを関数に追加します。

このトピックには、外部ライブラリの依存関係を持つ Python Lambda レイヤーを適切にパッケージ化して作成する方法に関する手順とガイダンスが含まれています。

前提条件

このセクションの手順を完了するには、次の事項が必要です。

このトピック全体では、awsdocs GitHub リポジトリの「layer-python」サンプルアプリケーションを参照します。このアプリケーションには、依存関係をダウンロードしてレイヤーを生成するスクリプトが含まれています。アプリケーションは対応する関数も含んでおり、レイヤーの依存関係を使用します。レイヤーを作成したら、対応する関数をデプロイして呼び出し、すべてが正しく動作することを確認できます。レイヤーのランタイムは、関数のランタイムと互換性がある必要があります。例えば、関数に Python 3.13 ランタイムを使用する場合、レイヤーは Python 3.13 と互換性がある必要もあります。

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 パッケージがホイールとして利用できない場合があります。「ソースディストリビューション」(sdist) のみが存在する場合、「Amazon Linux 2023 ベースコンテナイメージ」に基づく「Docker」環境に依存関係をインストールしてパッケージ化することをお勧めします。C/C++ などの他の言語で記述された独自のカスタムライブラリを含める場合も、このアプローチをお勧めします。このアプローチは Docker の Lambda 実行環境を模倣しており、Python 以外のパッケージの依存関係が Amazon Linux と互換性があることを保証します。

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 ファイルにパッケージ化します。レイヤーコンテンツをインストールしてパッケージ化するには、次の手順を実行します。

レイヤーコンテンツをインストールしてパッケージ化する方法
  1. sample-apps/layer-python ディレクトリで必要なサンプルコードを含む「aws-lambda-developer-guide GitHub リポジトリ」を複製します。

    git clone https://github.com/awsdocs/aws-lambda-developer-guide.git
  2. layer-python サンプルアプリの layer ディレクトリに移動します。このディレクトリには、レイヤーを適切に作成してパッケージ化するために使用するスクリプトが含まれています。

    cd aws-lambda-developer-guide/sample-apps/layer-python/layer
  3. requirements.txt ファイルを検証する このファイルは、レイヤー (つまり requests ライブラリ) に含める依存関係を定義します。このファイルを更新し、独自のレイヤーに含める依存関係を含めることができます。

    例 requirements.txt
    requests==2.31.0
  4. 両方のスクリプトを実行する許可があることを確認してください。

    chmod 744 1-install.sh && chmod 744 2-package.sh
  5. 次のコマンドを使用して「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
  6. 次のコマンドを使用して「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:1 に似ている LayerVersionArn に注目してください。この Amazon リソースネーム (ARN) は、このチュートリアルの次の手順で、レイヤーを関数に追加するときに必要になります。

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

このセクションでは、関数コードで requests ライブラリを使用するサンプル Lambda 関数をデプロイし、Layer をアタッチします。関数をデプロイするには、実行ロールが必要です。既存の実行ロールをお持ちでない場合、折りたたみ可能なセクションの手順を実行してください。

実行ロールを作成する
  1. IAM コンソールの [ロールページ] を開きます。

  2. [ロールの作成] を選択します。

  3. 次のプロパティでロールを作成します。

    • 信頼されたエンティティLambda

    • アクセス許可AWSLambdaBasicExecutionRole

    • ロール名lambda-role

    AWSLambdaBasicExecutionRole ポリシーには、ログを CloudWatch Logs に書き込むために関数が必要とするアクセス許可があります。

実行ロールを作成する
  1. IAM コンソールの [ロールページ] を開きます。

  2. [ロールの作成] を選択します。

  3. 次のプロパティでロールを作成します。

    • 信頼されたエンティティ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 関数をデプロイする方法
  1. function/ ディレクトリに移動します。現在、layer/ ディレクトリにいる場合、次のコマンドを実行します。

    cd ../function
  2. 次のコマンドを使用し、.zip ファイルのデプロイパッケージを作成します。

    zip my_deployment_package.zip lambda_function.py
  3. 関数をデプロイします。次の 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
  4. 次に、レイヤーを関数にアタッチします。次の 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"
  5. 最後に、次の 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 レイヤーを削除する方法
  1. Lambda コンソールの [Layers (レイヤー)] ページを開きます。

  2. 作成したレイヤーを選択します。

  3. [削除] を選択したら、[削除] を再度選択します。

Lambda 関数を削除するには
  1. Lambda コンソールの関数ページを開きます。

  2. 作成した関数を選択します。

  3. [アクション] で、[削除] を選択します。

  4. テキスト入力フィールドに confirm と入力し、[削除] を選択します。

このチュートリアル用に作成したリソースは、保持しない場合は削除できます。使用しなくなった AWS リソースを削除することで、AWS アカウント アカウントに請求される料金の発生を防ぎます。

Lambda レイヤーを削除する方法
  1. Lambda コンソールの [Layers (レイヤー)] ページを開きます。

  2. 作成したレイヤーを選択します。

  3. [削除] を選択したら、[削除] を再度選択します。

Lambda 関数を削除するには
  1. Lambda コンソールの関数ページを開きます。

  2. 作成した関数を選択します。

  3. [アクション] で、[削除] を選択します。

  4. テキスト入力フィールドに confirm と入力し、[削除] を選択します。

manylinux ホイールディストリビューションを使用する

依存関係として含めるパッケージにユニバーサルホイールがない (具体的には、プラットフォームタグとして any がない) 場合があります。この場合は、代わりに manylinux をサポートするホイールをダウンロードしてください。これにより、レイヤーライブラリが Amazon Linux と互換性があることが保証されます。

numpy」は、ユニバーサルホイールを備えていないパッケージの 1 つです。numpy パッケージをレイヤーに含める場合、次のサンプルステップを実行し、レイヤーを適切にインストールしてパッケージ化できます。

レイヤーコンテンツをインストールしてパッケージ化する方法
  1. sample-apps/layer-python ディレクトリで必要なサンプルコードを含む「aws-lambda-developer-guide GitHub リポジトリ」を複製します。

    git clone https://github.com/awsdocs/aws-lambda-developer-guide.git
  2. layer-python サンプルアプリの layer-numpy ディレクトリに移動します。このディレクトリには、レイヤーを適切に作成してパッケージ化するために使用するスクリプトが含まれています。

    cd aws-lambda-developer-guide/sample-apps/layer-python/layer-numpy
  3. 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
  4. 両方のスクリプトを実行する許可があることを確認してください。

    chmod 744 1-install.sh && chmod 744 2-package.sh
  5. 次のコマンドを使用して「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
  6. 次のコマンドを使用して「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:1 に似ている LayerVersionArn に注目してください。レイヤーが期待どおりに機能することを確認するには、Lambda 関数を function-numpy ディレクトリにデプロイします。

Lambda 関数をデプロイする方法
  1. function-numpy/ ディレクトリに移動します。現在、layer-numpy/ ディレクトリにいる場合、次のコマンドを実行します。

    cd ../function-numpy
  2. 関数コード」を確認します。関数は 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!') }
  3. 次のコマンドを使用し、.zip ファイルのデプロイパッケージを作成します。

    zip my_deployment_package.zip lambda_function.py
  4. 関数をデプロイします。次の 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
  5. 次に、レイヤーを関数にアタッチします。次の 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"
  6. 最後に、次の 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 配列を標準出力に出力していることを確認できます。

プライバシーサイト規約Cookie の設定
© 2025, Amazon Web Services, Inc. or its affiliates.All rights reserved.