从AWS Lambd连接Oracle

2024-06-26 14:22:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Lambda函数,它需要使用pandas、sqlalchemy和cx_Oracle。在

安装和打包所有这些库超过了250MB deployment package limit of AWS Lambda。在

我只想包含Oracle Basic Light Package的.zip,然后在运行时提取并使用它。在

我尝试过的

我的项目结构如下:

cx_Oracle-7.2.3.dist-info/
dateutil/
numpy/
pandas/
pytz/six-1.12.0.dist-info/
sqlalchemy/
SQLAlchemy-1.3.8.egg-info/
cx_Oracle.cpython-36m-x86_64-linux-hnu.so
instantclient-basiclite-linux.x64-19.3.0.0.0dbru.zip
main.py
six.py
template.yml

main.py中,我运行以下命令:

^{pr2}$

这将返回错误:

sqlalchemy.exc.DatabaseError: (cx_Oracle.DatabaseError) DPI-1047: Cannot locate a 64-bit Oracle Client library: "libclntsh.so: cannot open shared object file: No such file or directory". See https://oracle.github.io/odpi/doc/installation.html#linux for help (Background on this error at: http://sqlalche.me/e/4xp6)

我也尝试过

我试过了:

  • 添加
Environment: 
    Variables: 
      ORACLE_HOME: /tmp 
      LD_LIBRARY_PATH: /tmp 

template.yml并重新部署。与上述错误相同。在

  • os.system('export LD_LIBRARY_PATH=/tmp/instantclient_19_3')添加到python脚本中。与上述错误相同。在
  • 许多cpln的东西在Lambda中被禁止在/tmp文件夹之外。与上述错误相同。在

有一种方法是有效的,但不好

如果我在Lambda包中创建一个名为lib/的文件夹,并包含一组奇怪的libaio.so.1libclntsh.so等文件,由于某些原因,该函数将按预期工作。我的结局是:

<all the other libraries and files as above>
lib/
-libaio.so.1
-libclntsh.so
-libclntsh.so.10.1
-libclntsh.so.11.1
-libclntsh.so.12.1
-libclntsh.so.18.1
-libclntsh.so.19.1
-libclntshcore.so.19.1
-libipc1.so
-libmql1.so
-libnnz19.so
-libocci.so
-libocci.so.10.1
-libocci.so.11.1
-libocci.so.12.1
-libocci.so.18.1
-libocci.so.19.1
-libociicus.so
-libons.so

但是,我选择了这些文件,通过反复试验,不想再经历这一次。在

有没有办法在运行时解压Lambda中的instantclient-basiclite-linux.x64-19.3.0.0.0dbru.zip,并让Lambda看到/使用它连接到Oracle数据库吗?


Tags: lambda函数pyinfososqlalchemylinux错误
1条回答
网友
1楼 · 发布于 2024-06-26 14:22:07

我绝不是python的专家,但这一行似乎很奇怪

print('extracting oracle drivers and copying results to /var/task/lib')
os.system('unzip /var/task/instantclient-basiclite-linux.x64-19.3.0.0.0dbru.zip -d /tmp')
print('extraction steps complete')
os.system('export ORACLE_HOME=/tmp/instantclient_19_3')

通常,使用Lambda对OS级API的访问非常有限。即使你这样做了,它也可以表现出你不希望它做的事情。(想象一下:谁拥有“解压”功能?由该命令创建的文件将由谁可见/可调用?)在

我看到你提到你没有问题提取文件,这也有点奇怪

我唯一的回答是

1/尝试“自带”工具(解压等)在

2/从不尝试进行操作系统级调用。像操作系统('export…'),始终使用完整路径

再看看你的问题,你指定环境变量的方式似乎有冲突

^{pr2}$

不是吗

Environment: 
    Variables: 
      ORACLE_HOME: /tmp/instantclient_19_3
      LD_LIBRARY_PATH: /tmp/instantclient_19_3

另请参见:How to access an AWS Lambda environment variable from Python

相关问题 更多 >