コンテナイメージ形式の AWS Lambda 関数で PostgreSQL に接続する際のハマりどころと解決策
はじめに
AWS Lambda から Aurora PostgreSQL などの PostgreSQL データベースに接続する際、psycopg2 ライブラリを使うのが一般的です。しかし、コンテナイメージ形式を使った Lambda 関数のデプロイでは、いくつかの落とし穴があります。この記事では、その問題点と解決策を解説します。
問題の概要
Lambda 関数用の Docker イメージをビルドする際、psycopg2 や psycopg2-binary のインストールで以下のようなエラーが発生することがあります
Error: pg_config executable not found.
pg_config is required to build psycopg2 from source.
これは、Docker ビルド中に Python パッケージのインストールが失敗し、結果的にイメージのビルド全体が失敗している状態です。
なぜ問題が発生するのか
AWS Lambda の Python イメージは最小限の構成になっており、C 拡張モジュールをビルドするために必要なコンパイラやヘッダーファイルが含まれていません。そのため、以下の要素が不足しています。
- PostgreSQL の開発ファイル (pg_config など)
- C コンパイラ (gcc)
- Python の開発ヘッダーファイル
特に psycopg2 は PostgreSQL のネイティブライブラリにリンクする C 拡張モジュールであるため、これらの開発ツールが必要になります。
解決策
AWS Lambda の Python 3.12 イメージは Amazon Linux 2023 ベースになっており、パッケージマネージャーとして dnf
を使用します。以下のように Dockerfile を記述することで問題を解決できます。
FROM public.ecr.aws/lambda/python:3.12
WORKDIR ${LAMBDA_TASK_ROOT}
COPY requirements.txt .
# PostgreSQLの開発パッケージをインストール
RUN dnf update -y && dnf install -y \
postgresql-devel \
gcc \
python3-devel \
&& dnf clean all
# 依存関係をインストール
RUN pip install -r requirements.txt
# Lambda 関数コードをコピー
COPY *.py .
CMD ["app.lambda_handler"]
注意点と学び
AWS Lambda イメージは定期的に更新され、基盤となる OS やパッケージマネージャーが変更される場合があります。古いドキュメントでは yum
を使用する例が多いですが、最新のイメージでは dnf
を使用する必要があります。