我试图将psycopg2的包添加到我的python lambda函数的压缩文件夹中。我正在使用Python版本3.8。这是psycopg2的文档psycopg2.
从这些文档中,我似乎必须将psycopg2-3.8的文件夹拉到lambda函数的压缩文件中。但是,我似乎不能让它成功运行。
我正在使用虚拟环境,并根据虚拟环境的这些AWS文档创建zip文件
要压缩psycopg文件夹,我运行zip -g my-deployment-package.zip psycopg2
我收到的错误是
{
"errorMessage": "Unable to import module 'test': No module named 'psycopg2._psycopg'",
"errorType": "Runtime.ImportModuleError"
}
如果能帮我解决这个问题就太好了。
psycopg2-binary是psycopg2
的二进制pip包,包含所有依赖项,不需要编译。要在lambda函数中使用它,可以使用docker创建一个lambda层如AWS博客所述。
因此你可以添加psycopg2-binary
到你的函数如下:
-
创建空文件夹,如
mylayer
. -
进入文件夹,创建
requirements.txt
文件,内容为
psycopg2-binary
- 运行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"
- 将图层存档为zip:
zip -9 -r mylayer.zip python
在AWS控制台上基于
mylayer.zip
创建lambda层。别忘了指定Compatible runtime
到python3.8
。将第5步创建的图层添加到函数中
我使用你的代码测试图层:
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']
注。
步骤在linux上执行。如果你没有,你可以创建一个linux ec2实例,如果你不确定如何修改Windows或Mac的命令,可以在那里安装docker。