python - 使用 pyodbc 的 azure 函数在本地机器上运行良好,但在 azure 云上却不行
问题描述
我使用 pyodbc 开发了一个简单的 python Azure 函数应用程序,以从公共 IP MS SQL 服务器中选择几行。我的函数应用程序在我的笔记本电脑上运行良好,但是当我在 Azure 云上发布它时它不起作用(我使用消费 - 无服务器计划,linux 环境)。通过日志记录,我知道它总是卡在 pyodbc.connect(...) 命令和超时。
#...
conn_str = f'Driver={driver};Server={server},{port};Database={database};Uid={user};Pwd={password};Encrypted=yes;TrustServerCertificate=no;Connection Timeout=30'
sql_query = f'SELECT * FROM {table_name}'
try:
conn = pyodbc.connect(conn_str) # always time-out here if running on Azure cloud!!!
logging.info(f'Inventory API - connected to {server}, {port}, {user}.')
except Exception as error:
logging.info(f'Inventory API - connection error: {repr(error)}.')
else:
with conn.cursor() as cursor:
cursor.execute(sql_query)
logging.info(f'Inventory API - executed query: {sql_query}.')
data = []
for row in cursor:
data.append({'Sku' : row.Sku, 'InventoryId' : row.InventoryId, 'LocationId' : row.LocationId, 'AvailableQuantity' : row.AvailableQuantity})
#...
捕获的日志记录:
Inventory API - connection error: OperationalError('HYT00', '[HYT00] [Microsoft][ODBC Driver 17 for SQL Server]Login timeout expired (0) (SQLDriverConnect)').
我已经在 requirements.txt 文件中包含了 pyodbc。我还在我的 SQL 服务器防火墙上允许我的函数应用程序的所有 outboundIpAddresses 和可能的OutboundIpAddresses。我的函数应用在 Azure 云上没有任何网络限制(或者至少在网络设置上是这样说的)。
我的配置文件:
driver={ODBC Driver 17 for SQL Server}
server=I tried both IP and full internet host name, both didn't work
有人可以给我一个提示吗?谢谢。
解决方案
我将以下代码段放入我的函数中以检查出站 IP,并发现 Azure 使用 [outboundIpAddresses] 和 [possibleOutboundIpAddresses] 中未列出的一些出站 IP(记录在此 MS 链接中)
import requests
#...
outbound_ip_response = requests.request('GET', 'https://checkip.amazonaws.com')
logging.info(f'Inventory API - main()- outbound ip = {outbound_ip_response.text}')
因此,我按照此链接中的说明为我的函数应用设置了静态出站 IP,并允许该 IP 访问我的 SQL 服务器。有效。
推荐阅读
- .htaccess - 我可以在 .htaccess 文件中有条件行吗?
- python - TKinter 多次按键
- scikit-learn - 模型选择 & 选择贝叶斯高斯混合模型中的活动组件数量
- mysql - 从批处理调用 MySQL 中的存储过程
- vue.js - Vue无法读取未定义的属性'$root'
- sql - 在 PostgreSQL 中插入之前触发,但某些列除外
- c# - 如何恢复打乱的 Dataflow 管道的顺序?
- java - Java Spring:具有有界泛型的 RestTemplate
- python - Pandas 查找时间索引在特定月份开始的 id-index
- scikit-learn - 调整超参数时出现 GridSearchCV 错误