【问题标题】:AWS Lambda function to connect to SQL Server with Python使用 Python 连接到 SQL Server 的 AWS Lambda 函数
【发布时间】:2018-05-20 20:21:02
【问题描述】:

很长一段时间以来,我一直在尝试使用 AWS Lambda 函数连接到 SQL Server。

为此,我尝试使用任何库(尝试使用 pyodbc、pypyodbc 等),将所有内容打包成 zip 文件并上传代码。

每个库的代码几乎相同,但错误不同。

代码:

import pypyodbc

def lambda_handler(event, context):
    conn = pypyodbc.connect('DRIVER={SQL Server};'
                      'SERVER=1.1.1.1;'
                      'DATABASE=dbname;'
                      'UID=user;'
                      'PWD=pwd')

    cur = conn.cursor()

    cur.execute("SELECT * FROM Table")

    item_count = 0

    for row in cur:
        item_count += 1

    print(item_count)

    cur.close()
    conn.close()

    return item_count

我讨论过的常见问题: - 我将项目内容添加到 zip 中,而不是文件夹。 - 我还将代码运行所需的库添加到 zip 文件中。

如果我尝试使用 pyodbc,我上传的 zip 如下所示:

.idea (dir)
pyodbc (dir)
lambda_function.py
pyodbc.pyd

我得到的错误:

Unable to import module 'lambda_function': No module named pyodbc

在搜索了很长一段时间后,我找不到任何有用的东西。只有一条评论说 pyodbc 需要安装在 linux 环境中才能使 lambda 函数工作。但是我没有那个环境可用,我也不知道这是否能解决这个问题。

如果我尝试使用 pypyodbc,我上传的 zip 文件如下所示:

我得到的错误:

module initialization error: 'ODBC Library is not found. Is LD_LIBRARY_PATH set?'

为此,我尝试安装其他 stackoverflow 帖子(python-pyodb、unixodbc)建议的多个 python 包,但每次都失败。

然后有一条评论说“确保将本机 ODBC 库放在 zip 部署包中的 lib 文件夹下”

也许这有点帮助?我不知道如何获取本机 ODBC 库..

哦,还有最后一件事。如果我从本地机器运行它们,这两个库都可以工作。我可以访问目标服务器。如果我从 lambda 函数中执行此操作,它会失败。

希望有人可以帮助我,显然,整个互联网。

【问题讨论】:

  • 您可以创建一个 ec2-instance 并创建虚拟环境并安装所有依赖项并将它们压缩。并尝试使用该 zip 文件进行安装。
  • 我看看能不能试试。这是我剩下的唯一方法,但我试图避免它。谢谢乌斯曼。
  • @EmilianoRodriguez 我遇到了同样的问题。 Usman Azhar 的评论真的是你必须求助的,还是有更好的方法?
  • 我在一个项目中测试此功能,但我们放弃了尝试实现此方法并转向其他事情。如果我没记错的话,我一直在尝试构建要上传的包,但无法实现。我最好的尝试是在 linux 机器上构建包。前几天这部分有一条新评论,也许你应该看看它是否有帮助。

标签: python sql-server amazon-web-services aws-lambda


【解决方案1】:
  • 您需要知道 Lambda 将您的函数复制到本地 /var/task/
  • 使用 Lambda 官方 AMI 创建实例 https://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html
  • 启动实例,登录
  • yum install gcc gcc-c++
  • 进入 /home/ec2-user
  • 从以下位置下载最后一个 unixodbc 管理器: ftp://ftp.unixodbc.org/pub/unixODBC/
  • wget ftp://ftp.unixodbc.org/pub/unixODBC/unixODBC-2.3.5.tar.gz
  • tar xvzf unixODBC-2.3.5.tar.gz
  • cd unixODBC-2.3.5
  • 用正确的 sysconfdir 值配置它

    ./configure --sysconfdir=/var/task --disable-gui --disable-drivers --enable-iconv --with-iconv-char-enc=UTF8 --with-iconv-ucode-enc=UTF16LE --prefix=/home

  • make install
  • 转到 /home 目录并复制 Lambda 项目所在计算机上的 bin、include、lib、share 目录(例如:C:\AWS\Lambda\sql_query)
  • 在您的 EC2 实例上安装 Microsoft 驱动程序 libmsodbcsql-13.1.so.9.1,然后将驱动程序文件复制到您的 PC 本地目录(例如:C:\AWS\Lambda\sql_query\msodbcsql\msodbcsql\lib64)李>
  • 看看 https://blogs.msdn.microsoft.com/sqlnativeclient/2017/02/04/odbc-driver-13-1-for-linux-released/
  • 在您的计算机上,在同一根目录中创建文件 odbcinst.ini

[ODBC Driver 13 for SQL Server] Description=Microsoft ODBC Driver 13 for SQL Server Driver=/var/task/msodbcsql/msodbcsql/lib64/libmsodbcsql-13.1.so.9.1 UsageCount=1

  • 在您的计算机上,在同一根目录中创建文件 odbc.ini

    [ODBC Driver 13 for SQL Server] Driver = ODBC Driver 13 for SQL Server Description = My ODBC Driver 13 for SQL Server Trace = No

  • 在你的 python 程序上使用 pyodbc:

    import pyodbc def lambda_handler(event, context): server = "xxxxxxxxxxxxxxxxxxxx" database = "xxxxxxxxxxxxxxxxxxxx" username = "xxxxxxxxxxxxxxxxxxxx" password = "xxxxxxxxxxxxxxxxxxxx" cnxn = pyodbc.connect('DRIVER={ODBC Driver 13 for SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password) cursor = cnxn.cursor() ...other things....

  • 现在开始游戏吧!

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-23
  • 2017-12-13
  • 1970-01-01
  • 1970-01-01
  • 2018-12-21
  • 2017-10-12
  • 1970-01-01
相关资源
最近更新 更多