首页 > 解决方案 > Terraform - Azure - VNET 对等互连难题

问题描述

我有一点鸡和蛋的问题。想象一下多个订阅,每个订阅都有自己的 VNet。我需要通过一个同样在自己订阅中的集线器来对等这些。问题是我为每个订阅使用单独的状态文件。

问题:我没有一个 Terraform 文件来构建整个环境。我为每个订阅运行一个应用程序。这意味着我需要运行它两次。一次用于每个订阅的站立以使 VNet 就位,然后在将模块/资源添加到对等文件后再次用于 VNet 对等。

这可能会导致很多问题。特别是如果我运行销毁/重新应用。

有没有更好的方法来做到这一点?如果它是整个环境的一个文件,Terraform 将确保 VNet 在那里,或者我可以使用“depends_on”属性。但是,我这样做的方式可能会破坏一切。

想法:

谢谢!

标签: azureterraformterraform-provider-azure

解决方案


如果您已在每个订阅中部署了每个 VNet,我认为您可以执行两步过程:一次运行设置订阅/Vnet,然后在第二次进行对等互连。terraform 对等配置将像这样alias用于您将引用的一个特定订阅,data用于查询每个订阅中的现有资源。确保您使用的服务主体对两个订阅都具有权限,或者为每个提供程序块使用不同的服务主体(具有关联的权限)。

例如,

provider "azurerm" {
  version         = "xxx"
  tenant_id       = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
  subscription_id = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
  client_id       = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
  client_secret   = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
  alias           = "dev"
}

provider "azurerm" {
  version         = "xxx"
  tenant_id       = "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb"
  subscription_id = "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb"
  client_id       = "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb"
  client_secret   = "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb"
  alias           = "test"
}

data "azurerm_virtual_network" "dev" {
  name                = "dev-network"
  resource_group_name = "dev-network-rg"
  provider            = "azurerm.dev"
}

data "azurerm_virtual_network" "test" {
  name                = "test-network"
  resource_group_name = "test-network-rg"
  provider            = "azurerm.test"
}

resource "azurerm_virtual_network_peering" "dev-to-test" {
  name                         = "dev-to-test"
  resource_group_name          = "${data.azurerm_virtual_network.test.resource_group_name}"
  virtual_network_name         = "${data.azurerm_virtual_network.test.name}"
  remote_virtual_network_id    = "${data.azurerm_virtual_network.test.id}"
  allow_virtual_network_access = true
  allow_forwarded_traffic      = true
  provider                     = "azurerm.dev"
}

resource "azurerm_virtual_network_peering" "test-to-dev" {
  name                         = "test-to-dev"
  resource_group_name          = "${data.azurerm_virtual_network.dev.resource_group_name}"
  virtual_network_name         = "${data.azurerm_virtual_network.dev.name}"
  remote_virtual_network_id    = "${data.azurerm_virtual_network.dev.id}"
  allow_virtual_network_access = true
  allow_forwarded_traffic      = true
  provider                     = "azurerm.test"
} 

如果您使用的是 Azure CLI 身份验证,则可以参考.

或者,如您所想,您可以尝试depends_on在块中使用属性,azurerm_virtual_network_peering请参阅此示例

resource "azurerm_virtual_network" "spoke1-vnet" {
  provider            = "azurerm.dev"
  name                = "spoke1-vnet"
  location            = azurerm_resource_group.spoke1-vnet-rg.location
  resource_group_name = azurerm_resource_group.spoke1-vnet-rg.name
  address_space       = ["10.1.0.0/16"]

}
resource "azurerm_virtual_network_peering" "spoke1-hub-peer" {
  provider                  = "azurerm.dev"
  name                      = "spoke1-hub-peer"
  resource_group_name       = azurerm_resource_group.spoke1-vnet-rg.name
  virtual_network_name      = azurerm_virtual_network.spoke1-vnet.name
  remote_virtual_network_id = azurerm_virtual_network.hub-vnet.id

  allow_virtual_network_access = true
  allow_forwarded_traffic = true
  allow_gateway_transit   = false
  use_remote_gateways     = true
  depends_on = ["azurerm_virtual_network.spoke1-vnet", "azurerm_virtual_network.hub-vnet" , "azurerm_virtual_network_gateway.hub-vnet-gateway"]
}

有关更多信息,您可以参考此blog1blog2以使用 terraform 部署到多个订阅。


推荐阅读