web-dev-qa-db-fra.com

Aucun module nommé 'psycopg2._psycopg': ModuleNotFoundError dans AWS Lambda

J'ai créé un package de déploiement pour AWS Lambda avec mon fichier python et les dépendances, y compris sqlalchemy et psycopg2. Le code fonctionne parfaitement pour accéder à la base de données localement. Mais lorsque j'ai importé ce fichier Zip, je suis obtenir l'erreur suivante.

No module named 'psycopg2._psycopg': ModuleNotFoundError

La trace de la pile de l'erreur est,

{
  "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"
    ]
  ]
}

Toute aide est appréciable

8

L'environnement d'exécution AWS Lambda n'inclut pas les bibliothèques PostgreSQL, vous devez donc les inclure dans votre téléchargement AWS Lambda.

Une façon de le faire est de les obtenir depuis le repo jkehler/awslambda-psycopg2 sur GitHub. Notez que vous n'avez pas besoin de créer ce projet à partir de zéro car le dépôt inclut un package pré-construit dans le dossier psycopg2 que vous pouvez simplement inclure dans votre téléchargement Lambda.

10
jarmod

La bibliothèque de construction psycopg2 de jkehler/awslambda-psycopg2 a été conçue pour python 3.6 et assurez-vous que lors du téléchargement de votre code sur AWS lambda, sélectionnez Python Environnement d'exécution en tant que 3.6, et cela devrait fonctionner. Je me suis cogné la tête pendant une journée complète, puis quand j'ai changé en 3.6, l'erreur d'importation vient de disparaître.

Si vous voulez essayer de le construire vous-même, n'oubliez pas que vous devez construire sur une machine ou VM avec la même architecture que votre cible chez AWS .

6

Au plus tard le 26/MAR/2020

J'étais sceptique de dépendre d'une bibliothèque tierce pour mon code de production. Sur la recherche des travaux suivants,

Le problème se produit uniquement lorsque les packages sont créés à partir de MAC OS.

Je peux confirmer aujourd'hui que le problème est résolu lorsque je crée le package à partir de Centos 7

Ce qui suit est mon approche

requirements.txt

psycopg2-binary==2.8.4

Processus de construction

pip install -r requirements.txt --target .

Le code Lambda est dans le répertoire racine

+-- lambda_function.py
+-- psycopg2
    +-- psycopg2 files

Compressez le répertoire et testez le code dans les travaux lambda.

La seule étape supplémentaire consiste à construire le package dans Linux env au lieu de MAC OS

0
viru