在 Python 中从 AWS Lambda 访问 Oracle

Accessing Oracle from AWS Lambda in Python

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

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

写完上面的内容后,我深入研究了 boto3 API 参考并提出:

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

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

所以我还是迷路了

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

显然,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

现在 运行 这个(根据您计算机上的设置,您可以在索引和需求文件的 directory/folder 中使用 pip 而不是 pip3) :

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

接下来,上传此 zip 并将您的处理程序 'entry point' 更改为 index.my_handler。代码现在应该 运行 没有错误。

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

千辛万苦想出一个成功的办法。

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 即时客户端基础包和 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

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

已下载和使用的文件

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