概要
lambdaでpythonを使ってRDSにアクセス時にlibpq.so.5: cannot open shared object file: No such file or directoryとエラーが出てしまったのでその問題の解消法を備忘録としてまとめました。
今回はpoetryを使っていましたが普通にrequirements.txtでやっていても同じことだと思います。
環境
- AWS lambda
- AWS RDS (postgresql)
- Python3.11
- poetry
ライブラリ
poetryで使っていたライブラリの一部
[tool.poetry.dependencies]
python = "^3.11"
psycopg2 = "^2.9.9"
psycopg2-binary = "^2.9.9"
sqlalchemy = "^2.0.22"
状況
lambdaからRDS(postgres)にアクセスしようとして次のようなエラー(ログ)がCloudWatchで確認できた。
libpq.so.5: cannot open shared object file: No such file or directory
本質的な問題
この状況を打破するためにはpsycopg2とpsycopg2-binaryの違いを理解する必要があります。
簡単に説明すると、psycopg2-binary は実行する際に外部ライブラリやコンパイラが必要なくスタンドアローンなパッケージとして作成されているものです。 psycopg2 自体はC言語のラッパーであるためCコンパイラが必要になります。
ということで、単にlambdaからRDSにアクセスするためにはpsycopg2-binaryがあれば必要十分ということになります。
lambdaからRDSにアクセスするためにはpsycopg2-binaryがあれば必要十分
解決策
ということでpsycopg2はこの場合必要ないので一旦両方をuninstallして再度psycopg2-binaryをinstallします。
pip uninstall psycopg2 psycopg2-binary
pip install psycopg2-binary
# or
poetry remove psycopg2 psycopg2-binary
poetry add psycopg2-binary
として再度レイヤーやzip化してデプロイすれば解決します。
よって、pyproject.tomlのライブラリはpsycopg2が消えて次のようになっていればよいです。
[tool.poetry.dependencies]
python = "^3.11"
psycopg2-binary = "^2.9.9"
sqlalchemy = "^2.0.22"
参考