概要
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"
参考