pythonファイルと、sqlalchemyおよびpsycopg2を含む依存関係を含む)を使用してAWS Lambdaのデプロイパッケージを作成しました。このコードは、ローカルでDBにアクセスする際に完全に機能します。ただし、このZipファイルをインポートすると、次のエラーが発生しました。
No module named 'psycopg2._psycopg': ModuleNotFoundError
エラーのスタックトレースは、
{
"errorMessage": "No module named 'psycopg2._psycopg'",
"errorType": "ModuleNotFoundError",
"stackTrace": [
[
"/var/task/DBAccessLamdaHandler.py",
50,
"lambda_handler",
"engine = create_engine(rds_Host)"
],
[
"/var/task/sqlalchemy/engine/__init__.py",
387,
"create_engine",
"return strategy.create(*args, **kwargs)"
],
[
"/var/task/sqlalchemy/engine/strategies.py",
80,
"create",
"dbapi = dialect_cls.dbapi(**dbapi_args)"
],
[
"/var/task/sqlalchemy/dialects/postgresql/psycopg2.py",
554,
"dbapi",
"import psycopg2"
],
[
"/var/task/psycopg2/__init__.py",
50,
"<module>",
"from psycopg2._psycopg import ( # noqa"
]
]
}
どんな助けも感謝です
AWS Lambdaランタイム環境にはPostgreSQLライブラリが含まれていないため、AWS Lambdaアップロード内にそれらを含める必要があります。
これを行う1つの方法は、GitHubの jkehler/awslambda-psycopg2 repoから取得することです。リポジトリにはビルド済みのパッケージが psycopg2フォルダー に含まれているため、このプロジェクトをゼロからビルドする必要はありません。これは、Lambdaアップロードに簡単に含めることができます。
jkehler/awslambda-psycopg2 のpsycopg2ビルドライブラリはpython 3.6用にビルドされており、コードをAWS lambdaにアップロードする際にPythonランタイム環境は3.6で、動作するはずですが、丸一日頭をぶつけて、3.6に変更すると、インポートエラーが消えました。
自分でビルドしようとする場合は、 マシン上でビルドするか、VM AWSのターゲットと同じアーキテクチャー を使用する必要があることに注意してください。
2020年3月26日現在
量産コードをサードパーティのライブラリに依存することに懐疑的でした。以下の研究について、
この問題は、パッケージがMAC OSからビルドされた場合にのみ発生します。
Centos 7からパッケージをビルドすると、問題が修正されたことを本日確認できます
以下は私のアプローチです
required.txt
psycopg2-binary==2.8.4
ビルドプロセス
pip install -r requirements.txt --target .
ラムダコードはルートディレクトリにあります
+-- lambda_function.py
+-- psycopg2
+-- psycopg2 files
ディレクトリを圧縮し、コードをラムダでテストします。
追加のステップは、MAC OSではなくLinux envでパッケージをビルドすることだけです。