Py学习  »  Python

在Python中从AWS Lambda访问Oracle

wdtj • 4 年前 • 291 次点击  

我正在(希望)编写一个简单的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环境还不熟悉。任何建议或例子都将不胜感激。谢谢。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/49358
 
291 次点击  
文章 [ 4 ]  |  最新文章 4 年前
wdtj
Reply   •   1 楼
wdtj    5 年前

经过长时间的呻吟和咬牙切齿,我想出了一个成功的解决办法。

rds_data(由AWS支持部门确认)仅支持Aurora数据库。希望美国焊接学会的文件提到这一点。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 .

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

将zip上传到S3 bucket,因为直接部署限制为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
Graham Racher
Reply   •   2 楼
Graham Racher    4 年前

这是对使用18c Oracle客户机库的解决方案的更新。如果不是主解决方案的话,我要花很长时间才能使代码工作。希望这能帮助后面的人。 (旁白——我试着让它和instantclient_19_3一起工作,但是绕了一天圈,然后用instantclient_18_5试了一下,结果成功了)

下载并使用的文件

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

PKP
Reply   •   3 楼
PKP    5 年前

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

Hieron
Reply   •   4 楼
Hieron    5 年前

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