Terraform使用for_each创建Azure应用服务证书绑定出现重复如何解决?
问题解决方案
你遇到的重复/报错问题核心是多实例资源未对齐for_each配置,直接引用多实例集合的全局属性会导致匹配逻辑错误,修正后的配置如下:
// custom hostname binding resource "azurerm_app_service_custom_hostname_binding" "service_host_bind" { for_each = azurerm_dns_cname_record.cname_target hostname = trim(each.value.fqdn, ".") app_service_name = azurerm_app_service._service.name resource_group_name = azurerm_resource_group._rg.name depends_on = [azurerm_dns_txt_record._txt_target] lifecycle { ignore_changes = [ssl_state, thumbprint] } } // app service managed certificate resource "azurerm_app_service_managed_certificate" "_service_manage_cert" { for_each = azurerm_app_service_custom_hostname_binding.service_host_bind custom_hostname_binding_id = each.value.id } // app service certificate binding resource "azurerm_app_service_certificate_binding" "xtrm_service_certi_bind" { for_each = azurerm_app_service_custom_hostname_binding.service_host_bind hostname_binding_id = each.value.id certificate_id = azurerm_app_service_managed_certificate._service_manage_cert[each.key].id ssl_state = "SniEnabled" }
配置逻辑说明
- 前两个资源天然保持key对齐:托管证书的for_each直接继承自hostname绑定资源集合,二者同key的实例对应同一个跳转域名
- 证书绑定资源复用hostname绑定的集合作为for_each源,保证每个证书绑定实例对应同一个域名的绑定+证书组合
- 通过
each.key索引托管证书集合,即可拿到当前实例对应域名的证书ID,实现三类资源一一对应,不会出现重复创建或匹配错误的问题
注意事项
请确保最上游的azurerm_dns_cname_record.cname_target的for_each使用稳定的唯一键(建议直接用域名作为key,不要用列表索引),避免后续增减域名时出现资源误删的问题。
内容的提问来源于stack exchange,提问作者dpa456
相关产品推荐
相关产品推荐

