Lambda Layerって何?
Lambdaのランタイムに備わっている標準ライブラリでは賄えないライブラリを使用したい場合に利用するサービス。
pythonの場合ですが、Lambdaのコードを見ているとよくファイル上部に
import json
import boto3
import logging
等と書かれていると思います。
これは、ライブラリをインポートしている部分になります。
Lambdaが起動されているAWS基盤に最初からインストールされているライブラリをpythonが読み込んで使用できる様にしている行になります。
pythonの標準ライブラリは以下になります。
https://docs.python.org/3/library/index.html?utm_source=chatgpt.com
なので上記以外のライブラリをインポートしてLambdaを実行しようとすると、
No module named ~
のエラーになります。
標準ライブラリ以外のライブラリを使用できるようにするのがLambda Layerになります。
今回はpostgresqlの接続に必要なドライバーのレイヤーを作成していきます。
作成手順
Lambda Layerが何なのかわかった所で早速作成していきましょう。
実行環境は適宜決めたら、
↓
Dockerfile作成
↓
コマンド実行
だけです。やっていきましょう。
Dockerfile
# ベースイメージの設定
FROM public.ecr.aws/lambda/python:3.xx
# 下記コマンドを実行する作業ディレクトリの指定
WORKDIR /work
# ベースイメージのパッケージを最新化
# zipファイル作成に必要なコマンドの導入
# 不要なキャッシュの削除
RUN dnf -y update && \
dnf -y install zip && \
dnf clean all
# psycopg2-binary のインストール(Lambda Layer 用)
RUN pip install psycopg2-binary -t /python/lib/python3.xx/site-packages/
# エントリポイントの無効化
ENTRYPOINT [""]
# zipファイル作成コマンド実行
CMD ["zip", "-r", "psycopg2-3.xx.zip", "/python/"]
ポイントは以下です。
FROM public.ecr.aws/lambda/python:3.xx
実際に使用したいLambdaと同じ環境でビルドされることになるので互換性のあるライブラリが出来上がります。
RUN pip install psycopg2-binary -t /python/lib/python3.xx/site-packages/
pythonの場合ですが、Lambda Layerがzipファイル内のライブラリを見に行く際、パスが「/python/lib/python3.xx/site-packages/」の様になっている事が期待される仕様になっている為任意で指定できない部分となっています。
ENTRYPOINT [""]
デフォルトは「ENTRYPOINT ["/lambda-entrypoint.sh"]」の様に設定されています。
このスクリプトファイルはRuntime Interface Client, RICを起動する為のスクリプトです。
RICはRuntime API を介して Lambda Service と通信
するものでコンテナがLambdaとしての機能を果たすために必要なコンポーネントです。
これを空にすることによってLambdaランタイムは機能せず、
ZIPファイルを作成するコマンドだけを実行するバッチコンテナとなります。
コマンド実行
Dockerfileを作成したらコンテナイメージをビルドします。
・コンテナイメージをビルド
docker build -t 任意のコンテナイメージ名 .
・ビルドしたイメージを使用してコンテナを起動
docker run --rm -v $PWD:/work ビルドしたコンテナイメージ名
・Lambda Layerの作成、アップロード
aws lambda publish-layer-version \
--layer-name psycopg2-layer \
--zip-file fileb://psycopg2-layer.zip \
--compatible-runtimes python3.xx
※layerのarnが返ってきます。
・Lambda LayerとLambda関数の紐付け
aws lambda update-function-configuration \
--function-name Lambda関数名 \
--layers 返ってきたlayerのarnを指定
これで「import psycopg2」が実行できる様になります。
お疲れ様でした。