Terraform创建APIM多GET操作后Azure门户不显示问题求助
问题描述
已通过Terraform创建Azure资源组、APIM实例、HealthCheck API及其GET操作。尝试创建第二个GET API操作(testData)时,Terraform计划与执行均显示成功,状态文件也有相应变更,但Azure门户中该操作未出现在HealthCheck API下。请问如何成功创建多个GET操作?
现有Terraform代码
资源组
resource "azurerm_resource_group" "testrg" { name = "test-resources" location = "eastus2" }
APIM实例
resource "azurerm_api_management" "testApim" { name = "test-apim" location = azurerm_resource_group.testrg.location resource_group_name = azurerm_resource_group.testrg.name publisher_name = "My Company" publisher_email = "company@terraform.io" sku_name = "Developer_1" }
HealthCheck API
resource "azurerm_api_management_api" "testApi" { name = "test-api" resource_group_name = azurerm_resource_group.testrg.name api_management_name = azurerm_api_management.testApim.name revision = "1" display_name = "HealthCheck" service_url = "<url>" protocols = ["https"] }
第一个GET操作(HealthCheck)
resource "azurerm_api_management_api_operation" "healthcheck" { operation_id = "get" api_name = data.azurerm_api_management_api.testApi.name api_management_name = data.azurerm_api_management_api.testApim.api_management_name resource_group_name = data.azurerm_api_management_api.testrg.resource_group_name display_name = "HealthCheck" method = "GET" url_template = "/Healthcheck" response { status_code = 200 } }
尝试创建的第二个GET操作(testData)
resource "azurerm_api_management_api_operation" "testData" { operation_id = "get" api_name = data.azurerm_api_management_api.testApi.name api_management_name = data.azurerm_api_management_api.testApim.api_management_name resource_group_name = data.azurerm_api_management_api.testrg.resource_group_name display_name = "Testdata" method = "GET" url_template = "/Testdata" response { status_code = 200 } }
问题原因及解决方法
1. 错误引用数据源而非资源
操作代码中错误使用data.azurerm_api_management_api来引用API、APIM实例和资源组,但这些都是当前配置中通过resource块创建的资源,应直接引用资源属性,而非数据源。数据源data用于读取已存在的外部资源,不适合引用当前Terraform正在管理的资源。
2. 重复的operation_id
两个操作的operation_id均设为"get",而operation_id是API下操作的唯一标识,重复ID会导致第二个操作无法正确创建或覆盖第一个操作,这是Azure门户中看不到第二个操作的核心原因。
修正后的代码
第一个GET操作(HealthCheck)
resource "azurerm_api_management_api_operation" "healthcheck" { operation_id = "healthcheck-get" # 设置唯一操作ID api_name = azurerm_api_management_api.testApi.name api_management_name = azurerm_api_management.testApim.name resource_group_name = azurerm_resource_group.testrg.name display_name = "HealthCheck" method = "GET" url_template = "/Healthcheck" response { status_code = 200 } }
第二个GET操作(testData)
resource "azurerm_api_management_api_operation" "testData" { operation_id = "testdata-get" # 设置唯一操作ID api_name = azurerm_api_management_api.testApi.name api_management_name = azurerm_api_management.testApim.name resource_group_name = azurerm_resource_group.testrg.name display_name = "Testdata" method = "GET" url_template = "/Testdata" response { status_code = 200 } }
验证步骤
- 执行
terraform plan确认变更,确保两个操作都被识别为新增资源。 - 执行
terraform apply完成部署。 - 登录Azure门户进入APIM实例的HealthCheck API页面,刷新后即可看到两个GET操作。
内容的提问来源于stack exchange,提问作者Asterix
相关产品推荐
相关产品推荐

