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

Ale*_*der 5 terraform azure-web-app-service

我正在尝试为 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
}
Run Code Online (Sandbox Code Playgroud)

代码失败(偶尔),并显示以下错误“找不到名称为 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"
Run Code Online (Sandbox Code Playgroud)

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

har*_*vmb 3

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

对于资源的情况azurerm_app_service_certificate,后create函数调用SDK,会立即调用该resourceAppServiceCertificateRead函数,而无需等待资源创建。我认为这就是为什么你会间歇性地发生这种情况。

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)
Run Code Online (Sandbox Code Playgroud)

您可以在此处创建问题或创建 PR 来添加此内容。同时,作为解决方法,您可以将一些时间放置sleep几秒钟,直到创建资源。time_sleep 可以帮助你。