部署至ASE V3的Azure Functions请求超时问题求助
部署至ASE V3环境Azure Function App时的请求超时及部署任务失败问题
已完成以下配置验证:
- AzureWebJobsStorage、WEBSITE_VNET_ROUTE_ALL、WEBSITE_DNS_SERVER等环境变量配置正确
- DNS解析正常
- Function App的Always On已开启
- 通过KUDU URL确认应用处于运行状态
但仍存在两个核心问题:
- 请求需经历两次超时后才能收到响应
- Azure DevOps部署任务执行失败,报错:
##[error]Error: Failed to fetch App Service 'func_name' details. Error: Request timeout: /subscriptions//resourceGroups//providers/Microsoft.Web/sites//?api-version=2016-08-01
AzureFunctionApp@2部署任务配置
- task: AzureFunctionApp@2 displayName: 'Azure functions app deploy' inputs: connectedServiceNameARM: '<Service Connection Name>' appType: 'functionAppLinux' appName: 'func_name' deployToSlotOrASE: true resourceGroupName: 'RG_name' slotName: 'production' package: '$(Pipeline.Workspace)/drop/$(Build.BuildId).zip' appSettings: -RequestTimeout 5000
FUNCTION_APP.py代码片段
import azure.functions as func from azure.storage.blob.aio import BlobServiceClient import logging import os import io import time import psutil import aiohttp from fastapi import FastAPI, Request, Response, HTTPException, status from fastapi.middleware.gzip import GZipMiddleware from fastapi.responses import StreamingResponse from azure.monitor.opentelemetry import configure_azure_monitor from opentelemetry import trace from opentelemetry.sdk.resources import Resource, ResourceAttributes configure_azure_monitor() VERSION = "1.0.7" logging.getLogger('azure.core.pipeline.policies.http_logging_policy').setLevel(logging.WARNING) fast_app = FastAPI() fast_app.add_middleware(GZipMiddleware, minimum_size=6000) app = func.FunctionApp() stopwatch = None images_client = BlobServiceClient.from_connection_string(os.environ['sa_images_connection'], max_chunk_get_size=64*1024) web_client = BlobServiceClient.from_connection_string(os.environ['sa_staticweb_connection']) def stopwatch_lap(initial_time: float, message: str|None = None) -> float: elapsed_time = time.perf_counter() - initial_time if message is not None: logging.info(f"{message} Elapsed time: {elapsed_time:.4f} s") return time.perf_counter()
host.json配置
{ "version": "2.0", "logging": { "applicationInsights": { "samplingSettings": { "isEnabled": true, "excludedTypes": "Request" } } }, "extensionBundle": { "id": "Microsoft.Azure.Functions.ExtensionBundle", "version": "[4.*, 5.0.0)" }, "extensions": { "http": { "routePrefix": "" } } }
排查建议
部署任务超时排查
- 检查服务连接权限:确认Azure DevOps服务连接使用的SPN或托管标识,拥有对ASE及Function App的
Microsoft.Web/sites/read权限,避免因权限不足导致请求超时 - 验证代理网络可达性:若使用自托管代理,确保代理所在网络能通过专用端点/服务端点访问Azure Resource Manager(ARM)及ASE管理端点;若使用微软托管代理,需确认ASE是否允许公共网络访问管理端点,或已通过Private Link配置ARM访问
- 延长任务超时时间:在AzureFunctionApp@2任务中添加
timeoutInMinutes: 10(可按需调整),覆盖默认超时限制
Function App请求超时排查
- 监控Blob存储连接耗时:在代码中添加日志,记录
BlobServiceClient初始化及首次存储请求的耗时,确认是否为存储账户连接导致延迟;可尝试调整max_chunk_get_size至128*1024测试效果 - 优化OpenTelemetry初始化:
configure_azure_monitor()可能在冷启动时耗时较长,可将其移至函数触发时执行,而非全局初始化,并添加日志记录初始化耗时 - 调整HTTP超时配置:当前
RequestTimeout设为5000秒过于夸张,建议调整为300秒以内的合理值,同时检查host.json中HTTP扩展配置是否存在路由冲突 - 冷启动优化:尽管开启Always On,ASE环境下仍可能存在冷启动延迟,可尝试预热函数或增加应用服务计划实例数
- 深度排查DNS解析:在KUDU中执行
nslookup命令,检查存储账户专用端点的解析耗时,确认是否存在DNS缓存失效或解析超时问题;可检查专用DNS区域配置是否正确
内容的提问来源于stack exchange,提问作者Lbits
相关产品推荐
相关产品推荐

