You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 16:42:40