AWS Lambdaレイヤー設定ガイド：Lambdaレイヤーの活用で外部ライブラリの管理を効率化する方法

## はじめに
AWS Lambdaでは、複数のLambda関数間で共通のコードやライブラリを共有するためにLambdaレイヤーを使用します。

:::note
**Lambdaレイヤーを正しく設定することは、再利用可能なコードを効率よく管理できるため、システムの健全性を保つために非常に重要です。**
:::

しかし、Lambdaレイヤーが正しく設定されているかを確認する方法は意外と見落とされがちです。

私も普段からLambdaレイヤーを使う経験がほとんどなかったので、自分への備忘録として記事を整理しました。

## Lambdaレイヤーについて

Lambdaレイヤーは、AWS Lambda関数で使用するライブラリやコードを管理するための一種のアーカイブです。

![スクリーンショット 2024-11-14 21.12.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/0a1e0909-6a77-5f62-92bb-fe24f5ca85a6.png)
引用画像：https://aws.amazon.com/jp/builders-flash/202308/learn-lambda-function-execution/

:::note warn
**これにより、複数のLambda関数で共通のコードやライブラリを簡単に共有できます。**
:::

以下の記事でLambdaレイヤーについて詳しく説明されていますので、興味のある方は参考にしてみてください。

https://qiita.com/kimuni-i/items/bcec641c010ae5caa2d7

### Lambdaレイヤーの特徴

Lambdaレイヤーには、以下の特徴があります。

:::note info
- **コードの再利用:** 
複数のLambda関数で同じコードやパッケージを共有することができ、コードの重複を避けることができます。

- **依存パッケージの管理:** 
必要なライブラリや依存パッケージをLambdaレイヤーにまとめておくことで、Lambda関数内で直接パッケージを管理せずに済みます。

- **サイズ制限:** 
1つのレイヤーの最大サイズは50MB（圧縮後）であり、Lambda関数に最大5つのレイヤーを追加できます。
:::

## 実際にやってみた

### Lambdaレイヤーの作成

Lambdaレイヤーを作成するには、まず外部ライブラリ（この例では ``requests`` パッケージ）を含むアーカイブを作成する必要があります。

:::note
以下は、``requests`` パッケージを含んだLambdaレイヤーの作成手順で、ローカル環境で実施しています。
:::

**必要なライブラリのインストール**

```bash
mkdir python
pip install requests -t python/
```

ターミナル画面で、``pip`` コマンドを使って正常にインストールが完了したことが確認できました。

![スクリーンショット 2024-11-14 20.50.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/28c5be5c-a2fc-3a62-e37a-73ef7738796a.png)


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

``zip`` コマンドを実行した後、``requests-layer.zip`` というzipファイルが正常に作成されました。

![スクリーンショット 2024-11-14 20.53.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/9e274f82-ac2f-1dc1-c3a8-c1f616b23821.png)

**AWS Lambdaコンソールでレイヤーを作成**

AWS Lambdaコンソールを開き、「レイヤーの作成」を選択し、作成した ``requests-layer.zip`` をアップロードします。

![スクリーンショット 2024-11-14 20.54.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/787d47e0-4fc6-3310-ca1e-5b2283adae61.png)

レイヤー作成画面に遷移した後、任意の名前を付けて、「requests-layer.zip」をアップロードします。

![スクリーンショット 2024-11-14 20.57.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/1df5e8a3-975d-1584-a8ec-635eec6fa0c1.png)

ここでは、Pythonのバージョンを3.10に設定しています。また、レイヤーを作成後、Lambda関数で使用できるようになります。

## Lambda関数の作成

次に、作成したレイヤーを使用するLambda関数を作成します。ここでは、「test」という関数名で作成します。

![スクリーンショット 2024-11-14 20.59.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/4d7b3969-e5af-30c3-4e4e-4b2180171bda.png)

:::note warn
**ランタイムのバージョンは、Lambdaレイヤーのバージョンと合わせる必要がありますので、同じくPython 3.10を選択してください。**
:::

以下のコードは、requests パッケージを使用して外部のウェブサイト（例: ``https://www.example.com``）にアクセスし、そのレスポンスを返すシンプルな「Hello World」コードです。

```py
import requests

def lambda_handler(event, context):
    # Lambdaレイヤーで提供されたrequestsモジュールを使って確認
    response = requests.get('https://www.example.com')
    return {
        'statusCode': 200,
        'body': f'Hello, World! Status code from example.com: {response.status_code}'
    }
```

### Lambda関数とレイヤーの結合

次に、作成したLambda関数とLambdaレイヤーを結びつけます。

作成したLambda関数をクリックし、コードタブの最下部にある「レイヤー」セクションからレイヤーを追加します。

![スクリーンショット 2024-11-14 21.03.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/ab6655d5-451b-c75c-5fdd-dd337ab336e6.png)

「test」という関数名にレイヤーが正常にアタッチされていることが確認できました。

![スクリーンショット 2024-11-14 21.04.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/407dfb81-d57d-6695-040f-ab887f2c3d10.png)

### テスト実行
上記のコードをLambda関数に実装した後、実際にテストを実行し、レイヤーが正しく設定されているかを確認します。

![スクリーンショット 2024-11-14 21.06.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/895a4bc0-1b0d-34b4-418e-be1de1a9e21a.png)

Lambda関数を実行して、``requests`` パッケージが正常にインポートされ、外部リソースにアクセスできることを確認します。

![スクリーンショット 2024-11-14 21.07.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/9c448a9c-d1e5-9e71-819b-2fca172c24d6.png)

Lambda関数が正常に実行され、ステータスコード200が表示されれば、レイヤーが正しく設定されていることになります。

![スクリーンショット 2024-11-14 21.07.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/346aa301-fbd5-f69b-04f2-335debb55d9a.png)

:::note alert
**エラーが発生した場合は、必要なパッケージが含まれていないか、レイヤーが正しく適用されていない可能性があります。その際は再度確認してみてください。**
:::

## まとめ

AWS Lambdaのレイヤー機能を使って外部ライブラリの共有を試みましたが、最初はレイヤーの適用方法に苦戦しました。

:::note warn
**特に、レイヤーの作成とLambda関数への適用が正しく行われているかの確認に時間がかかりました。**
:::

Lambdaにはコードやライブラリを共有するためのレイヤー機能があることを初めて知り、その便利さに驚きました。

これにより、コードの再利用性と管理が大きく向上することが実感できました。


## 参考文献

https://qiita.com/PDC-Kurashinak/items/8df68b5260646b9611f9

https://qiita.com/Bashi50/items/1f72a93dbde23de55dda

https://www.gluegent.com/blog/2022/11/aws-lambda-layers.html

https://envader.plus/article/474