使用Python从AWS Lambda访问Oracle

时间:2019-03-07 21:59:50

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

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

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

在编写完上面的内容后,我挖掘了boto3 API引用并提出了:

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

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

所以我仍然迷路。

您可能会说,我是Lambda环境的新手。任何建议或示例将不胜感激。谢谢。

4 个答案:

答案 0 :(得分:1)

显然,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。该代码现在应该可以正常运行了。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

这是使用18c Oracle客户端库的解决方案的更新。如果不是主要解决方案,那么我要花很多时间才能使代码正常工作。希望对以后的任何人有帮助。 (顺便说一句,我尝试使其与Instantclient_19_3一起使用,但绕了一天转了一圈,然后又尝试与InstantClient_18_5一起使用,并且有效)

下载和使用的文件

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

答案 3 :(得分:0)

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

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软件包。

使用所有这些项目(包括您自己的Python源代码)创建一个zip文件。为此,将Oracle Instant Client文件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