AWS

【Python 3.12対応】Lambda用psycopg2レイヤーの作成方法(M2 Mac対応)

記事内に商品プロモーションを含む場合があります

これまでぼくは、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コンソールでレイヤーを作成

  1. AWSコンソールのLambda管理画面で「レイヤー」→「レイヤーの作成」を選択
  2. レイヤー名: psycopg2
  3. 説明: Python 3.12 compatible psycopg2 layer for Lambda
  4. 先ほど作成したpsycopg2-layer.zipをアップロード
  5. 互換ランタイム: Python 3.12を選択
  6. 「作成」をクリック

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用のレイヤーが作成できることが分かり、大きな収穫でした。

この手順が同じ課題に直面している方の助けになれば幸いです。