我正在使用 Terraform 管理 Azure APIM API。当我的底层应用服务发生更改时,我使用应用服务的 Swagger URL 更新相应的 APIM API 定义。
这是我的 TF 代码:
resource "azurerm_api_management_api" "apimapi" {
api_management_name = var.api_management_name
api_type = "http"
description = null
display_name = var.display_name
name = lower(var.display_name)
path = lower(var.display_name)
protocols = ["https"]
resource_group_name = var.resource_group_name
revision = "1"
revision_description = null
service_url = var.service_url
source_api_id = null
subscription_required = true
terms_of_service_url = null
version = null
version_description = null
version_set_id = null
subscription_key_parameter_names {
header = "Ocp-Apim-Subscription-Key"
query = "subscription-key"
}
import {
content_format = "openapi+json"
content_value = data.http.contracts.response_body
}
}
data "http" "contracts" {
url = "${var.service_url}swagger/v1/swagger.json"
request_headers = {
Accept = "application/json"
}
}
问题是,当/如果我从同一 API 手动删除任何操作或定义并再次运行我的 Terraform 代码时,理想情况下它应该检测到更改并针对已删除的操作和定义执行更新。
但是,我得到没有变化。您的基础设施与配置相匹配。 正在运行 terraform 计划。
这很奇怪,因为如果我手动更改任何其他属性,比如说 Azure 门户上的service_url,然后运行 terraform plan,它会检测到对状态文件的手动更改,并建议进行相同的更新。
那么为什么它没有检测到 API 操作和/或 API 定义的更改/删除?
Terraform 使用了 2 个文件: 1- TF 配置文件(包含资源的所需状态) 2- TF 状态文件(存储资源的实际状态,如 TF 配置文件中所述)
当您使用 Terraform 创建或更新资源时,当前的资源配置将保存在状态文件中。
Terraform 假设状态文件始终与实际资源配置匹配。并将任何可能的更改与状态文件进行比较。
因此,如果您手动进行任何更改(在 terraform 之外),它不会更改状态文件。所以对于 terraform,他永远不会知道资源发生了变化。
希望能澄清您的问题!