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

如何通过Terraform用最少代码在20个Azure订阅部署资源组?

多订阅部署Azure资源组的极简Terraform实现

不用写20个provider块,用Terraform的动态provider配置就能搞定,核心思路是基于订阅ID动态生成provider,让资源组自动关联对应订阅的provider,具体步骤如下:

1. 调整变量结构(确保每个资源组绑定对应订阅)

首先修改你的变量,让每个资源组条目包含对应的订阅ID,示例变量定义:

variable "network_services_rgs" {
  type = map(object({
    subs     = string  # 对应你原变量里的subs字段
    location = string
    tags     = optional(map(string))
  }))
  description = "每个条目对应一个要创建的资源组,包含所属订阅ID、区域、可选标签"
}

变量的实际值示例:

network_services_rgs = {
  "rg-dev-eastus" = {
    subs     = "xxxx-xxxx-xxxx-xxxx"  # 订阅ID1
    location = "eastus"
    tags     = { Environment = "Dev" }
  },
  "rg-prod-westus" = {
    subs     = "yyyy-yyyy-yyyy-yyyy"  # 订阅ID2
    location = "westus"
  }
  # 剩下18个资源组条目以此类推
}

2. 动态生成Azure Provider(自动对应所有订阅)

通过本地值提取唯一订阅ID,再用for_each动态创建provider,避免重复配置同一订阅:

# 提取所有不重复的订阅ID
locals {
  unique_subs = distinct([for rg in var.network_services_rgs : rg.subs])
}

# 动态创建每个订阅对应的provider
provider "azurerm" {
  for_each        = toset(local.unique_subs)
  alias           = each.value  # 用订阅ID作为provider别名,确保唯一
  subscription_id = each.value
  # 如果所有订阅属于同一租户,可统一配置tenant_id:
  # tenant_id = var.tenant_id
}

3. 关联资源组到对应订阅的Provider

修改资源组资源,让每个资源组自动绑定到所属订阅的provider:

resource "azurerm_resource_group" "rg" {
  for_each          = var.network_services_rgs
  provider          = azurerm[each.value.subs]  # 关联到对应订阅的provider
  name              = each.key
  location          = each.value.location
  tags              = lookup(each.value, "tags", {})
}

关键说明

  • 权限:确保执行Terraform的身份(Azure CLI登录账号/服务主体)拥有所有目标订阅的资源组创建权限
  • 去重逻辑:distinct函数会自动过滤重复的订阅ID,同一订阅下的多个资源组会共用同一个provider,无需重复配置
  • 兼容性:该方案需要Terraform 0.13及以上版本,因为0.13才支持provider的for_each配置

内容的提问来源于stack exchange,提问作者Rajnish Kumar Soni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 00:20:16