AWS Chalice + CodePipeline 利用環境で psycopg2 パッケージを導入する

概要

Python から PostgreSQL を扱う場合、よく psycopg2 というパッケージが紹介されています。

このパッケージをそのまま AWS Lambda で利用しようとすると動作しない、という点も多くの技術ブログ等で紹介されているのですが、
ローカルでデプロイ用パッケージを作成する解決法が提示されている場合が多く、
CodeBuild・CodePipeline でビルド・デプロイを行っている環境についてはあまり触れられていない気がしました。

更に、このパッケージを導入しようとした環境が AWS Chalice でビルドされていることもあり、
Chalice も使い初めだった私はそれなりに苦労した覚えがあります。

そこで今回は AWS Chalice + CodeBuild + CodePipeline でビルド・デプロイを行っている環境向けに
psycopg2 を導入した方法を紹介します。

実装方法

ビルド・デプロイに以下のような Pipeline を使っていました。
Build ステージで chalice package を実行しCloudFormation テンプレートを作成しています。

psycopg2 を導入するため、以下のような buildspec を書きました。

version: 0.2
artifacts:
  discard-paths: no
  files:
    - '**/*'
phases:
  install:
    runtime-versions:
      python: 3.9
    commands:
      - pip install --upgrade chalice
  build:
    commands:
      - git clone https://github.com/jkehler/awslambda-psycopg2.git
      - mv -v awslambda-psycopg2/psycopg2-3.9 vendor/psycopg2
      - pip install -r requirements.txt -t vendor/
      - chalice --debug package . --template-format yaml

GitHub の awslambda-psycopg2 プロジェクトを clone して、
プロジェクト内の psycopg2-3.9 (python3.9 用の psycopg2 が格納されたディレクトリ) を vendor/ 以下に配置します。

Chalice の機能で、vendor/ 配下のファイルも Lambda のソースコードに含まれるようになっています。

App Packaging – 3rd Party Packages

こちらの設定でビルドすると、Lambda から psycopg2 が利用できるようになりました!

うまくいかなかった方法

上記方法にたどり着くまでにトライした内容です。
過去のログが残っておらずどううまくいかなかったかは定かでないのですが、
おそらく、ビルド(パッケージインストール)までは完了するが実際に Lambda を Invoke した際に以下エラーが発生していたと思います。

ImportError: No module named ‘psycopg2._psycopg’

(1) pip で psycopg2 を追加

requirements.txt に以下のような行を追加し、pip install で psycopg2 がインストールされるようにしてみました。

psycopg2 == 2.9.5

こちらの方法は多くの技術ブログ等で紹介されているように機能しませんでした。

psycopg2

(2) pip で psycopg2 を追加

requirements.txt に以下のような行を追加し、pip install で awslambda-psycopg2 がインストールされるようにしてみました。

awslambda-psycopg2 == 1.0.2

AWS Lambda 用の psycopg2 なので正常に動作するかと思ったのですが、そうはなりませんでした。

awslambda-psycopg2