如何在Terraform中引用现有Azure APIM的azurerm_api_management_logger?
解决Terraform引用现有APIM Logger ID的问题
由于Terraform AzureRM provider暂未提供azurerm_api_management_logger的数据源,要引用现有Logger的ID可以通过以下两种方式实现:
方法一:手动构造Logger资源ID
Azure资源ID遵循固定格式,APIM Logger的ID结构为:
/subscriptions/{subscription_id}/resourceGroups/{resource_group_name}/providers/Microsoft.ApiManagement/service/{apim_service_name}/loggers/{logger_name}
你可以将订阅ID、资源组、APIM服务名、现有Logger名称定义为变量,直接拼接出完整ID:
variable "subscription_id" { type = string description = "Azure订阅ID" } variable "resource_group_name" { type = string description = "APIM所在资源组名" } variable "apim_service_name" { type = string description = "APIM服务实例名称" } variable "existing_logger_name" { type = string description = "已存在的Logger名称" } resource "azurerm_api_management_api_diagnostic" "example" { name = "example-diagnostic" api_management_name = var.apim_service_name resource_group_name = var.resource_group_name api_name = "target-api" # 直接拼接现有Logger的ID logger_id = "/subscriptions/${var.subscription_id}/resourceGroups/${var.resource_group_name}/providers/Microsoft.ApiManagement/service/${var.apim_service_name}/loggers/${var.existing_logger_name}" # 其他诊断配置项(如日志级别、采样率等) log { enabled = true level = "Information" } }
这种方式无需额外依赖,简单可靠,是优先推荐的方案。
方法二:通过Azure CLI动态获取ID
如果无法提前确定Logger的名称或需要动态获取,可借助local-exec执行Azure CLI命令获取ID,再通过terraform_data存储结果:
variable "subscription_id" { type = string description = "Azure订阅ID" } variable "resource_group_name" { type = string description = "APIM所在资源组名" } variable "apim_service_name" { type = string description = "APIM服务实例名称" } variable "existing_logger_name" { type = string description = "已存在的Logger名称" } data "terraform_data" "existing_logger_id" { input = { sub_id = var.subscription_id rg_name = var.resource_group_name apim_name = var.apim_service_name logger = var.existing_logger_name } provisioner "local-exec" { command = <<EOT az account set --subscription ${self.input.sub_id} az rest --method get --uri "/subscriptions/${self.input.sub_id}/resourceGroups/${self.input.rg_name}/providers/Microsoft.ApiManagement/service/${self.input.apim_name}/loggers/${self.input.logger}?api-version=2023-03-01-preview" | jq -r '.id' EOT interpreter = ["bash", "-c"] } } resource "azurerm_api_management_api_diagnostic" "example" { name = "example-diagnostic" api_management_name = var.apim_service_name resource_group_name = var.resource_group_name api_name = "target-api" logger_id = data.terraform_data.existing_logger_id.output # 其他诊断配置项 log { enabled = true level = "Information" } }
注意:这种方式要求执行Terraform的环境已安装Azure CLI和jq工具,且当前用户拥有读取APIM Logger的权限。
内容的提问来源于stack exchange,提问作者hitman126
相关产品推荐
相关产品推荐

