AWS Lambda 使用 Python 和 pyodbc 连接到 SQL
AWS Lambda connecting to SQL with Python and pyodbc
我有一个 AWS Lambda,我想连接到我的本地 SQL 服务器来读取和写入数据 from\to。我正在使用 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 文件,并添加到另一个 google 搜索网站告诉我需要的文件夹结构中:
\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
该库非常特定于 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
为了生成该层,您需要执行以下步骤:
创建一个 EC2 Ubuntu 18.04 LTS 实例(t2.micro 可以)并通过 SSH 连接到它。
通过以下命令使用 snap 安装 docker:
sudo snap install docker
运行 以下命令基于 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
当您使用 运行 这个命令时,docker 将从 dockerhub 下载亚马逊 linux 图片(可能需要 30-60下载和解压缩它的秒数)。下载后会进入docker的图片bash
(如果您没有被重定向到 dockers bash,只需再次 运行 命令)
进入 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,然后重试这些步骤)
- 现在确保使用以下命令退出容器:
exit
- 现在文件将在文件夹“/home/ubuntu”中可用。您可以使用 AWS CLI 上传它(如果您配置了它)或通过 Sftp 检索。如果您要使用 cyberduck/winscp/fillezilla 甚至 sftp shell,您需要更改文件的权限才能下载它。
授予文件下载权限的最快方法是使用以下行:
sudo chmod o+rw pyodbc-layer.zip
- 现在您可以使用 sftp 或任何兼容 sftp 的客户端检索它。
我有一个 AWS Lambda,我想连接到我的本地 SQL 服务器来读取和写入数据 from\to。我正在使用 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 文件,并添加到另一个 google 搜索网站告诉我需要的文件夹结构中: \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
该库非常特定于 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
为了生成该层,您需要执行以下步骤:
创建一个 EC2 Ubuntu 18.04 LTS 实例(t2.micro 可以)并通过 SSH 连接到它。
通过以下命令使用 snap 安装 docker:
sudo snap install docker
运行 以下命令基于 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
当您使用 运行 这个命令时,docker 将从 dockerhub 下载亚马逊 linux 图片(可能需要 30-60下载和解压缩它的秒数)。下载后会进入docker的图片bash (如果您没有被重定向到 dockers bash,只需再次 运行 命令)
进入 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,然后重试这些步骤)
- 现在确保使用以下命令退出容器:
exit
- 现在文件将在文件夹“/home/ubuntu”中可用。您可以使用 AWS CLI 上传它(如果您配置了它)或通过 Sftp 检索。如果您要使用 cyberduck/winscp/fillezilla 甚至 sftp shell,您需要更改文件的权限才能下载它。
授予文件下载权限的最快方法是使用以下行:
sudo chmod o+rw pyodbc-layer.zip
- 现在您可以使用 sftp 或任何兼容 sftp 的客户端检索它。