在 terraform 中为应用程序服务创建自定义主机名绑定失败,并显示找不到具有名称的证书

Creating custom host name binding for app service in terraform fails with Cannot find Certificate with name

我正在尝试为 terraform 中的应用服务创建自定义主机名绑定,为此我使用了以下配置

resource "azurerm_app_service_custom_hostname_binding" "webapp_fqdn" {
  for_each = local.apsvc_fqdns_locations

  hostname            = each.value.fqdn
  app_service_name    = azurerm_app_service.webapp[each.value.apsvc_location_key].name
  resource_group_name = var.regional_web_rg[each.value.location].name

  ssl_state  = "SniEnabled"
  thumbprint = azurerm_app_service_certificate.cert[each.value.certificate_location_key].thumbprint
}

resource "azurerm_app_service_certificate" "cert" {
  for_each = local.certificates_locations

  name                = each.value.certificate_name
  resource_group_name = var.regional_web_rg[each.value.location].name
  location            = each.value.location
  key_vault_secret_id = data.azurerm_key_vault_secret.cert[each.value.certificate_name].id
}

代码失败(偶尔)并出现以下错误 “找不到名称为 6CAC9XXXX 的证书。” 发生错误时,我可以转到门户网站并查看以下内容 如果我通过 运行 以下

通过 Az PowerShell 模块创建这些资源
Set-AzWebApp -Name app508-resc-aa1-web-centralus-showcase-apsvc -ResourceGroupName app508-resc-aa1-web-centralus -HostNames @("showcase-aa1.np.dayforcehcm.com")
New-AzWebAppSSLBinding  -ResourceGroupName app508-resc-aa1-web-centralus  -WebAppName app508-resc-aa1-web-centralus-showcase-apsvc -Thumbprint "6CAC9XXXX" -Name "showcase-aa1.np.dayforcehcm.com"

它工作得很好并且资源创建正确。 看起来 terraform 试图通过使用一个资源来同时创建主机名和自定义主机名绑定 azurerm_app_service_custom_hostname_binding 那么这是我面临的某种竞争条件还是我使用了错误的资源?

好的,我发现这是 azurerm 提供商的问题。通常,WaitForCompletionRef 调用或等效函数(无论 Azure-go-SDK 提供什么)都会等待 create/update 函数完成。

azurerm_app_service_certificate资源的情况下,postcreate函数调用SDKresourceAppServiceCertificateRead函数被立即调用而不等待要创建的资源。我想这就是为什么你会间歇性地发生这种情况。

if _, err := client.CreateOrUpdate(ctx, id.ResourceGroup, id.Name, certificate); err != nil {
        return fmt.Errorf("creating/updating %s: %s", id, err)
    }

d.SetId(id.ID())

return resourceAppServiceCertificateRead(d, meta)

您可以创建问题 here or create a PR to get this added. In the meantime, as a workaround, you can put some sleep for a few seconds until the resource is created. time_sleep 可以帮到你。