Terraform - Azure - VNET 对等难题
Terraform - Azure - VNET Peering Conundrum
我遇到了先有鸡还是先有蛋的问题。想象一下多个订阅,每个订阅都有自己的 VNet。我需要通过一个也在其自己的订阅中的集线器对等所有这些。问题是我为每个订阅使用了单独的状态文件。
问题:我没有一个 Terraform 文件来构建整个环境。我 运行 申请每个订阅。这意味着我需要 运行 两次。一次用于每个订阅的站会以获取 VNet,然后在将 module/resource 添加到文件以进行对等后再次用于 VNet 对等。
这可能会导致很多问题。特别是如果我 运行 一个 destroy/re-apply。
有更好的方法吗?如果它是整个环境的一个文件,Terraform 将确保 VNet 在那里,或者我可以使用 'depends_on' 属性。但是,我这样做的方式可能会破坏一切。
想法:
- 在 Terraform 外部进行对等互连
- 使用单独的 Terraform 状态文件进行对等 - 可能是一个非常糟糕的主意
- 做一个两步过程;设置 subscription/Vnet 一次 运行 并在一秒钟内进行对等 - 可能不会很好地工作
- 我缺少的东西。
谢谢!
如果您在每个订阅中都部署了每个 VNet,我认为您可以执行一个两步过程:一次 运行 设置 subscription/Vnet 并在一秒钟内进行对等互连。 terraform 对等配置将喜欢 this,对您将引用的一个特定订阅使用 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 auth,可以参考this。
或者,如您所想,您可以尝试在 azurerm_virtual_network_peering
块中使用 depends_on
属性,请参阅 this example。
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"]
}
我遇到了先有鸡还是先有蛋的问题。想象一下多个订阅,每个订阅都有自己的 VNet。我需要通过一个也在其自己的订阅中的集线器对等所有这些。问题是我为每个订阅使用了单独的状态文件。
问题:我没有一个 Terraform 文件来构建整个环境。我 运行 申请每个订阅。这意味着我需要 运行 两次。一次用于每个订阅的站会以获取 VNet,然后在将 module/resource 添加到文件以进行对等后再次用于 VNet 对等。
这可能会导致很多问题。特别是如果我 运行 一个 destroy/re-apply。
有更好的方法吗?如果它是整个环境的一个文件,Terraform 将确保 VNet 在那里,或者我可以使用 'depends_on' 属性。但是,我这样做的方式可能会破坏一切。
想法:
- 在 Terraform 外部进行对等互连
- 使用单独的 Terraform 状态文件进行对等 - 可能是一个非常糟糕的主意
- 做一个两步过程;设置 subscription/Vnet 一次 运行 并在一秒钟内进行对等 - 可能不会很好地工作
- 我缺少的东西。
谢谢!
如果您在每个订阅中都部署了每个 VNet,我认为您可以执行一个两步过程:一次 运行 设置 subscription/Vnet 并在一秒钟内进行对等互连。 terraform 对等配置将喜欢 this,对您将引用的一个特定订阅使用 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 auth,可以参考this。
或者,如您所想,您可以尝试在 azurerm_virtual_network_peering
块中使用 depends_on
属性,请参阅 this example。
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"]
}