【问题标题】:Accessing Oracle from AWS Lambda in Python在 Python 中从 AWS Lambda 访问 Oracle
【发布时间】:2019-07-29 21:51:55
【问题描述】:

我正在编写(希望如此)一个简单的 AWS Lambda,它将执行 RDS Oracle SQL SELECT 并通过电子邮件发送结果。到目前为止,我一直在使用 Lambda 管理控制台,但我遇到的所有示例都在谈论制作 Lambda 部署包。所以我的第一个问题是我可以从 Lambda 管理控制台执行此操作吗?

我的下一个问题是要为 Oracle DB API 导入什么?在我看到的所有示例中,他们使用 pip 下载并构建了一个包,但这似乎意味着使用部署包(见上文)。尝试导入示例中列出的任何这些模块只需给出“No module named”...

写完上面的内容后,我挖掘了boto3 API参考并想出了:

import boto3
client = boto3.client('rds-data')

但它给出了错误:未知服务:'rds-data'。

所以我还是迷路了。

如您所知,我是 Lambda 环境的新手。任何建议或示例将不胜感激。谢谢。

【问题讨论】:

    标签: aws-lambda aws-sdk amazon-rds boto3


    【解决方案1】:

    这是使用 18c Oracle 客户端库的解决方案的更新。如果不是主要解决方案,我需要更长的时间才能让我的代码正常工作。这将有望帮助任何后续。 (顺便说一句 - 我尝试让它与 Instantclient_19_3 一起工作,但转了一天,然后尝试与 Instantclient_18_5 一起工作,它工作)

    下载和使用的文件

    然后将这些文件放在 zip 中(lambda_function.py 是我的 python 源代码) zip contents

    【讨论】:

    • 19.3 和 18.5 ZIP 包几乎相同;出了什么问题
    • 现在想想这个问题可能是由于原来的解决方案说你不需要所有的Oracle即时客户端文件,所以我删除或重命名了一些文件;当然在我的 19.3 尝试中。在一些修补之后尝试 18.5,我最终没有删除或重命名任何 Oracle 即时客户端文件。当我有机会时,我会用干净的未篡改的 19.3 zip 再试一次
    【解决方案2】:

    显然,AWS Lambda 使用的是较旧版本的 boto3,它还没有 rds-data

    所以恐怕您将不得不创建一个包含更新版本的 boto3 的部署包。

    一种方法是:

    创建您的 lambda 处理程序文件(在本例中名为 index.py)。

    def my_handler(event, context):
        client = boto3.client('rds-data')
        print(client)
        # do stuff
    
        return "hello world"
    

    在同一文件夹中添加一个requirements.txt 文件,其中包含以下内容:

    awscli >= 1.16.118
    boto3 >= 1.9.108
    

    现在在您的索引和需求文件的目录/文件夹中运行这个(取决于您计算机上的设置,您可以使用pip 而不是pip3):

    pip3 install -r requirements.txt -t . 
    zip -r somezipname .
    

    接下来,上传此 zip 并将您的处理程序“入口点”更改为 index.my_handler。代码现在应该可以正常运行了。

    【讨论】:

    • 得到这个工作,我们可以连接到数据库。那时我收到错误 ERROR: invalid cluster id。在与 Amazon 支持人员讨论后,我得到的印象是 rds_data 仅支持 Aurora。接下来尝试 cx_Oracle。还是谢谢。
    【解决方案3】:

    boto3 的旧版本不支持 rds-data。 但您可以使用 zip 文件夹部署包。 我建议你使用 import cx-oracle 为此使用 pip 安装 cx-oracle 并上传 zip 包。检查这个 [How can I access Oracle from Python?

    【讨论】:

    • 尝试这个(使用 Hieron 建议的过程)和您的参考。当我在本地运行它时它工作正常,但是当我尝试将它作为 Lambda 运行时,我得到“无法导入模块 'index':没有名为 'cx_Oracle' 的模块”
    【解决方案4】:

    经过多次呻吟和咬牙切齿,我想出了一个成功的解决方案。

    rds_data(经 AWS Support 确认)仅支持 Aurora 数据库。希望 AWS 文件中提到了这一点。 8{(>

    感谢上面的答案以及Jason Landrey 提供有关解决方案的提示。

    为了访问 RDS/Oracle,您需要使用 cx_Oracle。但是等等,还有更多。

    cx_Oracle 不在标准的 Lambda 环境中,所以你需要自备。我的开发环境是 Windows,但 Lambda 环境是 Linux。因此,您需要下载并安装在我从https://pypi.org/project/cx-Oracle/#files 获得的打包目录中。本地安装:

    pip install cx_Oracle-7.1.2-cp37-cp37m-manylinux1_x86_64.whl -t .
    

    你会看到几个文件出现在 .然后你需要找到一个Linux系统,下载/lib64/libaio.so.1.0.1,在你的打包目录下命名为libaio.so.1。
    然后你需要从http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html下载Oracle Instant Client Basic 和 SDK 包。

    创建一个包含所有这些项目的 zip 文件(包括您自己的 Python 源代码)。为此,将 Oracle 即时客户端文件 libclntsh.so.11.1 重命名为 libclntsh.so,将 libocci.so.11.1 重命名为 libocci.so。

    将 zip 上传到 S3 存储桶,因为直接部署限制为 66mb,而且这个 zip 有点大。

    创建一个具有适当 IAM 权限和 VPC 访问权限的 Lambda,安装包,应该可以开始了。

    我发现,如果您不包含所有即时客户端文件,则会开始收到有关缺少时区和 NLS 信息的 Oracle 错误。

    zip 内容列表(对我来说,YMMV):

        7996693  08/24/2013 12:30   libnnz11.so
              0  03/11/2019 16:10   cx_Oracle-7.1.1.data/
              0  03/11/2019 16:10   cx_Oracle-7.1.1.data/data/
              0  03/11/2019 16:10   cx_Oracle-7.1.1.data/data/cx_Oracle-doc/
              0  03/11/2019 16:10   cx_Oracle-7.1.1.dist-info/
           1325  03/13/2019 12:35   Email.py
           1805  02/19/2019 21:11   cx_Oracle-7.1.1.data/data/cx_Oracle-doc/LICENSE.txt
            163  02/19/2019 21:11   cx_Oracle-7.1.1.data/data/cx_Oracle-doc/README.txt
            851  02/19/2019 21:11   cx_Oracle-7.1.1.dist-info/METADATA
            628  02/19/2019 21:12   cx_Oracle-7.1.1.dist-info/RECORD
            109  02/19/2019 21:12   cx_Oracle-7.1.1.dist-info/WHEEL
             10  02/19/2019 21:11   cx_Oracle-7.1.1.dist-info/top_level.txt
        2270301  02/19/2019 21:11   cx_Oracle.cpython-37m-x86_64-linux-gnu.so
           2140  03/13/2019 14:21   getSecrets.py
           5560  03/12/2019 08:48   libaio.so.1
       53865194  08/24/2013 12:30   libclntsh.so
      118738042  08/24/2013 12:30   libociei.so
           7633  03/13/2019 16:39   scheduleReports.py
    

    【讨论】:

    • 如果您使用的是 Wheel,那么您不需要 Oracle SDK 头文件,因为您没有构建任何代码。您还可以删除 JDBC 库、Java jar 和 libocci。某处的 Oracle 文档包含 C 应用程序(如 cx_Oracle)所需的 Instant Client 文件列表。你真的需要使用这么旧版本的 Instant Client 吗?
    • 我已尝试删除 libocci,但收到有关未找到 TZ 和 NLS 文件的错误。
    • 听起来你删除了需要的 libociei.so。 documentation 中的表 2-1 列出了 OCI 应用程序所需的库,例如cx_Oracle 或 node-oracledb。如果空间是个问题,请考虑使用 Basic Light 包(见表 2.3)
    • 啊,谢谢你的提示。我猜我没有看到那个列表,因为我们还在 11g 上。我会更新我的解决方案。
    • Oracle 客户端库 12.2 和 18c 将连接到 11.2 DB。新库确实有有用的改进。
    猜你喜欢
    • 2016-10-10
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    • 2016-02-14
    • 2017-02-08
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多