サイトアイコン 協栄情報ブログ

Lambda psycopg2インポートでNo module named ‘psycopg2._psycopg’エラー解決 ( Amazon Linux 2でPython 3.12のライブラリ作成)

背景

AWS Lambda(Python)からRDS(PostgreSQL)に接続したい時、外部ライブラリのpsycopg2をインポートする必要がある。Lambdaでの外部ライブラリはかつてはzipに固めてアップロードという方式だったが、今ではレイヤーという機能があり、アカウント内で共通化が可能となった。それはいいのだが、psycopg2のレイヤー追加〜インポートでハマったのでメモを残したいと思います。

前提条件

・検証用EC2(AMI名:amzn2-ami-kernel-5.10-hvm-2.0.20240109.0-x86_64-gp2)が構築済みであること
・検証用EC2がインタネットにアクセスできること

手順

1.バージョン確認1

   ,     #_
   ~\_  ####_        Amazon Linux 2
  ~~  \_#####\
  ~~     \###|       AL2 End of Life is 2025-06-30.
  ~~       \#/ ___
   ~~       V~' '->
    ~~~         /    A newer version of Amazon Linux is available!
      ~~._.   _/
         _/ _/       Amazon Linux 2023, GA and supported until 2028-03-15.
       _/m/'           https://aws.amazon.com/linux/amazon-linux-2023/

[ec2-user@ip-10-30-101-155 ~]$ aws --version
aws-cli/1.18.147 Python/2.7.18 Linux/5.10.205-195.804.amzn2.x86_64 botocore/1.18.6
[ec2-user@ip-10-30-101-155 ~]$ python3 -V
Python 3.7.16
[ec2-user@ip-10-30-101-155 ~]$ docker-compose --version
-bash: docker-compose: command not found
[ec2-user@ip-10-30-101-155 ~]$ docker --version
-bash: docker: command not found
[ec2-user@ip-10-30-101-155 ~]$

2.EC2にDockerとDocker Composeをインストール

下記のリンクを参照に、Amazon Linux 2にDockerをインストールする。
【AWS】EC2にDockerとDocker Composeをインストール

3.バージョン確認2

[ec2-user@ip-10-30-101-155 ~]$ docker-compose --version
Docker Compose version v2.4.1
[ec2-user@ip-10-30-101-155 ~]$ docker --version
Docker version 20.10.25, build b82b9f3
[ec2-user@ip-10-30-101-155 ~]$

4.Amazon Linux 2でライブラリ作成

# 作業ディレクトリ作成〜移動
cd ~ && mkdir python-lib && cd python-lib

# install対象のライブラリを記載したrequirements.txtを作成
echo 'psycopg2-binary' > requirements.txt

# Dockerイメージを使ってpip install実行
docker run -v "$PWD":/var/task "public.ecr.aws/sam/build-python3.12" /bin/sh -c "pip install -r requirements.txt -t python/lib/python3.12/site-packages/; exit"

# psycopg2ライブラリをzipに固める
zip -r psycogpg_python3-12.zip python

5.psycopg2-binaryのzipファイルをLambdaレイヤーに登録する

[ec2-user@ip-10-30-101-155 python-lib]$ ll
total 3032
-rw-rw-r-- 1 ec2-user ec2-user 3099445 Jan 14 07:35 psycogpg_python3-12.zip
drwxr-xr-x 3 root     root          17 Jan 14 07:34 python
-rw-rw-r-- 1 ec2-user ec2-user      16 Jan 14 07:33 requirements.txt
[ec2-user@ip-10-30-101-155 python-lib]$
[ec2-user@ip-10-30-101-155 python-lib]$
[ec2-user@ip-10-30-101-155 python-lib]$ pwd
/home/ec2-user/python-lib
[ec2-user@ip-10-30-101-155 python-lib]$ ll /home/ec2-user/python-lib/psycogpg_python3-12.zip
-rw-rw-r-- 1 ec2-user ec2-user 3099445 Jan 14 07:35 /home/ec2-user/python-lib/psycogpg_python3-12.zip
[ec2-user@ip-10-30-101-155 python-lib]$

下記のコードでランタイムがPython 3.12のLambdaを作成して、動作確認します。

import psycopg2

def lambda_handler(event, context):
    print('OK')

参考

https://open-groove.net/lambda/lambda-python-psycopg2-import/

https://memoribuka-lab.com/?p=3817

https://kacfg.com/aws-ec2-docker/

https://docs.docker.jp/engine/reference/commandline/pull.html

モバイルバージョンを終了