使用unixODBC

时间:2017-05-24 07:07:26

标签: python amazon-web-services lambda odbc pyodbc

目标:连接到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

  1. 在aws ec2实例中为SQL Server安装了unixODBC和ODBC驱动程序13
  2. 创建了一个部署包(即pip install -t pyodbc /home/ec2-user/lambda并将相关文件复制到zip root
  3. mkdir lib 并通过查找复制所有共享库 ldd pyodbc.so * ldd libmsodbcsql-13.0.so.1.0
  4. lambda.py 中的LD_LIBRARY_PATH更改为lib并将zip上传到Lambda
  5. Zip文件结构:

    .
    +-- 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环境以外的任何东西都不太熟悉,所以我不确定所有的共享库的东西,只是谷歌搜索几天就无法解决我的问题)

2 个答案:

答案 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

请参阅:PyODBC : can't open the driver even if it exists

答案 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

简单的 Yum 方法

就我个人而言,我发现在 zip 中仅 yum install unixODBC,然后 /usr/lib64/libodbc*/lib/ 以及在 zip 中 /opt/ 更容易,和 /usr/bin/odbc* 到 zip 内的 /bin/。然后唯一的额外技巧是在 lambda 中设置环境变量。

ODBCINI=/var/task/odbc.ini
ODBCSYSINI=/var/task/