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

1 python cx-oracle amazon-web-services aws-lambda

在AWS Lambda上进行测试时,遇到了以下错误消息。

Unable to import module 'lambda_handler': No module named 'cx_Oracle'

这个lambda由python代码组成,但是在我的本地主机上特别有效。

另外,我pip install cx_Oracle -t ./在相同级别的lambda_handler.py文件路径上执行了命令,并且上传的zip文件的文件路径在该路径下。

./lambda_handler.py

./cx_Oracle.cp36-win_amd64.pyd

./cx_Oracle-6.4.1.dist-info/*

./cx_Oracle-doc/*
Run Code Online (Sandbox Code Playgroud)

我不明白为什么lambda_handler只能cx_Oracle library在lambda函数中找不到。

我想念什么?

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
    }
Run Code Online (Sandbox Code Playgroud)

alv*_*aro 6

简短答案:您正在使用
cx_Oracle库适用于Windows。Aws Lambda环境是Amazon Linux,*。pyd是Windows的Python库。

长答案:您必须部署linux版本。首先,您遇到的错误是要在代码中提供给AWS Lambda的python库。我想您是在Windows机器上本地开发的,所以当您这样做时:

pip install cx_Oracle -t ./
Run Code Online (Sandbox Code Playgroud)

您会获得Windows的python预编译库,它是cx_Oracle.cp36-win_amd64.pyd文件。AWS Lambdas在Linux容器中运行。您可以在此处找到有关环境的一些信息。Linux的预编译库是cx_Oracle.cpython-36m-x86_64-linux-gnu.so。您可以从Pypi存储库手动下载它。

因此,当您在Linux环境中执行python脚本时,它将尝试在当前路径cx_Oracle.cpython-36m-x86_64-linux-gnu.so文件中找到该库的linux预编译版本。这就是为什么您收到错误消息的原因:

Unable to import module 'lambda_handler': No module named 'cx_Oracle'
Run Code Online (Sandbox Code Playgroud)

这里的第二点重要是cx_Oracle python库调用Oracle Instant Client,它是一个本机库。如果您在Windows机器上有一个可行的示例,则必须安装此示例。对于Windows,此库采用.dll文件的形式。对于linux,本机库采用.so文件的形式。您将需要在部署包中提供LinuxOracle客户端以及代码,因为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
Run Code Online (Sandbox Code Playgroud)

/var/task目录是您的部署所在的目录。所以,如果你添加了Oracle即时客户端在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
Run Code Online (Sandbox Code Playgroud)