背景
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