我在 aws lambda 上测试时遇到了以下错误消息。
无法导入模块“lambda_handler”:没有名为“cx_Oracle”的模块
此 lambda 由 python 代码组成,但在我的本地主机上尤其有效。
此外,我在lambda_handler.py 文件路径的同一级别执行了pip install cx_Oracle -t ./ 命令,上传的zip 文件的文件路径在其下方。
./lambda_handler.py
./cx_Oracle.cp36-win_amd64.pyd
./cx_Oracle-6.4.1.dist-info/*
./cx_Oracle-doc/*
我无法理解为什么 lambda_handler 只能在 lambda 函数中找不到 cx_Oracle library。
我错过了什么?
import cx_Oracle
import boto3
from docutils.nodes import row
def lambda_handler(event, context):
url = 'myOracleUrl'
user = 'myOralceUserId'
pwd = 'myOraclePwd'
con = cx_Oracle.connect(user + '/' + pwd + '@' + url)
cur = con.cursor()
cur.execute("select 1 from dual")
cur.close()
con.close()
return {
"statusCode": 200,
"body": context.invoked_function_arn
}
请您参考如下方法:
简答:
您使用的 cx_Oracle 库适用于 Windows。 Aws Lambda 环境是 Amazon Linux , *.pyd 是适用于 Windows 的 Python 库。
长答案: 你必须部署linux版本 您出错的第一件事是您随代码提供给 AWS Lambda 的 python 库。我猜你是在 Windows 机器上进行本地开发,所以当你这样做时:
pip install cx_Oracle -t ./
您将获得一个适用于 Windows 的 python 预编译库,即 cx_Oracle.cp36-win_amd64.pyd 文件。 AWS Lambdas 在 Linux 容器中运行。您可以找到有关环境的一些信息 here . Linux 的预编译库是 cx_Oracle.cpython-36m-x86_64-linux-gnu.so。您可以从 Pypi repository 手动下载它.
因此,当您在 Linux 环境中执行 python 脚本时,它会尝试在当前路径中查找库的 linux 预编译版本,即 cx_Oracle.cpython-36m-x86_64-linux-gnu.so文件。这就是您收到错误消息的原因:
Unable to import module 'lambda_handler': No module named 'cx_Oracle'
这里第二件重要的事情是 cx_Oracle python 库调用 Oracle Instant Client这是一个本地库。如果你的 Windows 机器上有一个工作示例,你必须安装它。对于 Windows,此库采用 .dll 文件的形式。对于 linux,此 native 库采用 .so 文件的形式。 您将需要提供 适用于 Linux 的 Oracle 客户端 以及部署包中的代码,因为它们在 Amazon Linux 环境中尚不可用。
最后就是告诉Python如何找到这个动态库。在此环境变量 LD_LIBRARY_PATH 中存在的目录中查找 Linux 系统中的共享库。在 Amazon Linux 中,此变量包含:
LD_LIBRARY_PATH:/var/lang/lib:/lib64:/usr/lib64:/var/runtime:/var/runtime/lib:/var/task:/var/task/lib:/opt/lib
/var/task目录是您的部署所在的位置。因此,如果您在 /var/task/lib 下添加适用于 Linux 的 Oracle 即时客户端这是 ./lib在你的开发目录中你就完成了。
您的部署包应该与此类似:
├── lib
│ ├── libclntsh.so <-- Oracle instant client linux files
│ .
│ .
│ .
├── python_handler.py <-- Lambda function code
└── cx_Oracle.cpython-36m-x86_64-linux-gnu.so <-- cx_Oracle library
