Terraform AzureRM 使用默认终结点的代理配置不断修改 API 管理



我们正在改造我们的Azure API Management实例。

...
resource "azurerm_api_management" "apim" {
name                = "the-apim"
location            = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
...
hostname_configuration {
proxy {
host_name = "the-apim.azure-api.net"
negotiate_client_certificate = true
}
}
}
...

我们需要包含hostname_configuration块,以便我们可以将默认终结点的negotiate_client_certificate切换为 true。

这可以完成这项工作,但是每次 Terraform 运行时,它都计划通过再次添加hostname_configuration块来修改 APIM 实例:


+ hostname_configuration {
+ proxy {
+ host_name                    = "the-apim.azure-api.net"
+ negotiate_client_certificate = true
}
}

有没有办法防止这种情况发生?在门户中,我可以看到此值设置为 true。

我建议你尝试与lifecycle > ignore_changes配对。

ignore_changes功能旨在创建资源时使用,并引用将来可能会更改的数据,但在创建资源后不应影响该资源。在极少数情况下,远程对象的设置由 Terraform 外部的进程修改,然后 Terraform 会在下次运行时尝试"修复"。为了使 Terraform 与单独的进程共享单个对象的管理职责,ignore_changes元参数指定 Terraform 在规划对关联远程对象的更新时应忽略的资源属性。

在您的情况下,hostname_configuration在 Terraform 中被视为"嵌套块"或"属性作为块"。因此,ignore_changes的用法不是那么简单(您不能只添加属性名称,就像您想忽略resource_group_name中的更改一样,例如,直接是一个属性)。从 2018 年 GitHub 中的一个问题来看,您似乎可以使用嵌套块的 TypeSet 哈希添加到忽略部分。

即使我无法测试这一点,我也给你的建议:

  1. 使用hostname_configuration块正常部署azurerm_api_management资源
  2. 检查资源中的状态文件并获取hostname_configuration部分的排版哈希;应类似于hostname_configuration.XXXXXX
  3. 添加传递上述内容的ignore_changes部分
resource "azurerm_api_management" "apim" {
# ...
lifecycle {
ignore_changes = [
"hostname_configuration.XXXXXX",
]
}
}

有时由于提供程序中的问题而发生此类问题。可能它没有将配置存储在状态文件中,或者没有检索此块的存储状态。尝试将提供程序升级到最新的可用提供程序,并查看它是否对问题进行了排序。

如果这不能解决问题,您可以尝试将此配置定义为单独的资源。根据地形文档:https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/api_management

可以在 通过hostname_configurations块azurerm_api_management资源 以及使用azurerm_api_management_custom_domain资源。 但是,无法同时使用这两种方法来管理自定义域 在 API 管理服务中,因为会有冲突。

因此,请尝试删除该hostname_configuration块,并根据以下文档将其添加为单独的资源:https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/api_management_custom_domain

这很可能会解决问题。

最新更新