初めに
Lambdaを開発する上で、どうしても追加ライブラリが必要になることがあります
そういう時は、layers機能を使い、対応しますが、今回Cloud9で四苦八苦したので、
備忘録として、残します
対応したい内容
- jwtライブラリが必要になった為、layers機能で対応する
Cloud9でLayerを作成する
Cloud9 起動
AmazonLinux2023で、起動していきます。
接続できるようになるまで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
5分から10分程度かかることがあります。気長に待ちましょう
インストールが終了したら、python全体設定を実施します。
pyenv global 3.12.3
python バージョン確認
python --version
Layer用ZIP作成
作業スペースを作成する。
DIRName=python;mkdir $DIRName;cd $DIRName
python以外の名前にすると、Lambdaで読み込まれない為、要注意
ライブラリを展開する
pip install PyJWT cryptography -t .
-t . をつけることで、今いるディレクトリーに展開する宣言を行っている。
ここまで終わったら、pythonフォルダをダウンロード。
ZIPされてダウンロードされる。
Layerの登録作業
名前を入力し、先ほどダウンロードしたZIPファイルをアップロード
互換性のあるランタイムを指定します
ランタイム 指定忘れに注意してください。
指定を忘れると、Layerの紐づけの際、表示されず、選択できません。
Lambda関数側の画面へ行き、一番下のLayerで紐づければ完了です
お片付け
失敗のまとめ
最終的に、上記でうまくいくようになったが、
過程でいくつか、失敗した為、まとめる
失敗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の実行環境ではそのネイティブ依存関係がサポートされていない可能性があります。
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
Lambdaをx86_64へ変更し、動作OKへ
Layerを作るときは、アーキテクチャー(x86_64/arm64)も同一構成にする
最後に
Lambda layersで、ライブラリを読み込める機能は、とても便利です
Lambdaで開発する幅が広がりますね!
セキュリティの管理(脆弱性管理)も必要になりますが、注意して使っていこうと思います
再度これだけは!
Lambda Layer作るなら、環境は揃えましょう(笑)
では、また次の記事で!