AWS Lambda 中没有名为 'psycopg2._psycopg' 的模块:ModuleNotFoundError

No module named 'psycopg2._psycopg': ModuleNotFoundError in AWS Lambda

我已经使用我的 python 文件和依赖项(包括 sqlalchemy 和 psycopg2)为 AWS Lambda 创建了一个部署包。该代码可以完美地在本地访问数据库。但是当我导入这个 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 上传中。

执行此操作的一种方法是从 jkehler/awslambda-psycopg2 repo at GitHub. Note that you don't need to build this project from scratch as the repo includes a pre-built package in the psycopg2 folder 中获取它们,您可以简单地将其包含在您的 Lambda 上传中。

来自 jkehler/awslambda-psycopg2 的 psycopg2 构建库是为 python 3.6 构建的,并确保在将代码上传到 AWS lambda 时,select Python 运行时环境为 3.6 ,它应该可以工作。我为此苦苦思索了一整天,然后当我更改为 3.6 时,导入错误就消失了。

如果您打算自己构建它,remember that you must build on a machine or VM with the same architecture as your target at AWS

psycopg 的最新更新(当我回答这个问题时)修复了这个问题。您需要将 psycopg2-binary 的版本更新到 2.8.4。这对我有用。

psycopg2-binary==2.8.4

26 日最新/MAR/2020

我对依赖第三方库作为我的生产代码持怀疑态度。研究以下作品,

仅当包是从 MAC OS.

构建时才会出现此问题

我今天可以确认,当我从 Centos 7 (AWS AMI) 构建包时,问题已得到解决

以下是我的做法

requirement.txt

psycopg2-binary==2.8.4

构建过程

pip install -r requirements.txt --target .

Lambda代码在根目录

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

压缩目录并在 lambda works 中测试代码。

唯一的额外步骤是使用 Docker 容器在 Linux env 而不是 macOS 中构建包。可以在此处找到示例:Deploy AWS Amplify Python Lambda from macOS with Docker

对于 Windows(在任何 OS 中看起来都不是在 Amazon AMI 或 Centos 上构建的),最简单的解决方法是使用

psycopg2 Python AWS Lambda 库

你可以找到https://github.com/jkehler/awslambda-psycopg2

不使用 psycopg2,尝试使用 pg8000 在命令提示符下转到您当前工作的目录(例如 F:\example) pip 安装 pg8000 -t。 (-t. 用于将 pg8000 安装在您正在工作的目录中)

// handler.py 导入 pg8000

database=''
host=''
port=''
user=''
password=''
conn = pg8000.connect(database=database, host=host, port=port, user=user, 
password=password)

def lambda_function(event, context):
   .
   .
   .

编写完代码后,将代码压缩并上传到您的 aws lambda 中。

对我有用!!!

与其他答案一样,psycopg2-binary 在 python3.9 上运行良好(看起来其他包 awslambda-psycopg2 仅适用于 python3.6)。

但是,如果您在发送到 aws lambda 之前在 MacOs 上 运行,则必须像这样为您的 pip 安装指定平台:

pip3.9 install --platform=manylinux1_x86_64 --only-binary=:all: psycopg2-binary

尽管我尝试了多个 psycopg2 版本,但我在 AWS Lambda 上让 SQLAlchemy 到 运行 时遇到了问题,但最终为我解决的是使用旧的 Python 版本.我从 Python 3.9 到 3.7,它终于可以 运行 (使用 psycopg2-binary 2.8.4,但我没有尝试其他版本或 none 二进制版本与 3.7 )

感谢AWS Lambda Layers we can include a ready compiled psycopg2 layer for our selected Python versions directly to our Lambda function. Please use the version you need from this Github repo。在 Lambda 和层创建中小心使用正确的 Python 版本和区域。