首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Python连接到Server的AWS Lambda函数

用Python连接到Server的AWS Lambda函数
EN

Stack Overflow用户
提问于 2017-12-06 20:32:48
回答 3查看 16.4K关注 0票数 3

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

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

每个库的代码都是相同的,但是错误是不同的。

守则:

代码语言:javascript
复制
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如下所示:

代码语言:javascript
复制
.idea (dir)
pyodbc (dir)
lambda_function.py
pyodbc.pyd

我所犯的错误:

代码语言:javascript
复制
Unable to import module 'lambda_function': No module named pyodbc

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

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

我所犯的错误:

代码语言:javascript
复制
module initialization error: 'ODBC Library is not found. Is LD_LIBRARY_PATH set?'

对于这一次,我尝试安装由其他堆栈溢出帖子( python,unixodbc)建议的多个python包,但每次都失败了。

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

也许这能帮上忙?我不知道如何获得本地ODBC库。

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

希望有人能帮到我,很显然,整个互联网都能帮到我。

EN

回答 3

Stack Overflow用户

发布于 2018-03-15 08:56:51

  • 您需要知道Lambda在本地/var/task/中复制您的函数
  • 使用Lambda官方AMI https://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html创建实例
  • 启动实例,登录
  • yum install gcc gcc-c++
  • 进入/home/ec2-用户
  • 从:ftp://ftp.unixodbc.org/pub/unixODBC/下载最后一个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
  • 转到Lambda项目所在的计算机上的/home dir并复制bin、include、lib和共享目录(ex: C:\AWS\Lambda\sql_query)
  • 在您的C:\AWS\Lambda\sql_query\msodbcsql\msodbcsql\lib64实例上安装Microsoft驱动程序libmsodbcsql-13.1.so.9.1,然后在您的PC本地目录中复制驱动程序文件(ex: 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....
  • 现在就玩游戏吧!
票数 7
EN

Stack Overflow用户

发布于 2022-06-14 12:43:03

这里有一个使用DockerLambda层的Python3.9解决方案。

这是吉顿的评论

根据:

  1. 从amazon/aws python:3.9 ENTRYPOINT [] WORKDIR /root # Get开发工具中创建此DockerfileDockerfile文件,以支持编译RUN yum -y update RUN -y groupinstall # Get unixODBC并安装它,运行yum -y install gzip运行curl运行curl xvzf unixODBC-2.3.11.tar.gz WORKDIR /Dockerfile/unixODBC-2.3.11运行。sysconfdir=/opt/python -禁用-gui-禁用-驱动程序-启用-iconv char-enc=UTF8 8-with-iconv ucode-enc=uTF16LE-前缀= /root /unixODBC-安装使安装运行mv /root/unixODBC/ install /bin /opt/bin运行mv /root/unixODBC安装/lib /opt/lib WORKDIR /root# install msodbcsql curl https://packages.microsoft.com/config/rhel/7/prod.repo >/etc/yumre.d/mssql-reasrepe.run yum -y e2fsprogs e2fsprogs ACCEPT_EULA=Y yum -y安装msodbcsql mssql-tools -disablerepo=amzn*运行rm -r /opt/microsoft/msodbcsql # install pyodbc #必需" unixODBC-devel“,以避免"src/pyodbc.h:56:10:致命错误: sql.h:没有这样的文件或目录”在pip安装期间运行yum -y -y unixODBC-devel-y/msodbcsql 17/包括“运行导出LDFLAGS=”-L/opt/microsoft/msodbcsql17/“运行pip安装pyodbc==4.0.32 adodbapi==2.6.2.0 pyDes==2.0.1 --升级-升级”-target /opt/python #添加一个requirements.txt文件并使本节能够安装其他(非requirements.txt服务器)数据--加载要求#复制requirements.txt/tmp/Requiments.txt#运行pip安装-requirement/tmp/requments.txt-target /opt/python # Create odbc.ini和odbcinst.ini运行echo $‘ODBCDriver17用于Server\nDriver =驱动程序17用于Server\nDescription = My驱动程序17 for Server\nTrace = No’>/opt/pyodbc.ini运行so_file=$(ls /opt/odbc.ini)/opt /**/ zip 64/libmsodbcsql-*..so.* grep msodbcsql17) & echo $'ODBC驱动程序17用于Server\n nDescription= Microsoft驱动程序17用于Server\nDriver =“$so_file”$‘\nUsageCount= 1’> /opt/python/odbcinst.ini #生成可以上传为Lambda层WORKDIR /opt RUN -r /layer.zip的压缩文件。
  2. 构建Dockerfile并提取生成的zip文件:构建映像(这需要一段时间.)$=linux/ and 64 -t mssql。#将压缩文件复制到计算机$ docker运行的/tmp/pyodbc.zip -platform=linux/amd64 64-rm-册/tmp:/tmp mssql /layer.zip /tmp/
  3. /tmp/layer.zip 从你的电脑到AWS上传为Lambda层。
  4. 创建并运行Python3.9Lambda测试:(确保将其配置为使用在上一步中创建的层) 导入pyodbc def lambda_handler(事件、上下文):驱动程序= '{ODBC驱动程序17 for Server}‘server = 'XXX’端口= 'XXX‘数据库= 'XXX’用户名= 'XXX‘密码=’XXX‘#理想情况下将其放入SecretsManager秘密中,而不是直接放在代码连接=;DATABASE={;DATABASE=数据库};UID={ username }中;PWD={密码}‘)游标= connection.cursor()查询=“选择@@version”“cursor.execute(查询)”用于cursor.fetchall():print(行)中的行
票数 1
EN

Stack Overflow用户

发布于 2022-09-16 19:41:12

我认为您的问题是在没有文档中指定的适当文件夹结构的情况下上传该层。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47682991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档