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

如何通过Terraform管理多Azure订阅并配置对应状态存储?

实现方案与配置修改说明

核心思路

要同时管理Azure订阅sub1和sub2,需通过多Provider实例区分不同订阅,先为sub2创建专属的tfstate存储资源(资源组、存储账户、容器),再按需在两个订阅中创建资源,可选择单配置跨订阅管理或双配置独立管理两种模式。


步骤1:修改现有providers.tf支持跨订阅

更新配置,添加sub2对应的Provider实例(用alias标识),同时保留sub1的默认Provider:

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = ">= 2.25"
    }
  }

  required_version = ">= 0.16.8"

  # 主backend仍指向sub1的存储,用于管理sub1资源及创建sub2的backend基础资源
  backend "azurerm" {
    resource_group_name  = "my.resource_group"
    storage_account_name = "my.storage_account_name"
    container_name       = "my.container_name"
    key                  = "my.terraform.tfstate"
  }
}

# 默认Provider:对应订阅sub1
provider "azurerm" {
  features {}
  # 可选:明确指定sub1的订阅ID,不指定则使用当前Azure CLI默认订阅
  # subscription_id = var.sub1_subscription_id
}

# 订阅sub2的Provider实例,用alias区分
provider "azurerm" {
  alias = "sub2"
  features {}
  # 必填:指定sub2的订阅ID,也可通过环境变量ARM_SUBSCRIPTION_ID_SUB2传递
  subscription_id = var.sub2_subscription_id
}

步骤2:创建sub2专属的tfstate存储资源

在现有配置中添加资源定义,使用azurerm.sub2 Provider创建sub2的backend资源(这些资源归属sub2):

# sub2中存放tfstate的资源组
resource "azurerm_resource_group" "sub2_tfstate_rg" {
  provider = azurerm.sub2
  name     = "sub2-tfstate-rg"
  location = "East US" # 按需替换为目标区域
}

# sub2中存储tfstate的存储账户(名称需全局唯一)
resource "azurerm_storage_account" "sub2_tfstate_sa" {
  provider                     = azurerm.sub2
  name                         = "sub2tfstatesa001"
  resource_group_name          = azurerm_resource_group.sub2_tfstate_rg.name
  location                     = azurerm_resource_group.sub2_tfstate_rg.location
  account_tier                 = "Standard"
  account_replication_type     = "GRS"
  allow_blob_public_access     = false
  minimum_tls_version          = "TLS1_2"
}

# sub2中存放tfstate的存储容器
resource "azurerm_storage_container" "sub2_tfstate_container" {
  provider                  = azurerm.sub2
  name                      = "tfstate"
  storage_account_name      = azurerm_storage_account.sub2_tfstate_sa.name
  container_access_type     = "private"
}

执行以下命令完成资源创建:

terraform init
terraform plan
terraform apply

步骤3:订阅资源管理模式选择

模式1:单配置跨订阅管理

在现有配置中,创建资源时通过provider字段指定所属订阅:

  • 创建sub1的资源:无需额外指定,默认使用azurerm Provider
  • 创建sub2的资源:添加provider = azurerm.sub2字段

示例:在sub2中创建虚拟机

resource "azurerm_virtual_machine" "sub2_vm" {
  provider = azurerm.sub2
  name                  = "sub2-demo-vm"
  resource_group_name   = azurerm_resource_group.sub2_tfstate_rg.name
  location              = azurerm_resource_group.sub2_tfstate_rg.location
  vm_size               = "Standard_D2s_v3"
  # 省略其他VM配置(如OS磁盘、网络接口等)
}

模式2:双配置独立管理(推荐)

新建独立的Terraform配置目录专门管理sub2资源,其providers.tf配置如下(tfstate存储在sub2专属的backend中):

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = ">= 2.25"
    }
  }

  required_version = ">= 0.16.8"

  # 指向sub2专属的backend存储
  backend "azurerm" {
    resource_group_name  = "sub2-tfstate-rg"
    storage_account_name = "sub2tfstatesa001"
    container_name       = "tfstate"
    key                  = "sub2.terraform.tfstate"
  }
}

# 默认Provider对应sub2
provider "azurerm" {
  features {}
  subscription_id = var.sub2_subscription_id
}

# 可选:若需在sub2配置中操作sub1资源,添加sub1的Provider实例
provider "azurerm" {
  alias = "sub1"
  features {}
  subscription_id = var.sub1_subscription_id
}

注意事项

  • 确保执行Terraform的账号对两个订阅均拥有足够权限(如Contributor或Owner)
  • 存储账户名称需全局唯一,创建时若报错需修改名称
  • 推荐通过变量传递订阅ID,避免硬编码,提升配置灵活性

内容的提问来源于stack exchange,提问作者Fr0zt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 00:42:46