🦴

psycopg2のLambda Layerを作成する(No module named 'psycopg2._psycopg')

2024/11/13に公開

概要

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を作成する。

  1. requirements.txtを作成する。
echo 'psycopg2-binary' > requirements.txt
  1. Dockerイメージを使ってDockerを起動
    → Dockerの起動時に現在のディレクトリをマウント
    psycopg2-binarypip 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"
  1. zipファイルを作成する
zip -r layer.zip python
  1. AWS CLIを設定する
aws configure
  1. S3バケットを作成する
aws s3 mb s3://psycopg2-binary-3-12 --region ap-northeast-1
  1. zipファイルをS3にアップロードする
aws s3 cp layer.zip s3://psycopg2-binary-3-12/layer.zip
  1. 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