如何通过Terraform无停机将Front Door Classic升级至标准版/高级版?
核心结论
Front Door Classic与标准版/高级版是Azure中完全独立的资源类型,无法通过Terraform直接"升级"现有资源,只能通过并行部署新资源+DNS流量切换的方式实现无停机迁移,同时避免门户升级后Terraform代码失效的问题。
针对你的疑问逐一解答
官方未提供Terraform操作方式?
是的,微软官方主要聚焦门户升级流程,但Terraform的标准做法是通过部署全新的azurerm_frontdoor_v2资源(对应标准版/高级版),再通过DNS切换完成迁移,这是目前最可靠的无停机方案。新建Front Door并行运行后切换是否可行?
完全可行。你可以同时运行两个Front Door实例:- 先部署新的标准版/高级版Front Door,完成自定义域名的所有权验证(通过添加TXT记录,不影响原解析)
- 然后通过DNS服务商逐步调整解析权重(比如先10%流量到新实例,观察稳定后逐步提升至100%),实现无停机切换
- 同一个自定义域名并非只能绑定一个Front Door,只要完成验证,切换解析即可指向新实例
是否需要门户升级再导入Terraform?
强烈不推荐。导入Terraform需要手动匹配大量资源属性(比如路由规则、后端池、WAF配置等),极易出现状态不一致问题;而且门户升级后,原azurerm_frontdoor资源代码完全无法适配新的v2资源,反而会增加工作量。门户升级后原Terraform代码会失效?
你的结论完全正确。Front Door Classic使用azurerm_frontdoor资源类型,而标准版/高级版使用azurerm_frontdoor_v2,两者的资源ID、属性结构、配置逻辑完全不同,原代码无法管理升级后的资源,必须重新编写v2对应的配置。
具体Terraform操作步骤
1. 迁移配置到v2资源块
复制原Classic的核心配置(前端主机、后端池、路由规则、健康检查等),转换为azurerm_frontdoor_v2的语法:
# 原Classic资源(后续将删除) resource "azurerm_frontdoor" "classic" { # 原配置... } # 新的标准版/高级版Front Door resource "azurerm_frontdoor_v2" "standard_premium" { name = "my-frontdoor-v2" resource_group_name = azurerm_resource_group.example.name sku_name = "Premium_AzureFrontDoor" # 或 "Standard_AzureFrontDoor" frontend_endpoint { name = "my-frontend-endpoint" host_name = "custom-domain.example.com" custom_host_name_enabled = true custom_https_provisioning_enabled = true custom_https_configuration { certificate_source = "AzureKeyVault" # 或 "FrontDoor" # 对应配置... } } backend_pool { name = "my-backend-pool" backend { address = "backend.example.com" http_port = 80 https_port = 443 priority = 1 weight = 100 } health_probe { path = "/health" protocol = "Https" interval_in_seconds = 30 } } routing_rule { name = "my-routing-rule" frontend_endpoints = [azurerm_frontdoor_v2.standard_premium.frontend_endpoint[0].name] accepted_protocols = ["Http", "Https"] patterns_to_match = ["/*"] route_type = "Forward" backend_pool_name = azurerm_frontdoor_v2.standard_premium.backend_pool[0].name } } # 输出新Front Door的VIP,用于DNS切换 output "frontdoor_v2_vip" { value = azurerm_frontdoor_v2.standard_premium.frontend_endpoint[0].host_name }
2. 部署新Front Door
运行terraform init和terraform apply,部署新的标准版/高级版实例,此时新旧两个Front Door同时运行,新实例的自定义域名已完成验证(等待TXT记录生效)。
3. 无停机DNS切换
通过DNS服务商调整自定义域名的解析记录:
- 先将部分流量(如10%)指向新Front Door的VIP
- 监控业务流量和错误率,确认稳定后逐步提升权重至100%
- 完全切换后,验证新实例的所有功能正常
4. 清理旧资源
确认流量完全切换后,删除Terraform代码中的azurerm_frontdoor资源块,运行terraform apply销毁旧的Classic实例,完成迁移。
内容的提问来源于stack exchange,提问作者Michele

