[英]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.