在 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
函数调用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)
您可以创建问题 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
可以帮到你。
我正在尝试为 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 的证书。”
发生错误时,我可以转到门户网站并查看以下内容
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
函数调用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)
您可以创建问题 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
可以帮到你。