在aws lambda上运行时,如何在python中解决cx_Oracle问题

在aws lambda上运行时,如何在python中解决cx_Oracle问题,python,amazon-web-services,aws-lambda,cx-oracle,Python,Amazon Web Services,Aws Lambda,Cx Oracle,我在aws lambda上测试时遇到以下错误消息 无法导入模块“lambda\u处理程序”:没有名为“cx\u Oracle”的模块 这个lambda由python代码组成,但在我的本地主机上尤其有效 另外,我在同一级别的lambda\u handler.py文件路径上执行了pip install cx\u Oracle-t./命令,上传的zip文件的文件路径位于该路径下方 ./lambda_handler.py ./cx_Oracle.cp36-win_amd64.pyd ./cx_Ora

我在aws lambda上测试时遇到以下错误消息

无法导入模块“lambda\u处理程序”:没有名为“cx\u Oracle”的模块

这个lambda由python代码组成,但在我的本地主机上尤其有效

另外,我在同一级别的lambda\u handler.py文件路径上执行了
pip install cx\u Oracle-t./
命令,上传的zip文件的文件路径位于该路径下方

./lambda_handler.py

./cx_Oracle.cp36-win_amd64.pyd

./cx_Oracle-6.4.1.dist-info/*

./cx_Oracle-doc/*
我不明白为什么lambda_处理程序无法在仅lambda函数中找到
cx_Oracle库

我错过了什么

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\U Oracle
不仅需要
pip安装
,还需要本机Oracle客户端,而控制盘依赖于本机Oracle客户端。Lambda函数在EC2上运行,本机库的选择有限。值得一提的是,几乎任何RDBMS都会遇到同样的问题—PostgreSQL、MySQL等

有关更多信息,请参阅本文:


请注意,它适用于基于Chalice的部署,但基本要求是相同的。

cx\u Oracle
不仅需要
pip安装
,还需要本机Oracle客户端,而控制盘依赖于本机Oracle客户端。Lambda函数在EC2上运行,本机库的选择有限。值得一提的是,几乎任何RDBMS都会遇到同样的问题—PostgreSQL、MySQL等

有关更多信息,请参阅本文:


请注意,它是用于基于Chalice的部署的,但基本要求是相同的。

我们遇到了这个问题,然后我们不得不将数据访问函数实现到AWS Lambda Java 8而不是Python 3.6中

在Java 8中,ojdbc*.jar(*-->Oracle驱动程序的版本号)可以简单地捆绑到最终的zip中,并且没有其他步骤像尝试获取Oracle客户端本机库那样


我们确实花了大量时间让AWS Lambda Python函数访问Oracle DB,但我觉得在AWS Lambda Java 8函数中开发此类模块要简单得多。

我们遇到了这个确切的问题,然后我们不得不将数据访问函数实现到AWS Lambda Java 8而不是Python 3.6中

在Java 8中,ojdbc*.jar(*-->Oracle驱动程序的版本号)可以简单地捆绑到最终的zip中,并且没有其他步骤像尝试获取Oracle客户端本机库那样


我们确实花了大量时间让AWS Lambda Python函数访问Oracle DB,但我觉得在AWS Lambda Java 8函数中开发此类模块要简单得多。

简短回答:
您正在使用的cx\U Oracle库是用于Windows的。Aws Lambda环境是,*.pyd是用于Windows的Python库

长答案: 您必须部署linux版本 第一件出错的事情是在代码中提供给AWS Lambda的python库。我猜您是在Windows计算机上本地开发的,因此当您这样做时:

pip install cx_Oracle -t ./
您将获得一个用于Windows的python预编译库,它是cx_Oracle.cp36-win_amd64.pyd
文件。 AWS lambda在Linux容器中运行。你可以找到一些关于环境的信息。 Linux的预编译库是cx\u Oracle.cpython-36m-x86\u 64-Linux-gnu.so。您可以从中手动下载

因此,当您在Linux环境中执行python脚本时,它将尝试在当前路径中查找库的Linux预编译版本,cx\u Oracle.cpython-36m-x86\u 64-Linux-gnu.So文件。这就是您收到错误消息的原因:

Unable to import module 'lambda_handler': No module named 'cx_Oracle'
这里第二件重要的事情是,cx_Oracle python库调用本机库。如果您的windows计算机上有工作示例,则必须安装此示例。对于windows,此库的格式为.dll文件。对于linux,本机库的格式为.so文件。 您需要在部署包中提供Oracle client for Linux以及代码,因为在Amazon Linux环境中尚未提供

最后一件事是告诉Python如何找到这个动态库。在Linux系统中,在该环境变量LD\u LIBRARY\u 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
。因此,如果您将Oracle instant client for Linux添加到开发目录中的
/var/task/lib
下,即
/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
├── 解放党

│ ├── libclntsh.so简短回答
您正在使用的cx\U Oracle库是用于Windows的。Aws Lambda环境是,*.pyd是用于Windows的Python库

长答案: 您必须部署linux版本 第一件出错的事情是在代码中提供给AWS Lambda的python库。我猜您是在Windows计算机上本地开发的,因此当您这样做时:

pip install cx_Oracle -t ./
您将获得一个用于Windows的python预编译库,它是cx_Oracle.cp36-win_amd64.pyd文件。 AWS lambda在Linux容器中运行。你可以找到一些关于环境的信息。 Linux的预编译库是cx\u Oracle.cpython-36m-x86\u 64-Linux-gnu.so。您可以从中手动下载

因此,当您在Linux环境中执行python脚本时,它将尝试在当前路径中查找库的Linux预编译版本,cx\u Oracle.cpython-36m-x86\u 64-Linux-gnu.So文件。这就是您收到错误消息的原因:

Unable to import module 'lambda_handler': No module named 'cx_Oracle'
这里第二件重要的事情是,cx_Oracle python库调用本机库。如果您的windows计算机上有工作示例,则必须安装此示例。对于windows,此库位于