在AWS Lambda上进行测试时,遇到以下错误消息。
C
此lambda由python代码组成,但在我的本地主机上尤其有效。
此外,我在相同级别的lambda_handler.py文件路径上执行了A
命令,并且上传的zip文件的文件路径在该路径之下。
Unable to import module 'lambda_handler': No module named 'cx_Oracle'
我不明白为什么lambda_handler只能在lambda函数中找不到pip install cx_Oracle -t ./
。
我想念什么?
./lambda_handler.py
./cx_Oracle.cp36-win_amd64.pyd
./cx_Oracle-6.4.1.dist-info/*
./cx_Oracle-doc/*
答案 0 :(得分:4)
简短回答:
您使用的 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,本机库采用.so文件的形式。 您将需要提供 Linux的Oracle客户端以及部署包中的代码,因为在Amazon Linux环境中尚不可用。
最后一件事是告诉Python如何找到此动态库。在Linux系统中,在此环境变量 LD_LIBRARY_PATH 中存在的目录中查找共享库。在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
下的./lib
下添加Linux的Oracle Instant Client,就完成了。
您的部署软件包应与此类似:
├── 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
答案 1 :(得分:0)
cx_Oracle
不仅需要pip install
,还需要轮子依赖的本机Oracle客户端。 Lambda函数可在EC2上运行,并且只能选择有限的本地库。就其价值而言,几乎所有RDBMS(PostgreSQL,MySQL等)都会遇到相同的问题。
有关更多信息,请参见本文:http://kb.sites.apiit.edu.my/knowledge-base/articles/aws/aws-chalice-deployment-with-oracle-vendor/
请注意,它用于基于Chalice的部署,但是基本要求是相同的。
答案 2 :(得分:0)
我们遇到了这个确切的问题,然后我们不得不在AWS Lambda Java 8中实现数据访问功能,而不是在Python 3.6中实现
在Java 8中,可以将ojdbc * .jar(*-> Oracle驱动程序的版本号)简单地捆绑到最终的zip文件中,并且没有其他尝试获取Oracle Client Native Libraries的步骤。
我们确实花了很多时间来使AWS Lambda Python Function访问Oracle DB,但是我觉得在AWS Lambda Java 8函数中开发此类模块要简单得多。