psycopg2 文件夹压缩到 python venv lambda 函数

psycopg2 folder zipped into python venv lambda function

我正在尝试将 psycopg2 的包添加到我的 python lambda 函数的压缩文件夹中。我正在使用 Python 版本 3.8。这是 psycopg2 文档 psycopg2.

从这些文档看来,我必须将 psycopg2-3.8 的文件夹拉入我的 lambda 函数的压缩文件中。但是,我似乎无法成功 运行.

我正在使用虚拟环境并根据这些 AWS 文档创建 zip 文件for virtual environment

要压缩 psycopg 文件夹,我正在 运行ning zip -g my-deployment-package.zip psycopg2

我收到的错误是

{
  "errorMessage": "Unable to import module 'test': No module named 'psycopg2._psycopg'",
  "errorType": "Runtime.ImportModuleError"
}

任何解决此问题的帮助都会很棒。

psycopg2-binary is a binary pip package of psycopg2 which comes with all dependencies and does not require compiling. To use it in your lambda function, you can create a lambda layer using docker as described in the AWS blog.

因此您可以将 psycopg2-binary 添加到您的函数中,如下所示:

  1. 创建空文件夹,例如mylayer.

  2. 转到文件夹并创建 requirements.txt 文件,内容为

psycopg2-binary
  1. 运行 以下 docker 命令:

该命令将为 python3.8:

创建图层
docker run -v "$PWD":/var/task "lambci/lambda:build-python3.8" /bin/sh -c "pip install -r requirements.txt -t python/lib/python3.8/site-packages/; exit"
  1. 将图层存档为 zip:
zip -9 -r mylayer.zip python 
  1. 在 AWS 控制台中基于 mylayer.zip 创建 lambda 层。不要忘记将 Compatible runtime 指定为 python3.8

  2. 将第 5 步中创建的图层添加到您的函数中。

  3. 我用你的代码测试了层:

import psycopg2

def lambda_handler(event, context):
    
    print(dir(psycopg2))
    
    return "ok"

它工作 正确:

['BINARY', 'Binary', 'DATETIME', 'DataError', 'DatabaseError', 'Date', 'DateFromTicks', 'Error', 'IntegrityError', 'InterfaceError', 'InternalError', 'NUMBER', 'NotSupportedError', 'OperationalError', 'ProgrammingError', 'ROWID', 'STRING', 'Time', 'TimeFromTicks', 'Timestamp', 'TimestampFromTicks', 'Warning', '__builtins__', '__cached__', '__doc__', '__file__', '__libpq_version__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__version__', '_connect', '_ext', '_json', '_psycopg', '_range', 'apilevel', 'compat', 'connect', 'errors', 'extensions', 'paramstyle', 'threadsafety', 'tz']

p.s.

这些步骤是在 linux 上执行的。如果你没有,你可以创建一个 linux ec2 实例并在那里设置 docker 如果你不确定如何修改 Windows 或 Mac 的命令。