AWS Lambda Layerとは？の備忘録

## 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
```python
# my_layer_code.py
import boto3

def my_layer_function():
    # Boto3を使用した処理
    s3 = boto3.client('s3')
    response = s3.list_buckets()
    return response
```

Lambda関数のコード:

```python
# 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使用しないとどうなる？

使用しないと以下のようなコード例になる

```python
# 重複する処理: データの取得前後に共通する処理
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をインポートして使用します。
```python
# 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をインポートして使用します。
```python
# 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ステートメントで利用することができます。