LoginSignup
1
0

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

Posted at

初めに

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

対応したい内容

  • jwtライブラリが必要になった為、layers機能で対応する

Cloud9でLayerを作成する

Cloud9 起動

image.png
image.png

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

Cloud9の管理コンソールに入ります。
image.png

接続できるようになるまで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されてダウンロードされる。

image.png

Layerの登録作業

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

image.png

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

無事作成完了
image.png

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

image.png
image.png
image.png

お片付け

不要になった、Cloud9は削除しましょう
image.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の実行環境ではそのネイティブ依存関係がサポートされていない可能性があります。

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作るなら、環境は揃えましょう(笑)

では、また次の記事で!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0