[英]AWS Lambda function to connect to SQL Server with Python
很长一段时间以来,我一直在尝试使用 AWS Lambda 功能连接到 SQL 服务器。
为此,我尝试使用任何库(尝试使用 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 需要安装在 lambda function 的 linux 环境中才能工作。 但是我没有那个环境可用,我也不知道这是否能解决这个问题。
如果我尝试使用 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 function 执行此操作,它将失败。
希望有人可以帮助我,显然,整个互联网都可以帮助我。
yum install gcc gcc-c++
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
[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....
现在玩游戏!
这是一个使用Docker和Lambda 层的 Python 3.9 解决方案。
请参阅此 Github 要点评论。
基于:
创建这个Dockerfile
:
# Dockerfile # See https://stackoverflow.com/a/72617192/58876 FROM amazon/aws-lambda-python:3.9 ENTRYPOINT [] WORKDIR /root # Get development tools to enable compiling RUN yum -y update RUN yum -y groupinstall "Development Tools" # Get unixODBC and install it RUN yum -y install tar gzip RUN curl ftp://ftp.unixodbc.org/pub/unixODBC/unixODBC-2.3.11.tar.gz -O RUN tar xvzf unixODBC-2.3.11.tar.gz WORKDIR /root/unixODBC-2.3.11 RUN ./configure --sysconfdir=/opt/python --disable-gui --disable-drivers --enable-iconv --with-iconv-char-enc=UTF8 --with-iconv-ucode-enc=UTF16LE --prefix=/home RUN make install WORKDIR /root RUN mv /home/* . RUN mv unixODBC-2.3.11 unixODBC-2.3.11.tar.gz /tmp # Install msodbcsql RUN curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/mssql-release.repo RUN yum -y install e2fsprogs openssl RUN ACCEPT_EULA=Y yum -y install msodbcsql mssql-tools --disablerepo=amzn* RUN cp -r /opt/microsoft/msodbcsql . # Install pyodbc # Need "unixODBC-devel" to avoid "src/pyodbc.h:56:10: fatal error: sql.h: No such file or directory" during pip install RUN yum -y install unixODBC-devel RUN export CFLAGS="-I/root/include" RUN export LDFLAGS="-L/root/lib" RUN pip install pyodbc adodbapi pyDes --upgrade -t . # Create odbc.ini and odbcinst.ini RUN echo $'[ODBC Driver 17 for SQL Server]\nDriver = ODBC Driver 17 for SQL Server\nDescription = My ODBC Driver 17 for SQL Server\nTrace = No' > /root/odbc.ini RUN echo $'[ODBC Driver 17 for SQL Server]\nDescription = Microsoft ODBC Driver 17 for SQL Server\nDriver = /opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.9.so.1.1\nUsageCount = 1' > /root/odbcinst.ini # Generate the zipped file that can be uploaded as a Lambda Layer RUN mkdir -p /opt/python RUN cp -r /root/* /opt/python RUN mv /opt/python/lib /opt RUN mv /opt/python/bin /opt WORKDIR /opt RUN zip -r /pyodbc.zip .
构建 Dockerfile 并提取生成的 zip 文件:
# Build the image (this will take a while...) $ docker build --platform=linux/amd64 -t mssql-lambda . # Copy the zipped file to /tmp/pyodbc.zip on your computer $ docker run --platform=linux/amd64 --rm --volume /tmp:/local-folder mssql-lambda cp /pyodbc.zip /local-folder/
/tmp/pyodbc.zip
作为 Lambda 层从您的计算机上传到 AWS 。
创建并运行 Python 3.9 Lambda 以进行测试:(确保将其配置为使用您在上一步中创建的层)
import pyodbc def lambda_handler(event, context): driver = '{ODBC Driver 17 for SQL Server}' server = 'XXX' port = '1433' database = 'XXX' username = 'XXX' password = 'XXX' # ideally put this in a SecretsManager secret instead of directly in the code connection = pyodbc.connect(f'DRIVER={driver};SERVER={server},{port};DATABASE={database};UID={username};PWD={password}') cursor = connection.cursor() query = """ select @@version """ cursor.execute(query) for row in cursor.fetchall(): print(row[0])
我认为您的问题是在没有在文档中指定的适当文件夹结构的情况下上传图层
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.