我们有一个相当复杂的环境,我们在多个区域拥有大量AWS账户,这些账户都通过VPN隧道连接到传输网络。
目前,我们通过“ VPC”模块为区域中的每个VPC部署客户网关,但是我们遇到的问题是,部署第一个VPC很好,但是随后的VPC部署会导致问题,因为CGW已经存在在那里,因此我们必须先导入它,然后再继续操作,这不是一个理想的位置,而且我认为,如果拆除VPC,它可能会试图杀死其他VPN所使用的CGW,这存在风险
我要做的是将CGW与VPC分开部署,然后VPC为CGW进行数据查找。
我一直在想,也许我们可以使用“基本”作业来配置在变量文件中定义的CGW,但到目前为止我没有尝试过。
变量定义为:
variable "region_data" {
type = list(object({
region = string
deploy_cgw = bool
gateways = any
}))
default = [
{
region = "eu-west-1"
deploy_cgw = true
gateways = [
{
name = "gateway1"
ip = "1.2.3.4"
},
{
name = "gateway2"
ip = "2.3.4.5"
}
]
},
{
region = "us-east-1"
deploy_cgw = true
gateways = [
{
name = "gateway1"
ip = "2.3.4.5"
},
{
name = "gateway2"
ip = "3.4.5.6"
}
]
}
]
}
我尝试了一些事情,例如:
locals {
regions = [for region in var.region_data : region if region.deploy_cgw]
cgws = flatten([
for region in local.regions : [
for gateway in region.gateways : {
region = region.region
name = gateway.name
ip = gateway.ip
}
]
])
}
provider "aws" {
region = "eu-west-1"
alias = "eu-west-1"
}
provider "aws" {
region = "us-east-1"
alias = "us-east-1"
}
module "cgw" {
source = "../../../modules/customer-gateway"
for_each = { for cgw in local.cgws: "${cgw.region}.${cgw.name}" => cgw }
name_tag = each.value.name
ip_address = each.value.ip
providers = {
aws = "aws.${each.value.region}"
}
}
但是有了这个我得到:
Error: Invalid provider configuration reference
on main.tf line 439, in module "cgw":
439: aws = "aws.${each.value.region}"
A provider configuration reference must not be given in quotes.
如果将AWS提供程序移动到模块中并将区域作为参数传递,则会得到以下信息:
Error: Module does not support for_each
on main.tf line 423, in module "cgw":
423: for_each = { for cgw in local.testing : "${cgw.region}.${cgw.name}" => cgw }
Module "cgw" cannot be used with for_each because it contains a nested
provider configuration for "aws", at
我已经做了很多研究,而我所了解的最后一项是Terraform采取强硬立场。
我要问的可能吗?
答案 0 :(得分:0)
test(i)
不能在其中定义了提供程序的模块上使用。我也很失望地发现了这一点。他们这样做是因为,如果嵌套提供者消失了,那么它确实会带来噩梦,那么您处于孤立状态的资源将无法管理,并且您的计划将失败。但是,在https://www.pulumi.com/中完全有可能。我已经厌倦了地形方面的限制,并且将转向普米。但这不是您要的,所以我继续。
绝对不要继续导入它。您最终将要在terraform的多个部分中管理同一资源。
每个区域只需创建一次cgw。然后将ID传递到您的vpc模块。您无法遍历提供程序,因此每个提供程序只有一个模块。换句话说,对于每个模块调用相同帐户和相同区域中的所有vpc。
for_each