web-dev-qa-db-ja.com

「psycopg2._psycopg」という名前のモジュールはありません:AWS LambdaのModuleNotFoundError

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アップロードに簡単に含めることができます。

10
jarmod

jkehler/awslambda-psycopg2 のpsycopg2ビルドライブラリはpython 3.6用にビルドされており、コードをAWS lambdaにアップロードする際にPythonランタイム環境は3.6で、動作するはずですが、丸一日頭をぶつけて、3.6に変更すると、インポートエラーが消えました。

自分でビルドしようとする場合は、 マシン上でビルドするか、VM AWSのターゲットと同じアーキテクチャー を使用する必要があることに注意してください。

6

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でパッケージをビルドすることだけです。

0
viru