我正在尝试部署带有 pyodbc 层的 AWS Python Lambda 函数以进行数据库访问。当我运行该函数并尝试连接到数据库时,我收到一条错误,指示“connect”属性不存在。
我正在通过 Terraform 部署我的函数。
“import pyodbc”完成正常,这告诉我 Lambda 找到了该模块。图层文件夹结构如下...
/lib
/msodbcsql18
/python
/python/pyodbc-5-1.0.dist-info
/python/pyodbc.cpython-38-x86_64-linux-gnu.so
/python/pyodbc.pyi
/odbc.ini
/odbcinst.ini
这是功能代码...
import pyodbc
import os
import platform
def lambda_handler(event, context):
context.log(f"Platform: {platform.platform()}\n")
for item in os.listdir("/opt"):
context.log(f"ODBC Files: {item}\n")
conn_str = 'DRIVER={0};SERVER={1};UID={2};PWD={3};Port={4};TrustServerCertificate=yes'.format(
"{ODBC Driver 18 for SQL Server}",
os.environ["server_name"],
os.environ["user_name"],
os.environ["password"],
os.environ["ip_port"]
)
try:
context.log("[INFO] Attempting database connection\n")
db = pyodbc.connect(conn_str)
except Exception as e:
context.log(f"[ERROR] Connection failed - {e}\n")
return
我假设因为错误表明 pyodbc“connect”属性不存在,所以 ODBC 驱动程序是不相关的。换句话说,如果 pyodbc 模块未正确加载,它就无法尝试加载 ODBC 驱动程序。
lambda 平台是“Linux-5.10.209-218.812.amzn2.x86_64-x86_64-with-glibc2.2.5”。我认为这与 pyodbc 二进制文件“pyodbc.cpython-38-x86_64-linux-gnu.so”匹配,所以我相当确定不存在任何平台或体系结构兼容性问题。但是,我不知道如何确定 pyodbc 二进制文件是否实际加载,或者加载时是否出现错误。
我花了几天时间在 GitHub 和其他博客上摆弄各种 pyodbc 层,但运气不佳。
太好了,我做错了什么?我的假设此时 ODBC 驱动程序无关紧要吗?
我使用这个 Dockerfile https://github.com/davidcomerford/pyodbc-mssql-lambda-layer/blob/main/Dockerfile.python.3.11.x86_64 来构建用于创建 ODBC 层的映像。
有一行编译 unixODBC 返回错误,表明无法猜测目标平台。所以我将其设置为针对 x86_64 进行编译。我发现虽然我的 Dockerfile 配置为针对 x86_64 进行编译,但它却针对 arm64 进行编译。我更改了 Dockerfile 以针对 arm64 进行编译,一切开始按预期工作。
我的整个职业生涯都是 Windows 用户,最近在 M2 上深入了解了 MAC。我怀疑 MAC 上的 Docker 不喜欢尝试编译 x86_64,即使它会运行 x86 容器。