我们正在改造我们的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 哈希添加到忽略部分。
即使我无法测试这一点,我也给你的建议:
- 使用
hostname_configuration
块正常部署azurerm_api_management
资源 - 检查资源中的状态文件并获取
hostname_configuration
部分的排版哈希;应类似于hostname_configuration.XXXXXX
- 添加传递上述内容的
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
这很可能会解决问题。