簡體   English   中英

AWS Lambda 使用 Python 和 pyodbc 連接到 SQL

[英]AWS Lambda connecting to SQL with Python and pyodbc

我有一個 AWS Lambda,我想連接到我的本地 SQL 服務器以從\\到讀取和寫入數據。 我正在使用 Python 和 pyodbc。 我已經安裝了 pyodbc(S3 存儲桶中的編譯 zip 文件通過一個層添加到 lambda 中),但是當我嘗試運行此代碼時,出現一個奇怪的錯誤:

import boto3
import pyodbc

s3 = boto3.client('s3')

def lambda_handler(event, context):
    # print(help(pyodbc))
    server = "Server"
    database = "Database"
    username = "AWS-Lamdba-RO"
    password = "Password"
    cnxn = pyodbc.connect('DRIVER={ODBC Driver 13 for SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password)
    cursor = cnxn.cursor()

這是錯誤:

[ERROR] AttributeError: module 'pyodbc' has no attribute 'connect' Traceback (most recent call last):   File "/var/task/lambda_function.py", line 13, in lambda_handler     cnxn = pyodbc.connect('DRIVER={ODBC Driver 13 for SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password)

我在網上找到的只是那些一開始就無法安裝 pyodbc 庫的人,所以過了那個症結后,我以為我是自由而清晰的。 誰能解釋一下我現在遇到了什么?

我從這里得到了 pyodbc: https : //github.com/Miserlou/lambda-packages/tree/master/lambda_packages/pyodbc

AWS 無法識別 .tar.gz 文件,因此我將其更改為 zip 文件,並添加到另一個 googled 站點告訴我的文件夾結構中:\\python\\lib\\python3.7\\site-packages\\pyodbc文件夾包含:libodbc.so.2 pyodbc.so

我將此 Zip 文件上傳到 S3 存儲桶並指向它的 Lambda 層。

我做了什么傻事嗎?

根據您的描述,我相信您可能誤解了文件夾結構。

如果要查看zip文件,則應該看到以下結構:

layerZip.zip
└ python
  └ lib
    └ python3.7
      └ site-packages
        └ pyodbc

但是我相信你可能真的有

layerZip.zip
└ \
  └ python
    └ lib
      └ python3.7
        └ site-packages
          └ pyodbc

但老實說,只需使用以下結構:

layerZip.zip
└ python
  └ pyodbc

它也可以正常工作,只是將模塊設置為全局模塊,而不是每個用戶。

我遇到過同樣的問題。 構建要上傳到lambda的軟件包時,必須使用正確版本的python。

我做了一個'pip install pyodbc -t'。

它放置了以下內容:

drwxr-xr-x 2 root root   4096 Sep 20 21:29 pyodbc-4.0.27.dist-info
-rwxr-xr-x 1 root root 658704 Sep 20 21:29 pyodbc.cpython-36m-x86_64-linux-gnu.so

lib非常特定於python版本。 在文件名“ -36m-”中,因此它將在lambda python 3.6環境下工作。

我最初的問題是我在docker環境中使用了lambci / lambda:build-python3.7。 因此,pyodbc安裝了庫python 3.7版本“ -37m-”。

由於lambda正在尋找3.6版本,因此沒有看到3.7版本。

我改用lambci / lambda:build-python3.6,一切都更好。

我關注了這篇文章,以確保一切正常:

https://medium.com/faun/aws-lambda-microsoft-sql-server-how-to-66c5f9d275ed

值得注意的點

  • 您構建層的環境應該與您的 Lambda 函數運行時環境相同。 IE。 如果您在 python3.7 環境中構建包,那么 lambda 應該與 python 3.7 運行時一起啟動。

AWS Support 的指導

pyodbc 以共享庫格式分發(為 lambda 編譯可能有點困難)。 它還需要其他共享庫,例如 unixODBC(包裝器工作的連接器)以及數據庫驅動程序(在這種情況下,我們將使用 msodbcsql17)。

該層的文件夾結構應如下所示:

|-- pyodbc-layer
    |-- bin
    |-- include
    |-- lib
    |-- odbc.ini
    |-- ODBCDataSources
    |-- odbcinst.ini
    |-- python
        |-- pyodbc-4.0.26.dist-info
        |-- pyodbc.cpython-37m-x86_64-linux-gnu.so
    |-- share

為了生成這個層,你需要執行以下步驟:

  1. 創建一個 EC2 Ubuntu 18.04 LTS 實例(t2.micro 很好)並通過 SSH 連接到它。

  2. 通過以下命令使用 snap 安裝 docker: sudo snap install docker

  3. 運行以下命令,創建一個基於amazon linux 的容器,環境為python3.7。 請記住,您可以通過將 build-python3.7 更改為 build-python3.6 來更改為 python 3.6。

sudo docker run -it --rm -iv${PWD}:/host-volume --entrypoint bash -e ODBCINI=/opt/odbc.ini -e ODBCSYSINI=/opt/ lambci/lambda:build-python3.7
  1. 當你第一次運行這個命令時,docker 會從 dockerhub 下載 amazon linux 鏡像(下載和解壓可能需要 30-60 秒)。 下載后,您將進入docker的圖像bash(如果您沒有重定向到dockers bash,只需再次運行該命令)

  2. 在您進入 docker 的 bash 后,將以下命令復制並粘貼到您的 docker 中:

curl ftp://ftp.unixodbc.org/pub/unixODBC/unixODBC-2.3.7.tar.gz  -O
tar xzvf unixODBC-2.3.7.tar.gz
cd unixODBC-2.3.7

./configure --sysconfdir=/opt --disable-gui --disable-drivers --enable-iconv --with-iconv-char-enc=UTF8 --with-iconv-ucode-enc=UTF16LE --prefix=/opt
make
make install

cd ..
rm -rf unixODBC-2.3.7 unixODBC-2.3.7.tar.gz

curl https://packages.microsoft.com/config/rhel/6/prod.repo  > /etc/yum.repos.d/mssql-release.repo
yum install e2fsprogs.x86_64 0:1.43.5-2.43.amzn1 fuse-libs.x86_64 0:2.9.4-1.18.amzn1 libss.x86_64 0:1.43.5-2.43.amzn1
ACCEPT_EULA=Y yum install msodbcsql17 --disablerepo=amzn*
export CFLAGS="-I/opt/include"
export LDFLAGS="-L/opt/lib"

cd /opt
cp -r /opt/microsoft/msodbcsql17/ .
rm -rf /opt/microsoft/

mkdir /opt/python/
cd /opt/python/
pip install pyodbc -t .

cd /opt
cat <<EOF > odbcinst.ini
[ODBC Driver 17 for SQL Server]
Description=Microsoft ODBC Driver 17 for SQL Server
Driver=/opt/msodbcsql17/lib64/libmsodbcsql-17.7.so.2.1
UsageCount=1
EOF

cat <<EOF > odbc.ini
[ODBC Driver 17 for SQL Server]
Driver = ODBC Driver 17 for SQL Server
Description = My ODBC Driver 17 for SQL Server
Trace = No
EOF

cd /opt
zip -r9 ~/pyodbc-layer.zip .

(如果您遇到與“只讀文件系統”相關的錯誤,只需使用“exit”命令退出 docker shell 並重試這些步驟)

  1. 現在確保使用以下命令退出容器:
exit
  1. 現在該文件將在文件夾“/home/ubuntu”中可用。 您可以使用 AWS CLI(如果已配置)上傳或通過 Sftp 檢索。 如果您打算使用 Cyber​​duck/winscp/fillezilla 甚至 sftp shell,您將需要更改文件的權限才能下載它。

授予要下載的文件權限的最快方法是使用以下行:

sudo chmod o+rw pyodbc-layer.zip
  1. 現在您可以使用 sftp 或任何與 sftp 兼容的客戶端來檢索它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM