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

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

Lambda レイヤーを使用して、複数の関数間で再利用するコードおよび依存関係をパッケージ化できます。レイヤーには通常、ライブラリの依存関係、カスタムランタイム、または設定ファイルが含まれています。レイヤーの作成には、次の 3 つの一般的な手順が含まれます。

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

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

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

レイヤーコンテンツのパッケージ化

レイヤーを作成するには、次の要件を満たす .zip ファイルのアーカイブにパッケージをバンドルします。

  • Lambda 関数に使用するのと同じ Python バージョンを使用してレイヤーを構築すること。例えば、Python 3.13 を使用してレイヤーを構築する場合、関数にも Python 3.13 ランタイムを使用してください。

  • .zip ファイルは、ルートレベルに python ディレクトリを含む必要があります。

  • レイヤーのパッケージは Linux と互換性がある必要があります。Lambda 関数は Amazon Linux 上で動作します。

  • レイヤーにネイティブバイナリまたは実行可能ファイルが含まれている場合は、関数と同じアーキテクチャ(x86_64 または arm64)をターゲットにする必要があります。

pip がインストールされたサードパーティ Python ライブラリ (requestspandas など) か、ユーザー独自の Python モジュールやパッケージのいずれかを含むレイヤーを作成できます。

pip パッケージを使用してレイヤーを作成する方法
  1. 次のいずれかの方法を選択し、必要な最上位ディレクトリ (python/) に pip パッケージをインストールします。

    pip install

    純粋な Python パッケージ (リクエストや boto3 など) の場合、以下に留意してください。

    pip install requests -t python/

    NumPy や Pandas などの一部の Python パッケージには、コンパイルされた C コンポーネントが含まれています。macOS または Windows でこれらのパッケージのレイヤーを構築する場合、次のコマンドを使用して Linux 互換のホイールをインストールする必要があるかもしれません。

    pip install numpy --platform manylinux2014_x86_64 --only-binary=:all: -t python/

    コンパイルされたコンポーネントを含む Python パッケージ操作の詳細については、「ネイティブライブラリとともに .zip デプロイパッケージを作成する」を参照してください。

    requirements.txt

    requirements.txt ファイルを使用すると、パッケージバージョンを管理して一貫性のあるインストールを確保できます。

    例 requirements.txt
    requests==2.31.0 boto3==1.37.34 numpy==1.26.4

    requirements.txt ファイルに純粋な Python パッケージ (リクエストや boto3 など) のみが含まれている場合、以下に留意してください。

    pip install -r requirements.txt -t python/

    NumPy や Pandas などの一部の Python パッケージには、コンパイルされた C コンポーネントが含まれています。macOS または Windows でこれらのパッケージのレイヤーを構築する場合、次のコマンドを使用して Linux 互換のホイールをインストールする必要があるかもしれません。

    pip install -r requirements.txt --platform manylinux2014_x86_64 --only-binary=:all: -t python/

    コンパイルされたコンポーネントを含む Python パッケージ操作の詳細については、「ネイティブライブラリとともに .zip デプロイパッケージを作成する」を参照してください。

  2. python ディレクトリの内容を圧縮します。

    Linux/macOS
    zip -r layer.zip python/
    PowerShell
    Compress-Archive -Path .\python -DestinationPath .\layer.zip

    .zip ファイルのディレクトリ構造は次のようになります。

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

    Python 仮想環境 (venv) を使用してパッケージをインストールする場合、ディレクトリ構造はこれとは異なります (python/lib/python3.x/site-packages など)。.zip ファイルにルートレベルの python ディレクトリが含まれる限り、Lambda はパッケージを見つけてインポートすることができます。

ユーザー独自のコードを使用してレイヤーを作成する方法
  1. レイヤーに必要な最上位ディレクトリを作成します。

    mkdir python
  2. python ディレクトリに Python モジュールを作成します。次のモジュール例は、必要な情報が含まれていることを確認して注文をバリデーションします。

    例 カスタムモジュール: validator.py
    import json def validate_order(order_data): """Validates an order and returns formatted data.""" required_fields = ['product_id', 'quantity'] # Check required fields missing_fields = [field for field in required_fields if field not in order_data] if missing_fields: raise ValueError(f"Missing required fields: {', '.join(missing_fields)}") # Validate quantity quantity = order_data['quantity'] if not isinstance(quantity, int) or quantity < 1: raise ValueError("Quantity must be a positive integer") # Format and return the validated data return { 'product_id': str(order_data['product_id']), 'quantity': quantity, 'shipping_priority': order_data.get('priority', 'standard') } def format_response(status_code, body): """Formats the API response.""" return { 'statusCode': status_code, 'body': json.dumps(body) }
  3. python ディレクトリの内容を圧縮します。

    Linux/macOS
    zip -r layer.zip python/
    PowerShell
    Compress-Archive -Path .\python -DestinationPath .\layer.zip

    .zip ファイルのディレクトリ構造は次のようになります。

    python/     # Required top-level directory
    └── validator.py
  4. 関数で、Python パッケージと同様にモジュールをインポートして使用します。例:

    from validator import validate_order, format_response import json def lambda_handler(event, context): try: # Parse the order data from the event body order_data = json.loads(event.get('body', '{}')) # Validate and format the order validated_order = validate_order(order_data) return format_response(200, { 'message': 'Order validated successfully', 'order': validated_order }) except ValueError as e: return format_response(400, { 'error': str(e) }) except Exception as e: return format_response(500, { 'error': 'Internal server error' })

    次のテストイベントを使用して関数を呼び出すことができます。

    { "body": "{\"product_id\": \"ABC123\", \"quantity\": 2, \"priority\": \"express\"}" }

    予想されるレスポンス

    { "statusCode": 200, "body": "{\"message\": \"Order validated successfully\", \"order\": {\"product_id\": \"ABC123\", \"quantity\": 2, \"shipping_priority\": \"express\"}}" }

Lambda でレイヤーを作成する

AWS CLI または Lambda コンソールを使用して、レイヤーを発行できます。

AWS CLI

publish-layer-version AWS CLI コマンドを実行して Lambda レイヤーを作成します。

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

互換性のあるランタイムパラメータの使用は任意です。指定すると、Lambda はこのパラメータを使用して Lambda コンソールのレイヤーをフィルタリングします。

Console
レイヤーを作成するには (コンソール)
  1. Lambda コンソールの [Layers (レイヤー)] ページを開きます。

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

  3. [.zip ファイルをアップロードする]を選択し、前の手順で作成しておいた .zip アーカイブをアップロードします。

  4. (オプション) [互換性のあるランタイム]には、レイヤーの構築に使用した Python バージョンに対応する Python ランタイムを選択できます。

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

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

AWS CLI

レイヤーを関数にアタッチするには、update-function-configuration AWS CLI コマンドを実行します。--layers パラメータには、レイヤー ARN を使用します。ARN はバージョンを指定する必要があります (arn:aws:lambda:us-east-1:123456789012:layer:my-layer:1 など)。詳細については、「レイヤーとレイヤーバージョン」を参照してください。

aws lambda update-function-configuration --function-name my-function --cli-binary-format raw-in-base64-out --layers "arn:aws:lambda:us-east-1:123456789012:layer:my-layer:1"

AWS CLI バージョン 2 を使用している場合、cli-binary-format オプションは必須です。これをデフォルト設定にするには、aws configure set cli-binary-format raw-in-base64-out を実行します。詳細については、バージョン 2 の AWS Command Line Interface ユーザーガイドの「AWS CLI でサポートされているグローバルコマンドラインオプション」を参照してください。

Console
関数にレイヤーを追加する方法
  1. Lambda コンソールの [関数] ページを開きます。

  2. 関数を選択します。

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

  4. [レイヤーの選択][カスタムレイヤー] を選択し、レイヤーを指定します。

    注記

    レイヤーの作成時に互換性のあるランタイムを追加しなかった場合、レイヤーはここには表示されません。代わりにレイヤー ARN を指定できます。

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

サンプルアプリ

Lambda レイヤーの使用方法のその他の例については、「AWS Lambda デベロッパーガイド」 GitHub リポジトリ内の Layer-python サンプルアプリケーションを参照してください。このアプリケーションは、Python ライブラリを含む 2 つのレイヤーを備えています。各レイヤーを作成したら、対応する関数をデプロイして呼び出し、それぞれのレイヤーが予想どおりに動作することを確認します。