目标:连接到AWS Lambda中的MS SQL Server
来自AWS Lambda的START RequestId: 37951004-404b-11e7-98fd-5177b3a46ec6 Version: $LATEST
module initialization error: ('01000', "[01000] [unixODBC][Driver Manager]Can't open lib 'ODBC Driver 13 for SQL Server' : file not found (0) (SQLDriverConnect)")
END RequestId: 37951004-404b-11e7-98fd-5177b3a46ec6
参考 Tesseract OCR on AWS Lambda via virtualenv
pip install -t pyodbc /home/ec2-user/lambda
并将相关文件复制到zip root )mkdir lib
并通过查找复制所有共享库 ldd pyodbc.so
* ldd libmsodbcsql-13.0.so.1.0
LD_LIBRARY_PATH
更改为lib
并将zip上传到Lambda .
+-- lambda.py
+-- pyodbc.so
+-- pyodbc-4.0.16-py2.7.egg-info
+-- lib
| +-- libodbc*.so etc.
从响应中看,除了unixODBC管理器在AWS Lambda Instance上找不到驱动程序外,所有内容都运行正常
如何将驱动程序与我的程序包捆绑以供AWS Lambda使用?或者有没有办法告诉ODBC驱动程序管理器查找libmsodbcsql-13.0.so.1.0
?
我尝试过离线安装unixODBC并设置./configure --prefix=/home/ec2-user/lambda --libdir=..
并手动更改odbcinst.ini
,但没有希望。
(对不起,我对python环境以外的任何东西都不太熟悉,所以我不确定所有的共享库的东西,只是谷歌搜索几天就无法解决我的问题)
答案 0 :(得分:2)
有没有办法告诉ODBC驱动程序管理器查找
libmsodbcsql-13.0.so.1.0
?
您可以运行odbcinst -j
并检查驱动程序ini文件所在的位置(odbcinst.ini
),以便在那里设置路径。否则,在~/.odbcinst.ini
创建一个新的,可以定义SQL ODBC驱动程序库的路径。
示例INI配置文件:
[ODBC Driver 13 for SQL Server]
Description=Microsoft ODBC Driver 13 for SQL Server
Driver=/path/to/libmsodbcsql-13.0.so.1.0
以下是创建配置文件(~/.odbcinst.ini
)的示例命令:
printf "[ODBC Driver 13 for SQL Server]\nDescription=Microsoft ODBC Driver 13 for SQL Server\nDriver=/path/to/libmsodbcsql-13.0.so.1.0\n" >> ~/.odbcinst.ini
如果驱动程序文件存在,但仍然找不到文件,请运行:conda update libgcc
。
答案 1 :(得分:0)
默认情况下,unixODBC 在 odbc.ini
中查找 /etc/
。在 Lambda 函数中,您无法修改它。 (好吧,也许您可以在运行时从 python 脚本中获取,但这并不理想。)
如果您自己编译 unixODBC,您可以尝试向 ./configure
、--sysconfdir
和 --prefix
添加一个额外的参数。有关详细信息,请参阅 here。
就我个人而言,我将 odbc 放在一个 lambda 层 中,它转到 /opt
。我认为 lambda 本身已解压缩到 /var/task
。这意味着当您在 EC2 上编译时,您应该指向 /var/task
。 (如果此目录尚不存在,您可能需要手动创建。)
./configure --sysconfdir=/var/task --prefix=/var/task
就我个人而言,我发现在 zip 中仅 yum install unixODBC
,然后 /usr/lib64/libodbc*
到 /lib/
以及在 zip 中 /opt
到 /
更容易,和 /usr/bin/odbc*
到 zip 内的 /bin/
。然后唯一的额外技巧是在 lambda 中设置环境变量。
ODBCINI=/var/task/odbc.ini
ODBCSYSINI=/var/task/