これまでぼくは、Lambda関数でPostgreSQLを扱うためのpsycopg2レイヤーの作成に苦戦していました。
ネットで見つけたPython 3.8用のレイヤーを流用する形で何とか動かしていたものの、今回LambdaでPython3.8がランタイムで選べなくなったので、がんばってPython3.12に対応したものを作成しようとおもい、挑戦しました。
今回、M2チップのMacBook Air環境でPython 3.12に対応したpsycopg2レイヤーを自作することに成功したので、同じ課題に直面している方のために手順をメモとして残します。
背景 – なぜ苦労していたのか
psycopg2はC言語拡張を含むライブラリのため、Lambda環境(Amazon Linux)とローカル環境(macOS)の違いからくる互換性の問題があります。
特にM2チップのようなARM64アーキテクチャのMacでは、Lambda実行環境(x86_64アーキテクチャ)との違いが大きく、単純なビルド方法では動作しません。
成功した方法
1. 作業ディレクトリの準備
デスクトップに専用フォルダを作成します。
mkdir ~/Desktop/lambda-psycopg2-layer
cd ~/Desktop/lambda-psycopg2-layer
2. Dockerfileの作成
以下の内容でDockerfileを作成します。
FROM public.ecr.aws/lambda/python:3.12
WORKDIR /work
RUN dnf update -y && \
dnf install -y postgresql-libs python3.12-devel gcc zip && \
dnf clean all
RUN pip install --upgrade pip && \
pip install psycopg2-binary -t /python/lib/python3.12/site-packages/
ENTRYPOINT []
CMD ["/bin/bash", "-c", "zip -r /work/psycopg2-layer.zip /python"]
3. Dockerイメージのビルド
docker build -t psycopg2-layer .
4. レイヤー用ZIPファイルの作成
ここが重要です。M2 Macでは–platform linux/amd64オプションを指定して、x86_64アーキテクチャ用のバイナリを作成します。
docker run --platform linux/amd64 --entrypoint /bin/bash -v "$PWD":/work psycopg2-layer -c "zip -r /work/psycopg2-layer.zip /python"
実行後、フォルダ内にpsycopg2-layer.zipが生成されます。
5. AWSコンソールでレイヤーを作成
- AWSコンソールのLambda管理画面で「レイヤー」→「レイヤーの作成」を選択
- レイヤー名: psycopg2
- 説明: Python 3.12 compatible psycopg2 layer for Lambda
- 先ほど作成したpsycopg2-layer.zipをアップロード
- 互換ランタイム:
Python 3.12
を選択 - 「作成」をクリック
6. Lambda関数での使用
作成したレイヤーをLambda関数に追加するだけで、import psycopg2が使えるようになります。
苦労ポイントと解決策
M2 Mac固有の問題
M2 MacのARM64アーキテクチャでは、Lambda実行環境(x86_64)と異なるバイナリが生成されるため、–platform linux/amd64オプションでアーキテクチャを明示的に指定する必要がありました。
依存関係の管理
Python 3.8用のレイヤーをそのまま使うとランタイムの違いから予期せぬエラーが発生する可能性があります。必ず対象のPythonバージョンに合わせたレイヤーを作成しましょう。
コマンド実行時のエラー対処
もしdocker run
コマンド実行時にエラーが発生する場合は、Docker Desktopの設定で「Use Rosetta for x86/amd64 emulation on Apple Silicon」オプションが有効になっていることを確認してください。
まとめ
これまでネットで見つけたPython 3.8用のレイヤーで代用していましたが、今回Python 3.12専用のレイヤーを自作することで、より安定した環境を構築することができました。
M2 Macユーザーでも、適切なDocker設定を行えば問題なくLambda用のレイヤーが作成できることが分かり、大きな収穫でした。
この手順が同じ課題に直面している方の助けになれば幸いです。