【问题标题】:Terraform create map/dict from TG route table and TG attachment vpns to reference in resource aws_ec2_transit_gateway_route_table_associationTerraform 从 TG 路由表和 TG 附件 vpns 创建 map/dict 以在资源 aws_ec2_transit_gateway_route_table_association 中引用
【发布时间】:2021-05-22 17:18:39
【问题描述】:

添加类似 Python 的伪代码来解释我想通过 Terraform 实现的目标。

我有 6 个中转网关路由表、10 个中转网关 VPN 附件 我需要这个来传输网关路由表关联和传播

尝试创建可以在资源函数 aws_ec2_transit_gateway_route_table_association 中引用的本地“map/dict” 资源函数需要transit_gateway_attachment_id和transit_gateway_route_table_id

tg_rt = [
  {
    "name" = "A"
    "tg_rt_id" = "tgw-rtb-aa"
  },
  {
    "name" = "B"
    "tg_rt_id" = "tgw-rtb-bb"
  },
  {
    "name" = "C"
    "tg_rt_id" = "tgw-rtb-cc"
  },
  {
    "name" = "D"
    "tg_rt_id" = "tgw-rtb-dd"
  },
  {
    "name" = "E"
    "tg_rt_id" = "tgw-rtb-ee"
  },
{
    "name" = "F"
    "tg_rt_id" = "tgw-rtb-ff"
  },
]
tga_vpn = [
  {
    "name" = "1"
    "tga_id" = "tgw-attach-11"
  },
  {
    "name" = "2"
    "tga_id" = "tgw-attach-22"
  },
  {
    "name" = "3"
    "tga_id" = "tgw-attach-33"
  },
  {
    "name" = "4"
    "tga_id" = "tgw-attach-44"
  },
  {
    "name" = "5"
    "tga_id" = "tgw-attach-55"
  },
  {
    "name" = "6"
    "tga_id" = "tgw-attach-66"
  },
  {
    "name" = "7"
    "tga_id" = "tgw-attach-77"
  },
  {
    "name" = "8"
    "tga_id" = "tgw-attach-88"
  },
]
  for tgw_rt in tgw_rts:  # list of dicts with id and name 
    for tga_vpn in tga_vpns: # # list of dict with id and name 
      if tgw_rt.name == "PROD" and tga_vpn.name in [1, 2, 3, 4]:
        rt_id = tgw_rt.id
        vpn_attachment_id = tga_vpn.id
      elif tgw_rt.name == "DEV" and tga_vpn.name in [5, 6, 7, 8]:
        rt_id = tgw_rt.id
        vpn_attachment_id = tga_vpn.id
      elif tgw_rt.name == "STAGING" and tga_vpn.name in [9, 10, 11, 12]:
        rt_id = tgw_rt.id
        vpn_attachment_id = tga_vpn.id
resource "aws_ec2_transit_gateway_route_table_association" "TGW-RT-VPN-ASSOCIATION" {
  
  for_each = {
    for tg_vpn_attach, tg_vpn_attach_details in local.above_map : tg_vpn_attach => tg_vpn_attach_details
  }
  transit_gateway_route_table_id      = each.rt_id # for reference
  transit_gateway_attachment_id     = each.vpn_attachment_id # for reference 
}

我再次部署了一个 TGW,其中包含六个路由表/路由以及几种 VPC 和 VPN 连接类型,并希望根据上述逻辑格式创建正确的关联/传播。

如果有任何问题,请告诉我,我们将不胜感激。

谢谢!

【问题讨论】:

  • 最好的答案会像以前一样。将其拆分为多个资源。为什么不使用之前建议的方法?
  • @Marcin 有很多路由表6个,会有vpc关联,vpc传播和vpn关联,vpn传播的声明。
  • @Marcin 这将使它成为 24 个资源语句,这就是为什么我试图创建一个带有关联的映射,这样就会有 4 个语句 vpc 关联、vpc 传播和 vpn 关联以及 vpn 传播,路由是从循环中的同一资源创建的,所以我不能在资源 aws_ec2_transit_gateway_route_table_association 中有两个 for_each(vpn 附件 ID 和路由表 ID)正确吗?
  • 顺便说一句。我注意到你以前的所有答案都有答案。您甚至在其中写下“这对您很有帮助。非常感谢!”,但没有接受任何答案。接受有用的答案是一种很好的做法,可以帮助其他读者。

标签: amazon-web-services terraform


【解决方案1】:

您的tga_vpn 中没有[9, 10, 11, 12],所以我将只关注proddev

假设我正确理解您想要的结果,您应该能够构建您的数据结构,如下所示:

variable "tg_rt" {

  default = [
    {
      "name" = "A"
      "tg_rt_id" = "tgw-rtb-aa"
    },
    {
      "name" = "B"
      "tg_rt_id" = "tgw-rtb-bb"
    },
    {
      "name" = "C"
      "tg_rt_id" = "tgw-rtb-cc"
    },
    {
      "name" = "D"
      "tg_rt_id" = "tgw-rtb-dd"
    },
    {
      "name" = "E"
      "tg_rt_id" = "tgw-rtb-ee"
    },
  {
      "name" = "F"
      "tg_rt_id" = "tgw-rtb-ff"
    },
  ]

}
variable "tga_vpn" {

  default =  [
    {
      "name" = "1"
      "tga_id" = "tgw-attach-11"
    },
    {
      "name" = "2"
      "tga_id" = "tgw-attach-22"
    },
    {
      "name" = "3"
      "tga_id" = "tgw-attach-33"
    },
    {
      "name" = "4"
      "tga_id" = "tgw-attach-44"
    },
    {
      "name" = "5"
      "tga_id" = "tgw-attach-55"
    },
    {
      "name" = "6"
      "tga_id" = "tgw-attach-66"
    },
    {
      "name" = "7"
      "tga_id" = "tgw-attach-77"
    },
    {
      "name" = "8"
      "tga_id" = "tgw-attach-88"
    },
  ]  
}

locals {

  prod = merge(flatten([ for idx1, tgw_rt in var.tg_rt:
           {
              for idx2, tga_vpn in var.tga_vpn:
               "${tgw_rt.tg_rt_id}-${ tga_vpn.tga_id}" => 
                      { rt_id = tgw_rt.tg_rt_id
                        vpn_attachment_id = tga_vpn.tga_id
                      } if contains(["1", "2", "3", "4"], tga_vpn.name)
                         
            }    
      ])...)
      
   dev = merge(flatten([ for idx1, tgw_rt in var.tg_rt:
           {
              for idx2, tga_vpn in var.tga_vpn:
               "${tgw_rt.tg_rt_id}-${ tga_vpn.tga_id}" => 
                      { rt_id = tgw_rt.tg_rt_id
                        vpn_attachment_id = tga_vpn.tga_id
                      } if contains(["5", "6", "7", "8"], tga_vpn.name)
                         
            }    
      ])...) 
      
   prod_dev_map = {
     prod = local.prod
     dev  = local.dev
   }
       
}

output "prod" {
  value = local.prod_dev_map
}

这将导致prod_dev_map 成为:

{
  "dev" = {
    "tgw-rtb-aa-tgw-attach-55" = {
      "rt_id" = "tgw-rtb-aa"
      "vpn_attachment_id" = "tgw-attach-55"
    }
    "tgw-rtb-aa-tgw-attach-66" = {
      "rt_id" = "tgw-rtb-aa"
      "vpn_attachment_id" = "tgw-attach-66"
    }
    "tgw-rtb-aa-tgw-attach-77" = {
      "rt_id" = "tgw-rtb-aa"
      "vpn_attachment_id" = "tgw-attach-77"
    }
    "tgw-rtb-aa-tgw-attach-88" = {
      "rt_id" = "tgw-rtb-aa"
      "vpn_attachment_id" = "tgw-attach-88"
    }
    "tgw-rtb-bb-tgw-attach-55" = {
      "rt_id" = "tgw-rtb-bb"
      "vpn_attachment_id" = "tgw-attach-55"
    }
    "tgw-rtb-bb-tgw-attach-66" = {
      "rt_id" = "tgw-rtb-bb"
      "vpn_attachment_id" = "tgw-attach-66"
    }
    "tgw-rtb-bb-tgw-attach-77" = {
      "rt_id" = "tgw-rtb-bb"
      "vpn_attachment_id" = "tgw-attach-77"
    }
    "tgw-rtb-bb-tgw-attach-88" = {
      "rt_id" = "tgw-rtb-bb"
      "vpn_attachment_id" = "tgw-attach-88"
    }
    "tgw-rtb-cc-tgw-attach-55" = {
      "rt_id" = "tgw-rtb-cc"
      "vpn_attachment_id" = "tgw-attach-55"
    }
    "tgw-rtb-cc-tgw-attach-66" = {
      "rt_id" = "tgw-rtb-cc"
      "vpn_attachment_id" = "tgw-attach-66"
    }
    "tgw-rtb-cc-tgw-attach-77" = {
      "rt_id" = "tgw-rtb-cc"
      "vpn_attachment_id" = "tgw-attach-77"
    }
    "tgw-rtb-cc-tgw-attach-88" = {
      "rt_id" = "tgw-rtb-cc"
      "vpn_attachment_id" = "tgw-attach-88"
    }
    "tgw-rtb-dd-tgw-attach-55" = {
      "rt_id" = "tgw-rtb-dd"
      "vpn_attachment_id" = "tgw-attach-55"
    }
    "tgw-rtb-dd-tgw-attach-66" = {
      "rt_id" = "tgw-rtb-dd"
      "vpn_attachment_id" = "tgw-attach-66"
    }
    "tgw-rtb-dd-tgw-attach-77" = {
      "rt_id" = "tgw-rtb-dd"
      "vpn_attachment_id" = "tgw-attach-77"
    }
    "tgw-rtb-dd-tgw-attach-88" = {
      "rt_id" = "tgw-rtb-dd"
      "vpn_attachment_id" = "tgw-attach-88"
    }
    "tgw-rtb-ee-tgw-attach-55" = {
      "rt_id" = "tgw-rtb-ee"
      "vpn_attachment_id" = "tgw-attach-55"
    }
    "tgw-rtb-ee-tgw-attach-66" = {
      "rt_id" = "tgw-rtb-ee"
      "vpn_attachment_id" = "tgw-attach-66"
    }
    "tgw-rtb-ee-tgw-attach-77" = {
      "rt_id" = "tgw-rtb-ee"
      "vpn_attachment_id" = "tgw-attach-77"
    }
    "tgw-rtb-ee-tgw-attach-88" = {
      "rt_id" = "tgw-rtb-ee"
      "vpn_attachment_id" = "tgw-attach-88"
    }
    "tgw-rtb-ff-tgw-attach-55" = {
      "rt_id" = "tgw-rtb-ff"
      "vpn_attachment_id" = "tgw-attach-55"
    }
    "tgw-rtb-ff-tgw-attach-66" = {
      "rt_id" = "tgw-rtb-ff"
      "vpn_attachment_id" = "tgw-attach-66"
    }
    "tgw-rtb-ff-tgw-attach-77" = {
      "rt_id" = "tgw-rtb-ff"
      "vpn_attachment_id" = "tgw-attach-77"
    }
    "tgw-rtb-ff-tgw-attach-88" = {
      "rt_id" = "tgw-rtb-ff"
      "vpn_attachment_id" = "tgw-attach-88"
    }
  }
  "prod" = {
    "tgw-rtb-aa-tgw-attach-11" = {
      "rt_id" = "tgw-rtb-aa"
      "vpn_attachment_id" = "tgw-attach-11"
    }
    "tgw-rtb-aa-tgw-attach-22" = {
      "rt_id" = "tgw-rtb-aa"
      "vpn_attachment_id" = "tgw-attach-22"
    }
    "tgw-rtb-aa-tgw-attach-33" = {
      "rt_id" = "tgw-rtb-aa"
      "vpn_attachment_id" = "tgw-attach-33"
    }
    "tgw-rtb-aa-tgw-attach-44" = {
      "rt_id" = "tgw-rtb-aa"
      "vpn_attachment_id" = "tgw-attach-44"
    }
    "tgw-rtb-bb-tgw-attach-11" = {
      "rt_id" = "tgw-rtb-bb"
      "vpn_attachment_id" = "tgw-attach-11"
    }
    "tgw-rtb-bb-tgw-attach-22" = {
      "rt_id" = "tgw-rtb-bb"
      "vpn_attachment_id" = "tgw-attach-22"
    }
    "tgw-rtb-bb-tgw-attach-33" = {
      "rt_id" = "tgw-rtb-bb"
      "vpn_attachment_id" = "tgw-attach-33"
    }
    "tgw-rtb-bb-tgw-attach-44" = {
      "rt_id" = "tgw-rtb-bb"
      "vpn_attachment_id" = "tgw-attach-44"
    }
    "tgw-rtb-cc-tgw-attach-11" = {
      "rt_id" = "tgw-rtb-cc"
      "vpn_attachment_id" = "tgw-attach-11"
    }
    "tgw-rtb-cc-tgw-attach-22" = {
      "rt_id" = "tgw-rtb-cc"
      "vpn_attachment_id" = "tgw-attach-22"
    }
    "tgw-rtb-cc-tgw-attach-33" = {
      "rt_id" = "tgw-rtb-cc"
      "vpn_attachment_id" = "tgw-attach-33"
    }
    "tgw-rtb-cc-tgw-attach-44" = {
      "rt_id" = "tgw-rtb-cc"
      "vpn_attachment_id" = "tgw-attach-44"
    }
    "tgw-rtb-dd-tgw-attach-11" = {
      "rt_id" = "tgw-rtb-dd"
      "vpn_attachment_id" = "tgw-attach-11"
    }
    "tgw-rtb-dd-tgw-attach-22" = {
      "rt_id" = "tgw-rtb-dd"
      "vpn_attachment_id" = "tgw-attach-22"
    }
    "tgw-rtb-dd-tgw-attach-33" = {
      "rt_id" = "tgw-rtb-dd"
      "vpn_attachment_id" = "tgw-attach-33"
    }
    "tgw-rtb-dd-tgw-attach-44" = {
      "rt_id" = "tgw-rtb-dd"
      "vpn_attachment_id" = "tgw-attach-44"
    }
    "tgw-rtb-ee-tgw-attach-11" = {
      "rt_id" = "tgw-rtb-ee"
      "vpn_attachment_id" = "tgw-attach-11"
    }
    "tgw-rtb-ee-tgw-attach-22" = {
      "rt_id" = "tgw-rtb-ee"
      "vpn_attachment_id" = "tgw-attach-22"
    }
    "tgw-rtb-ee-tgw-attach-33" = {
      "rt_id" = "tgw-rtb-ee"
      "vpn_attachment_id" = "tgw-attach-33"
    }
    "tgw-rtb-ee-tgw-attach-44" = {
      "rt_id" = "tgw-rtb-ee"
      "vpn_attachment_id" = "tgw-attach-44"
    }
    "tgw-rtb-ff-tgw-attach-11" = {
      "rt_id" = "tgw-rtb-ff"
      "vpn_attachment_id" = "tgw-attach-11"
    }
    "tgw-rtb-ff-tgw-attach-22" = {
      "rt_id" = "tgw-rtb-ff"
      "vpn_attachment_id" = "tgw-attach-22"
    }
    "tgw-rtb-ff-tgw-attach-33" = {
      "rt_id" = "tgw-rtb-ff"
      "vpn_attachment_id" = "tgw-attach-33"
    }
    "tgw-rtb-ff-tgw-attach-44" = {
      "rt_id" = "tgw-rtb-ff"
      "vpn_attachment_id" = "tgw-attach-44"
    }
  }
}

【讨论】:

  • 这很棒@Marcin。我唯一的问题是这可以合并到一个 dict 吗?我这么说的原因是至少有 6 个环境(如 Prod/Dev/Stage)并且可能还会增长。如果我有单独的字典在资源函数中调用它,则意味着 12 条语句。 6 个用于关联的资源语句和 6 个用于传播的资源语句。我觉得这很好。它比 24 好。
  • @VinitaShah 是的,您可以合并它们。检查更新的答案。只要您的 tga_vpn 和 tga_vpn 组合在不同环境之间不重叠,这将起作用。
  • 谢谢@Marcin,传播中有重叠(在我的示例伪代码中未显示):facepalm:您能否也请粘贴您以前的答案
  • @VinitaShah 嗨。我再次更新了答案。如果有帮助,请采纳。此外,如果您有未来的问题,也许新问题会更好地包含新的详细信息和错误消息。
  • 没关系我的代码不好。有用。非常感谢!!
猜你喜欢
  • 2021-05-05
  • 2019-12-16
  • 2019-05-17
  • 2019-03-19
  • 2020-04-01
  • 2019-09-26
  • 2020-12-17
  • 2021-01-13
  • 1970-01-01
相关资源
最近更新 更多