在同一 Terraform 模块块中引用两个 Azure 订阅?

Reference two Azure subscriptions within the same terraform module block?

我目前正在使用 terraform 部署 azure 资源,并希望指向与部署 vnet 不同的订阅中的 DDOS 保护计划。代码如下:

resource "azurerm_virtual_network" "example" {
  for_each = var.virtual_networks

  name                = each.value.vnet_name
  location            = each.value.vnet_location
  resource_group_name = data.azurerm_resource_group.this[each.value.resource_group_key].name

  address_space = each.value.vnet_address_space
  tags          = each.value.vnet_tags

  ddos_protection_plan {
    id     = each.value.ddos_protection_plan_id
    enable = true
  }
}

我已经使用 azure 提供程序引用了其他订阅,以获取整个块将存在于新订阅中的资源。 https://samcogan.com/deploying-to-multiple-azure-subscriptions-with-terraform/

但是 运行 在引用块中的(子?)资源的另一个订阅时遇到麻烦。

TLDR:想在一个子中部署 VNET,在另一个子中参考 ddos​​ 保护计划。可能吗?

是的,您可以在一个子中部署 VNET,在另一个子中参考 ddos​​ 保护计划。您正在遵循正确的文档。抱歉,我无法在我的环境中进行测试,因为我没有其他订阅。

为了允许我们使用另一个订阅,我们将在您将创建 VNET 的同一文件中定义第二个 AzureRM 提供程序。

provider "azurerm" {
  alias           = "core"
  subscription_id = "xxxx-xxxx-xxxx"
} 

之后,您可以将 datasoruce 用于您在另一个订阅中创建的 DDOS_Protection_Plan,如下所示

data "azurerm_network_ddos_protection_plan" "example" {
  provider            = "azurerm.core"
  name                = azurerm_network_ddos_protection_plan.example.name
  resource_group_name = azurerm_network_ddos_protection_plan.example.resource_group_name
}

然后休息你的代码将看起来像这样用 DDOS 引用 Vnet。

resource "azurerm_virtual_network" "example" {
  for_each = var.virtual_networks

  name                = each.value.vnet_name
  location            = each.value.vnet_location
  resource_group_name = data.azurerm_resource_group.this[each.value.resource_group_key].name

  address_space = each.value.vnet_address_space
  tags          = each.value.vnet_tags

  ddos_protection_plan {
    id     = data.azurerm_network_ddos_protection_plan.example.id
    enable = true
  }
}