在AWS Lambda上运行时如何解决python中的cx_Oracle问题

时间:2018-09-11 03:41:12

标签: python amazon-web-services aws-lambda cx-oracle

在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/*

3 个答案:

答案 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函数中开发此类模块要简单得多。