【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つまでレイヤーを使用できます。

Follow me!