Lambda layersの作成方法 (Cloud9で簡単作成)

## 初めに
Lambdaを開発する上で、どうしても追加ライブラリが必要になることがあります
そういう時は、layers機能を使い、対応しますが、今回Cloud9で四苦八苦したので、
備忘録として、残します

## 対応したい内容
- jwtライブラリが必要になった為、layers機能で対応する

## Cloud9でLayerを作成する
#### Cloud9 起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3747609/c456a765-5a59-2138-c53f-175215c32676.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3747609/4ab5b832-b1b7-0fc6-746f-ade3b5bc648c.png)

AmazonLinux2023で、起動していきます。

Cloud9の管理コンソールに入ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3747609/c6d69fc2-339b-09c0-eb41-7e817d11bf07.png)

:::note info
接続できるようになるまで2-3分程度かかります。
:::

Lambdaで対応している、pythonの最新版は、3.12
AmazonLinux2023のpythonは、デフォルト 3.9となっていますので、
pyenvを入れて、最新版(3.12)で作成します。

#### pyenv 展開
```
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
```

pyenv パスを通します
```
echo 'export PATH="$HOME/.pyenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bashrc
```

pyenv パージョン確認
```
pyenv --version
```
> pyenv 2.4.0-2-ge1f07da7

バージョン情報が無事戻ってきたら、パスも通っています。

#### python インストール

インストール可能なバージョンを確認します
```
pyenv install --list
```

多くのバージョンが出てくるので、5つくらいに絞ることも可能
```
pyenv install --list | grep -v - | grep -v b | tail -5
```


最新バージョン 3.12.3 を入れていきます。(2024/04/21 現在)

```
pyenv install 3.12.3
```

:::note info
5分から10分程度かかることがあります。気長に待ちましょう
:::


インストールが終了したら、python全体設定を実施します。

```
pyenv global 3.12.3
```

python バージョン確認
```
python --version
```

#### Layer用ZIP作成

作業スペースを作成する。
```
DIRName=python;mkdir $DIRName;cd $DIRName
```

:::note alert
python以外の名前にすると、Lambdaで読み込まれない為、要注意
:::


ライブラリを展開する
```
 pip install PyJWT cryptography  -t .
```
 -t . をつけることで、今いるディレクトリーに展開する宣言を行っている。

 ここまで終わったら、pythonフォルダをダウンロード。
 ZIPされてダウンロードされる。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3747609/f0e8df78-6968-7b25-e753-730d64703991.png)

## Layerの登録作業

名前を入力し、先ほどダウンロードしたZIPファイルをアップロード
互換性のあるランタイムを指定します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3747609/a875b99f-568a-dec1-2229-9156e7cd33af.png)

:::note warn
ランタイム 指定忘れに注意してください。
指定を忘れると、Layerの紐づけの際、表示されず、選択できません。
:::

無事作成完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3747609/6a463652-2dd1-59e6-818f-ec66873d01a8.png)


Lambda関数側の画面へ行き、一番下のLayerで紐づければ完了です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3747609/e354281d-e80c-b05e-ed4f-148536bbc3f3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3747609/f1b590bc-7427-e9ee-66cc-50b1963e3b6a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3747609/1afb9f42-2948-2222-ce60-44f2580d5547.png)

## お片付け
不要になった、Cloud9は削除しましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3747609/f1cc8226-a74d-69f1-9400-2f7e22c15e20.png)

## 失敗のまとめ
最終的に、上記でうまくいくようになったが、
過程でいくつか、失敗した為、まとめる

#### 失敗1
AmazonLinux2023にそのまま、Layer用ディレクトリを作成し、ライブラリーを展開
以下のエラーが発生。

> ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
> awscli 2.14.5 requires cryptography<40.0.2,>=3.3.2, but you have cryptography 42.0.5 which is incompatible.

AWSCLIを削除し、ZIP化まで実施したが、Layer登録を行っても、動作不良が発生。
⇒python3.12で展開しなかった為、依存関係か何かでエラーになっていたと思われる。

ちなみに、Claude 3 sonnetにエラー内容について質問したところ、以下の回答あり

>このエラーは、AWSLambda関数の実行時にPython依存パッケージの読み込みに失敗したことを示しています。 具体的には、cryptographyパッケージをインポートする際に、CFfiバックエンドのロードに失敗しているようです。
>```
>ModuleNotFoundError: No module named '_cffi_backend'
>```
>Cryptographyパッケージは、PythonでOpenSSLバインディングを提供するC言語拡張モジュールを使用しています。しかし、Lambdaの実行環境ではそのネイティブ依存関係がサポートされていない可能性があります。

:::note warn
pythonのバージョンは、同一にして作成しましょう
:::

#### 失敗2
アーキテクチャーもあわせて、Layerを作成しましょう

Lambda、EC2には、2パターンあります
> x86_64
> arm64

Lambdaは、安くしたかった為、arm64
Cloud9は、x86_64になっていた (デフォルトが、t2.microになっている為)
Cryptographyで、エラーが発生し、調査をしたところ、同じ事象が発生している記事あり

> [ERROR] Runtime.ImportModuleError: Unable to import module 'lambda_handler': /var/task/cryptography/hazmat/bindings/_rust.abi3.so: cannot open shared object file: No such file or directory

https://qiita.com/mmclsntr/items/406b0ae972465cd9a10b

Lambdaをx86_64へ変更し、動作OKへ

:::note warn
Layerを作るときは、アーキテクチャー(x86_64/arm64)も同一構成にする
:::

## 最後に
Lambda layersで、ライブラリを読み込める機能は、とても便利です
Lambdaで開発する幅が広がりますね！

セキュリティの管理(脆弱性管理)も必要になりますが、注意して使っていこうと思います

再度これだけは！

**Lambda Layer作るなら、環境は揃えましょう(笑)**

では、また次の記事で！