我正在使用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 Portal上的service_url,然后运行terraform计划,它会检测到状态文件的手动更改,并建议进行更新。
那么,为什么它没有检测到API操作和/或API定义的更改/删除?
1条答案
按热度按时间wsxa1bj11#
这种行为是正常的,这就是Terraform的工作方式。
Terraform使用了2个文件:1- TF配置文件(包含所需的资源状态)2- TF状态文件(存储资源的实际状态,如TF配置文件中所述)
当您使用Terraform创建或更新资源时,当前资源配置保存在状态文件中。
Terraform假设状态文件总是与实际的资源配置相匹配,并将任何可能的更改与状态文件进行比较。
所以,如果你手动进行任何更改(在terraform之外),它不会更改状态文件。所以对于terraform,他永远不会知道资源发生了变化。
希望澄清你的问题!