【问题标题】:Terraform nested for loops for route association based on tags用于基于标签的路由关联的 Terraform 嵌套循环
【发布时间】:2021-02-20 09:51:57
【问题描述】:

我是 terraform 的新手,我想知道路由表关联,如何根据以下条件创建关联路由表子网关联:

我有路由表 A、B、C 我有子网 D、E、F、G、H、I、J、K 我希望路由表 A 与子网 D、E 相关联 我希望路由表 B 与子网 F、G、H、I 相关联 我希望路由表 C 与子网 J、K 相关联

locals {
  route_tables = flatten([
    for route_table_details in aws_route_table.NETWORK-PROD-RT-TEST : [
      for subnet_details in aws_subnet.NETWORK-PROD-SUBNET-TEST : {
       
        ##Pseudo code ###
        if route_table_details.tags.Names == "A" and subnet_details.tags.Names == ("D" or "E"):
          route_table_id = route_table_details.id
          subnet_id = subnet_details.id
        
        elif route_table_details.tags.Names == "B" and subnet_details.tags.Names == ("J" or "K"):
          route_table_id = route_table_details.id
          subnet_id = subnet_details.id
        
         elif route_table_details.tags.Names == "C" and subnet_details.tags.Names == ("F, G, H, I):
           route_table_id = route_table_details.id
           subnet_id = subnet_details.id
        ##Pseudo code ###
}
]
])
}

resource "aws_route_table_association" "a" {
  count = length(local.route_tables)
  subnet_id      = local.route_tables[count.index].subnet_id
  route_table_id = local.route_tables[count.index].route_table_id 
}
     

【问题讨论】:

  • 什么是aws_route_table.NETWORK-PROD-RT-TESTaws_subnet.NETWORK-PROD-SUBNET-TEST?你有他们的示例代码吗?
  • 这基本上是 AWS 中的 3 个路由表和 8 个子网。我不能在这里分享这些数据,但它们只是像 `resource "aws_route_table" "NETWORK-PROD-RT-TEST" { vpc_id = something route { cidr_block = "something" gateway_id = "something" transit_gateway_id = "something" } 标签之类的名称= {名称=“某事”访问=“某事”}}`
  • 为什么不创建三个local.route_tablesAlocal.route_tablesBlocal.route_tablesB以及三个对应的aws_route_table_association?那么这样一个多条件的复杂for循环,阅读、调试、修改和维护会容易得多吗?
  • 路由表有6个,子网有16个,文件会过长

标签: amazon-web-services terraform


【解决方案1】:

假设我正确理解了您的要求,我认为最直接的编写方法是使用三个独立的 aws_route_table_association 资源:

resource "aws_route_table_association" "a" {
  for_each = {
    for k, v in aws_subnet.NETWORK-PROD-SUBNET-TEST : k => v
    if contains(["D", "E"], v.tags.Name)
  }

  subnet_id      = each.value.id
  route_table_id = aws_route_table.NETWORK-PROD-RT-TEST["a"]
}

resource "aws_route_table_association" "b" {
  for_each = {
    for k, v in aws_subnet.NETWORK-PROD-SUBNET-TEST : k => v
    if contains(["F", "G", "H"], v.tags.Name)
  }

  subnet_id      = each.value.id
  route_table_id = aws_route_table.NETWORK-PROD-RT-TEST["b"]
}

resource "aws_route_table_association" "c" {
  for_each = {
    for k, v in aws_subnet.NETWORK-PROD-SUBNET-TEST : k => v
    if contains(["J", "K"], v.tags.Name)
  }

  subnet_id      = each.value.id
  route_table_id = aws_route_table.NETWORK-PROD-RT-TEST["c"]
}

每个都使用带有if 子句的for 表达式来过滤掉名称不在允许名称集中的任何子网对象。

只要子网和路由表之间的关系在此处看起来是任意的(而不是系统的),我认为不可能用中间数据结构编写一个更简单的版本。如果子网和路由表的连接方式有一些系统,那么我希望您可以编写实现该系统的表达式,但是如果您所拥有的只是手动选择的每个名称的列表,那么您就无法真正改进写作为每个路由表列出一个列表,在这种情况下,它可能只是三个 resource 块。

【讨论】:

  • 我确实说过我有 3 条路线,但它们来自同一个资源,我只使用一个资源语句创建了 3 条开发路线aws_route_table.DEV-RT 因此,我不能使用,aws_route_table.NETWORK-PROD-RT- TEST["c"] 还有其他方法吗?可能与计数或什么? @马丁
  • 这对您很有帮助,非常感谢。欣赏它!
猜你喜欢
  • 1970-01-01
  • 2015-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-24
  • 1970-01-01
  • 2022-08-18
相关资源
最近更新 更多