1
0

aws lambdaでpsycopg2を使おうとしたらlibpq.so.5: cannot open shared object file: No such file or directoryとなった話

Posted at

概要

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で使っていたライブラリの一部

pyproject.toml
[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

本質的な問題

この状況を打破するためにはpsycopg2psycopg2-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が消えて次のようになっていればよいです。

pyproject.toml
[tool.poetry.dependencies]
python = "^3.11"
psycopg2-binary = "^2.9.9"
sqlalchemy = "^2.0.22"

参考

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0