Lambda Layerを作成したいがめんどくさい
Lambda LayerはAWS Lambdaに標準で用意されていないライブラリや自分で作成した関数などを取り込む際に利用します。
一見zipファイルを作成してアップロードするだけなんですが、いくつか落とし穴があります
- Amazon Linuxで作成する必要がある(場合がある)
- LambdaはAmazonLinuxで動いている
- macOSなどでインストールしたものがAmazonLinuxで動かない場合があるため
- 求められるディレクトリ構造が実はある
- apiでのzipアップロードはファイルサイズの制限がある
などなどで躓いたのでやり方をまとめておきます
AmazonLinuxでのpython実行環境の用意
構築方法は別記事にまとめました。ローカル環境(macOSやWindows)でインストールしたライブラリをアップロードすると、動くときもありますが動かないときもあります。仮に動いたとしても、基本的にはAmazonLinuxで作成するほうが良いでしょう。
pythonはLambdaで使用するバージョンと合わせる必要があります。
ディレクトリ構成
適当にディレクトリを作成してもLambdaが読み取ってくれません。具体的な構成は以下のリンクを参考にすると良いでしょう。
バージョンを含める場合は
python/lib/python3.x/site-packages
といった構成にする必要がありますが。単一のバージョンで良ければpythonという名称のディレクトリを作成してそこにライブラリをインストールする必要があります。
よくわからない仕様にも思えますが、実際にLambdaで使うときはこのzipを解凍して、ある程度ディレクトリ構成を統一させる必要があるからかなと思っています。とはいえこのような仕様はもっと大きくはっきりと書いてほしいなと言う個人的な思いはあります。
インストール方法
作業場所は任意でOKです。
まずはpythonディレクトリを作成します。
mkdir python
続いてインストールするライブラリ一覧を書き込むrequirements.txtを作成します。
pandas
requests
今回は基本的なライブラリのpandasとrequetsを対象としました。
pip install -r requirements.txt -t ./python
次にインストールしたディレクトリをzipファイル化します。
zip -r python.zip python
Lambda Layerにアップロード
今回はすでに作成されているレイヤーにアップロードする前提でいきます。
アップロードする際は
aws lambda publish-layer-version \
--layer-name hoge-layer-name \
--description "" \
--zip-file fileb:///path/to/python.zip \
--compatible-runtimes python3.12 --region ap-northeast-1
これで完了するのですが、api経由だとファイルサイズが50MBの制限があります。
この制限を超えたアップロードするには一旦ファイルをS3に置く必要があります。
aws s3 cp /path/to/python.zip s3://backet_name/path/to/python.zip
そしてpublic-layer-versionコマンドで、先程アップロードしたS3オブジェクトを参照させます。
aws lambda publish-layer-version \
--layer-name hoge-layer-name \
--description "" \
--content S3Bucket=bucket_name,S3Key=path/to/python.zip \
--compatible-runtimes python3.12 --region ap-northeast-1
これにてlayerの作成が完了します。ライブラリが増えるとあっという間に50MBを超えるので面倒ですが、S3を経由させます。
より簡単なやり方あったら知りたいです。よろしくお願いします。