Python Azure Function本地可插入Azure MySQL Flexible Server,云端失效
解决方案
1. 先补全Application Insights拿到日志
没有日志根本没法定位问题,先搞定这个:
- 进入Azure Functions应用的配置页,找到Application Insights,关联一个新的或已有的Insights资源(免费版足够排查)
- 等待10分钟左右,前往Monitor > Logs运行查询
traces | order by timestamp desc,查看函数运行时的所有日志,重点关注数据库相关的报错信息
2. 核对云端数据库连接的核心配置
- 检查应用设置里的数据库环境变量:
MYSQL_HOST、MYSQL_USER、MYSQL_PASSWORD、MYSQL_DB必须和本地完全一致,注意密码中的特殊字符(比如@、&)是否存在转义问题,建议用单独的环境变量存储,不要直接写在连接字符串里 - 检查MySQL Flexible Server的防火墙规则:将函数应用的所有出站IP地址(在函数应用概述页的属性中查找)添加到MySQL的防火墙允许列表;或者临时开启“允许Azure服务访问服务器”选项,测试是否是防火墙导致的问题
3. 修正云端的SSL证书配置
本地的SSL证书路径在云端不生效,换成Azure环境自带的证书:
- 代码里把SSL CA证书路径改为
/etc/ssl/certs/Baltimore_CyberTrust_Root.pem,示例代码:
import os import logging import datetime import azure.functions as func import mysql.connector from mysql.connector import errorcode def main(mytimer: func.TimerRequest) -> None: utc_timestamp = datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc).isoformat() config = { 'user': os.environ['MYSQL_USER'], 'password': os.environ['MYSQL_PASSWORD'], 'host': os.environ['MYSQL_HOST'], 'database': os.environ['MYSQL_DB'], 'client_flags': [mysql.connector.ClientFlag.SSL], 'ssl_ca': '/etc/ssl/certs/Baltimore_CyberTrust_Root.pem' } conn = None try: conn = mysql.connector.connect(**config) cursor = conn.cursor() insert_query = "INSERT INTO test_table (timestamp) VALUES (%s)" cursor.execute(insert_query, (utc_timestamp,)) conn.commit() logging.info("Data inserted successfully") except mysql.connector.Error as err: logging.error(f"Database error occurred: {err.msg} (Error code: {err.errno})") finally: if conn and conn.is_connected(): cursor.close() conn.close()
- 不要在代码里硬编码本地证书路径,要么用云端默认路径,要么用环境变量指定
4. 确认依赖包在云端正确安装
- 进入函数应用的Advanced Tools(即Kudu),点击Go进入控制台,到
site/wwwroot目录查看requirements.txt是否正确上传,再前往python_env/lib/python3.10/site-packages目录确认mysql.connector包存在 - 如果依赖未安装成功,检查
requirements.txt里的包版本,比如指定mysql-connector-python==8.0.32,确保和Python 3.10兼容
5. 直接在云端测试数据库连接
- 在Kudu控制台新建一个简单的测试脚本
test_db.py,编写最小化的数据库连接插入逻辑,手动运行python test_db.py,验证是否能成功插入,排除函数触发机制的问题 - 如果使用托管身份连接MySQL,确认托管身份已被分配MySQL的数据库权限,且连接字符串采用身份验证方式,而非用户名密码
内容的提问来源于stack exchange,提问作者Matte_Kudasai
相关产品推荐
相关产品推荐

