

# Python Lambda 関数にレイヤーを使用する
<a name="python-layers"></a>

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

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

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

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

**Topics**
+ [

## レイヤーコンテンツのパッケージ化
](#python-layers-package)
+ [

## Lambda でレイヤーを作成する
](#publishing-layer)
+ [

## レイヤーを関数に追加する
](#python-layer-adding)
+ [

## サンプルアプリ
](#python-layer-sample-app)

## レイヤーコンテンツのパッケージ化
<a name="python-layers-package"></a>

レイヤーを作成するには、次の要件を満たす .zip ファイルのアーカイブにパッケージをバンドルします。
+ Lambda 関数に使用するのと同じ Python バージョンを使用してレイヤーを構築すること。例えば、Python 3.14 を使用してレイヤーを構築する場合、関数にも Python 3.14 ランタイムを使用してください。
+ .zip ファイルは、ルートレベルに `python` ディレクトリを含む必要があります。
+ レイヤーのパッケージは Linux と互換性がある必要があります。Lambda 関数は Amazon Linux 上で動作します。

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

### サードパーティーへの依存関係
<a name="python-layers-third-party-dependencies"></a>

**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 デプロイパッケージを作成する](python-package.md#python-package-native-libraries)」を参照してください。

------
#### [ requirements.txt ]

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

**Example 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 デプロイパッケージを作成する](python-package.md#python-package-native-libraries)」を参照してください。

------

1. `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 はパッケージを見つけてインポートすることができます。

### カスタム Python モジュール
<a name="custom-python-modules"></a>

**ユーザー独自のコードを使用してレイヤーを作成する方法**

1. レイヤーに必要な最上位ディレクトリを作成します。

   ```
   mkdir python
   ```

1. `python` ディレクトリに Python モジュールを作成します。次のモジュール例は、必要な情報が含まれていることを確認して注文をバリデーションします。  
**Example カスタムモジュール: 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)
       }
   ```

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

------
#### [ Linux/macOS ]

   ```
   zip -r layer.zip python/
   ```

------
#### [ PowerShell ]

   ```
   Compress-Archive -Path .\python -DestinationPath .\layer.zip
   ```

------

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

   ```
   python/     # Required top-level directory
   └── validator.py
   ```

1. 関数で、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'
           })
   ```

   次の[テストイベント](testing-functions.md#invoke-with-event)を使用して関数を呼び出すことができます。

   ```
   {
       "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 でレイヤーを作成する
<a name="publishing-layer"></a>

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

------
#### [ AWS CLI ]

[publish-layer-version](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/publish-layer-version.html) AWS CLI コマンドを実行して Lambda レイヤーを作成します。

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

[互換性のあるランタイム](https://docs.aws.amazon.com/lambda/latest/api/API_PublishLayerVersion.html#lambda-PublishLayerVersion-request-CompatibleRuntimes)パラメータの使用は任意です。指定すると、Lambda はこのパラメータを使用して Lambda コンソールのレイヤーをフィルタリングします。

------
#### [ Console ]

**レイヤーを作成するには (コンソール)**

1. Lambda コンソールの [[Layers (レイヤー)] ページ](https://console.aws.amazon.com/lambda/home#/layers)を開きます。

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

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

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

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

------

## レイヤーを関数に追加する
<a name="python-layer-adding"></a>

------
#### [ AWS CLI ]

レイヤーを関数にアタッチするには、[update-function-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-configuration.html) AWS CLI コマンドを実行します。`--layers` パラメータには、レイヤー ARN を使用します。ARN はバージョンを指定する必要があります (`arn:aws:lambda:us-east-1:123456789012:layer:my-layer:1` など)。詳細については、「[レイヤーとレイヤーバージョン](chapter-layers.md#lambda-layer-versions)」を参照してください。

```
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 でサポートされているグローバルコマンドラインオプション](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list)」を参照してください。

------
#### [ Console ]

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

1. Lambda コンソールの [[関数]](https://console.aws.amazon.com/lambda/home#/functions) ページを開きます。

1. 関数を選択します。

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

1. **[レイヤーの選択]** で **[カスタムレイヤー]** を選択し、レイヤーを指定します。
**注記**  
レイヤーの作成時に[互換性のあるランタイム](https://docs.aws.amazon.com/lambda/latest/api/API_PublishLayerVersion.html#lambda-PublishLayerVersion-request-CompatibleRuntimes)を追加しなかった場合、レイヤーはここには表示されません。代わりにレイヤー ARN を指定できます。

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

------

## サンプルアプリ
<a name="python-layer-sample-app"></a>

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