使用TF 0.12 / 13

时间:2020-10-02 09:43:22

标签: amazon-web-services terraform terraform-provider-aws

我们有一个相当复杂的环境,我们在多个区域拥有大量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采取强硬立场。

我要问的可能吗?

1 个答案:

答案 0 :(得分:0)

test(i)不能在其中定义了提供程序的模块上使用。我也很失望地发现了这一点。他们这样做是因为,如果嵌套提供者消失了,那么它确实会带来噩梦,那么您处于孤立状态的资源将无法管理,并且您的计划将失败。但是,在https://www.pulumi.com/中完全有可能。我已经厌倦了地形方面的限制,并且将转向普米。但这不是您要的,所以我继续。

绝对不要继续导入它。您最终将要在terraform的多个部分中管理同一资源。

每个区域只需创建一次cgw。然后将ID传递到您的vpc模块。您无法遍历提供程序,因此每个提供程序只有一个模块。换句话说,对于每个模块调用相同帐户和相同区域中的所有vpc。

for_each