【AWS】Lambdaレイヤーでライブラリを共通化
Lambdaレイヤーの作成方法
LambdaデプロイパッケージではLambda関数ごとにライブラリをzipファイルで用意する必要がありましたが、lambdaレイヤーという機能を使用することで複数の異なるLambda関数から使用するライブラリの共通化を行うことが出来ます。
本記事では関数のランタイムをPython3にしていますが、それ以外の言語でも基本的な仕組みや考え方は同じです。
ライブラリの用意
デプロイパッケージで行うように、必要なライブラリをzipファイルに含めます。
(注意)lambdaレイヤーはAmazon Linux環境で作成する
Lambda関数が実行されるLambdaコンテナと呼ばれる環境はAmazon Linuxが稼働しているため、デプロイパッケージと同様lambdaレイヤーの作成も基本的にAmazon Linux環境で行う必要があります。
Amazon Linux版EC2を利用するか、もしくはローカル開発環境でもAmazon LinuxのDockerイメージを利用することができます。
ディレクトリ名を指定
zip化するライブラリを含めるディレクトリ名を、
pythonもしくはpython/lib/python3.8/site-packagesとする必要があります。
(ランタイムがPython3.8の場合)
これは、Lambda環境の/optというパスが関数実行時のライブラリ検索パスとなっており、
パスを定義された名称に揃えることで、レイヤーの内容が関数内からimport出来るようにするためです。
Lambdaランタイム ごとに、PATH 変数には /opt ディレクトリ内の特定のフォルダが含まれます。レイヤー .zip ファイルアーカイブに同じフォルダ構造を定義すると、関数コードはパスを指定しなくても、レイヤーコンテンツにアクセスできます。
公式ドキュメント 「ライブラリの依存関係をレイヤーに含める」より
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-layers.html#configuration-layers-path
1. 開発環境にて、Pythonディレクトリを作成
mkdir python
2. ライブラリをディレクトリに含める
(例としてpyminizipモジュールを用意する)
mv pyminizip.cpython-37m-x86_64-linux-gnu.so python/
3. zip化
zip -r python.zip python/
zipファイル自体の名前は任意でOKです。
レイヤーの作成と関数への関連付け
ライブラリの準備が出来たら、コンソールよりLambdaレイヤーを作成していきます。
Lambda > レイヤー > レイヤーの作成
任意のレイヤー名を設定し、用意しておいたzipをアップロードします。
ランタイムを実行する関数と同じものに揃え、作成します。
レイヤーの作成が完了したら、Lambda関数一覧から対象を選択し、画面下部のレイヤー追加をクリック。
「カスタムレイヤー」から、先ほど作成したレイヤーとバージョン(初めて作成した場合は1のみ)を選択し追加をクリック。
作成が正常に行えると対象よりレイヤーの紐付けを確認できます。
1つの関数に対して最大で5つまでレイヤーを使用できます。