繁体   English   中英

Terraform AzureRM 不断修改 API 使用默认端点的代理配置进行管理

[英]Terraform AzureRM Continually Modifying API Management with Proxy Configuration for Default Endpoint

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

...
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 功能旨在在创建资源时使用对未来可能更改的数据的引用,但不应在创建后影响所述资源。 在极少数情况下,远程 object 的设置会被 Terraform 之外的进程修改,然后 Terraform 将尝试在下一次运行时“修复”。 为了使 Terraform 与单独的进程共享单个 object 的管理职责,ignore_changes 元参数指定资源属性,Terraform 在计划更新关联的远程 object 时应忽略这些资源属性。

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

尽管我无法对此进行测试,但我对您的建议是:

  1. 使用hostname_configuration块正常部署azurerm_api_management资源
  2. 从您的资源中检查 state 文件并获取hostname_configuration部分的排版 hash; 应该类似于hostname_configuration.XXXXXX
  3. 添加一个传递上述内容的ignore_changes部分
resource "azurerm_api_management" "apim" {
  # ...

  lifecycle {
    ignore_changes = [
      "hostname_configuration.XXXXXX",
    ]
  }
}

有时此类问题是由于提供程序中的问题而发生的。 可能它没有将配置存储在 state 文件中,或者没有为该块检索存储的 state。 尝试将提供程序升级到最新的可用提供程序,看看它是否能解决问题。

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

可以通过 hostname_configurations 块和使用 azurerm_api_management_custom_domain 资源在 azurerm_api_management 资源中定义自定义域。 但是,不可能在 API 管理服务中使用这两种方法来管理自定义域,因为会发生冲突。

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

这很可能会解决问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM