🦴
psycopg2のLambda Layerを作成する(No module named 'psycopg2._psycopg')
概要
Lambda Layerを使用してFastAPIをデプロイしたが、以下のエラーが発生した。
No module named 'psycopg2._psycopg'
解決策を調べて色々試したが、記事の通りにしても解決できずでした。
最終的に、調べて出てきた記事通りとは別の方法で解決したので、改めてまとめておくことにしました。
ハマりどころ
-
pip install
のインストール先の指定は、-t python/
とした
他の記事では、-t python/lib/python3.12/site-packages/
としている場合が多い -
Docker Image
public.ecr.aws/sam/build-python3.12:latest
を使用した。
他の記事では、amazon/aws-sam-cli-build-image-python3.8
などを使用していたが、今回は
python3.12
であるため対象外であった。
解決方法
⭐️ psycopg2単体のLambda Layerを作成する。
- requirements.txtを作成する。
echo 'psycopg2-binary' > requirements.txt
- Dockerイメージを使ってDockerを起動
→ Dockerの起動時に現在のディレクトリをマウント
→psycopg2-binary
をpip install
する。
docker run -v "$PWD":/var/task "public.ecr.aws/sam/build-python3.12:latest" /bin/sh -c "pip install --platform manylinux2014_x86_64 --target . --python-version 3.12 --only-binary=:all: -r requirements.txt -t python/; exit"
- zipファイルを作成する
zip -r layer.zip python
- AWS CLIを設定する
aws configure
- S3バケットを作成する
aws s3 mb s3://psycopg2-binary-3-12 --region ap-northeast-1
- zipファイルをS3にアップロードする
aws s3 cp layer.zip s3://psycopg2-binary-3-12/layer.zip
- Lambda Layerを作成する
aws lambda publish-layer-version --layer-name psycopg2-binary-3-12 --zip-file fileb://layer.zip --compatible-runtimes python3.12
注意点
Lambda Layer(psycopg2-binary-3-12)は、他のLayerの後(一番最後など)に読み込むように設定すること。
LambdaのページのLambda Layer設定で、"マージ順序" → "後でマージ" で読み込む順番を変更できます。
Discussion