【问题标题】:How we can connect to oracle database through aws lambda python?我们如何通过 aws lambda python 连接到 oracle 数据库?
【发布时间】:2020-09-04 07:06:12
【问题描述】:

我有一个需求,我需要连接到 oracle 数据库并从 db 表中获取一些数据。因此,由于我是 aws lambda 的初学者,所以我从下面的示例开始。

import cx_Oracle
import os
import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)

def lambda_handler(event, context):

logger.info('begin lambda_handler')

dsn = cx_Oracle.makedsn("hostname", "1521", "sid")
con = cx_Oracle.connect("user_id", "password", dsn)
cur = con.cursor()

#logger.info('username: ' + username)
#logger.info('host: ' + host)

sql = """SELECT COUNT(*) AS TEST_COUNT FROM DUAL"""

cur.execute(sql)
columns = [i[0] for i in cur.description]
rows = [dict(zip(columns, row)) for row in cur]
logger.info(rows)

con.close()
logger.info('end lambda_handler')
return "Successfully connected to oracle."

我在 linux 中创建了下面的结构来创建部署包。

父目录

-lib(在这个库下我放置了所有的oracle即时客户端文件)

-cx_oracle 文件

lmbda_function.py

在 aws lambda 上部署包并对其进行测试后,出现以下错误。

[错误] 数据库错误:DPI-1047:找不到 64 位 Oracle 客户端库:“/var/task/lib/libclntsh.so:文件太短”。请参阅https://oracle.github.io/odpi/doc/installation.html#linux 寻求帮助 回溯(最近一次通话最后): 文件“/var/task/lambda_function.py”,第 29 行,在 lambda_handler 中

请有人帮我实现这一点,如果有任何更好的选择可以从 aws lambda 连接到 oracle,而不是分享。

【问题讨论】:

    标签: python-3.x oracle aws-lambda


    【解决方案1】:

    我遇到了同样的问题。阅读this article 后,您似乎缺少libaio.so.1 文件。我猜你是从 Windows 机器上下载了即时客户端,因为据我了解,下载到 Windows 平台时不包含 libaio 文件。我能够从this repo 下载libaio.so.1 文件。只需确保将其与其他 oracle 即时客户端文件放在 lib 文件夹中即可。

    【讨论】:

    • 请不要以使它们看起来像问题的方式编写答案。有一些系统可以检查 Not An Answer (NAA) 帖子。这个答案被其中一个人错误地接受了。请考虑对其进行编辑以使其看起来更像一个答案。删除“您是否从 Windows 机器下载了即时客户端,因为据我了解,下载到 Windows 平台时不包含 libaio 文件。”部分。
    • 他们可能确实从使用不同操作系统的机器上复制了 Instant Client,因此不仅需要 libaio,还需要一整套与 PHP 在 Lambda 上运行的操作系统相匹配的 Instant Client 库。
    • 是的,幸运的是,当您在 windows 上下载 linux 版本的即时客户端时,它附带了所有库,libaio 是唯一没有附带的。
    【解决方案2】:
    1. 截取一个 Ec2 实例

    2. 下载 cx_Oracle-7.3.0-cp37-cp37m-manylinux1_x86_64.whl - https://pypi.org/project/cx-Oracle/#files

    3. 下载 Oracle 即时客户端 - https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html (instantclient-basiclite-linux.x64-21.3.0.0.0)

    4. 下载 lib64aio1-0.3.111-1pclos2018.x86_64.rpm

    5. 在 Ec2 实例中,请按照以下步骤操作

      1. sudo yum 更新
      2. 安装 pip (sudo yum install python3-pip) – 如果未安装 pip。我认为默认情况下我们会在 Ec2 中获得 pip。您可以通过运行命令“pip3 –version”来检查版本
      3. 下一步是安装 Pipenv。虚拟环境是一种工具,可以通过为不同项目创建虚拟 Python 环境来将不同项目所需的依赖项保存在不同的位置。
      4. sudo pip3 install virtualenv
      5. Virtualenv oraclelambda(某个文件夹名称),您将看到一个名为 oraclelambda 的目录
      6. 源 oraclelambda/bin/activate
      7. pip install cx_Oracle-7.3.0-cp37-cp37m-manylinux1_x86_64.whl(您会注意到 cx_Oracle 安装在 oraclelambda 目录中)
      8. sudo yum 删除 libaio-0.3.109-13.amzn2.0.2.x86_64
      9. sudo yum install lib64aio1-0.3.111-1pclos2018.x86_64.rpm
      10. 接下来转到 usr/lib64 – 您将看到 libaio.so.1.0.1(复制此文件)
      11. 下一步提取 oracle 即时客户端
      12. 将 libaio.so.1.0.1 文件粘贴到即时客户端文件夹中,并将 libaio.so.1.0.1 文件重命名为 libaio.so.1
      13. 下一步是获取即时客户端文件夹,例如从解压缩的 zip 文件中取出 Instantclient_21_3 并将其压缩
      14. 创建名为 python 的新文件夹,并在 python 文件夹中创建另一个 lib 文件夹。
      15. 下一步是从 oraclelambda/lib64 复制 python3.7 文件夹并将其放在 phthon/lib 文件夹中。文件夹结构为 python\lib\python3.7\site-packages\
      16. 现在压缩 python 文件夹
    6. 此时我们有两个 zip 文件

      1. 即时客户端
      2. Python
    7. 以上两个 zip 文件我们将在 lambda 层中更新它们

    8. 创建 lambda,将 zip 文件更新到层中,创建适当的安全组。

    9. 请将以下内容添加到 lambda 的环境变量中,以便它可以找到 Oracle Instant Client 库。

      Key  = LD_LIBRARY_PATH
      Value = /opt/
      

    【讨论】:

      【解决方案3】:

      我遇到了类似的问题。在我下载 Oracle 客户端库和 libaio 并在创建 Lambda 层时将其与 cx_Oracle 捆绑后,它得到了解决。您可以观看我为此活动制作的以下视频。希望对你有所帮助-https://www.youtube.com/watch?v=BYiueNog-TI&ab_channel=BorrowedCloud

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-22
        • 2022-11-24
        • 2013-10-21
        • 2018-06-20
        • 1970-01-01
        • 2021-09-05
        • 2020-12-16
        • 2015-12-26
        相关资源
        最近更新 更多