Terraform-遍历从数据块上的for_each生成的列表

时间:2020-06-06 14:55:23

标签: iteration terraform terraform-provider-aws terraform0.12+

更新->对于所有遇到此特定问题的人,我找到了解决方案,它已经在该问题的结尾了。

更新2 ->我在此介绍的最后一个解决方案是WRONG,请参阅更新末尾。

我正在从数据块中检索cidr_blocks列表,以用作aws_ec2_transit_gateway_route上的值,但是到目前为止,我仍无法遍历该列表以获取单个值并将其设置在适当的位置。 我的data_block.tf的重要部分如下所示:

data "aws_vpc" "account_vpc" {
 provider = aws.dev
 count = "${length(data.aws_vpcs.account_vpcs.ids)}"
 id    = element(tolist(data.aws_vpcs.account_vpcs.ids), 0)
}

data "aws_subnet_ids" "account_subnets" {
 provider = aws.dev
 vpc_id   = element(tolist(data.aws_vpcs.account_vpcs.ids), 0)
}

data "aws_subnet" "cidrblocks" {
  provider = aws.dev
  for_each = data.aws_subnet_ids.account_subnets.ids
  id    = each.value
}

我打算使用的部分是tgw_rt.tf:

resource "aws_ec2_transit_gateway_route" "shared-routes" {
 provider                      = aws.shared
 #count = length(data.aws_subnet.cidrblocks.cidr_block)
 #destination_cidr_block         = lookup(data.aws_subnet.cidrblocks.cidr_block[count.index], element(keys(data.aws_subnet.cidrblocks.cidr_block[count.index]),0), "127.0.0.1/32")
 #destination_cidr_block          = data.aws_subnet.cidrblocks.cidr_block[count.index]
 #destination_cidr_block          = [data.aws_subnet.cidrblocks.*.cidr_block]
 destination_cidr_block          = [for s in data.aws_subnet.cidrblocks : s.cidr_block]
 /* for_each                         = [for s in data.aws_subnet.cidrblocks: {
   destination_cidr_block         = s.cidr_block
  }] */
 #destination_cidr_block         = [for s in data.aws_subnet.cidrblocks : s.cidr_block]
 #destination_cidr_block         = data.aws_subnet.cidrblocks.cidr_block[count.index]
 transit_gateway_attachment_id  = aws_ec2_transit_gateway_vpc_attachment.fromshared.id
 transit_gateway_route_table_id = aws_ec2_transit_gateway_route_table.shared.id
}

评论中的部分是我到目前为止尝试过的,没有任何效果。 使用该未注释部分时当前发生的错误是

Error: Incorrect attribute value type

  on modules/tgw/tgw_rt.tf line 20, in resource "aws_ec2_transit_gateway_route" "shared-routes":
  20:  destination_cidr_block          = [for s in data.aws_subnet.cidrblocks : s.cidr_block]
    |----------------
    | data.aws_subnet.cidrblocks is object with 3 attributes

Inappropriate value for attribute "destination_cidr_block": string required.

如果在座的地神之一能阐明这个问题,我将不胜感激。

解决方案-这很错误由于它一直在抱怨它是一个具有3个属性(3个Cidr块)的对象,因此要进行迭代,我不得不使用它:

destination_cidr_block          = element([for s in data.aws_subnet.cidrblocks : s.cidr_block], 0)

正确的解决方案解决方案是在@kyle建议中添加一小部分,我不得不使用一个对象来表示数据并将其转换为地图,然后摇晃@kyle:

for_each                         = {for s in data.aws_subnet.cidrblocks: s.cidr_block => s}
destination_cidr_block           = each.value.cidr_block

谢谢大家

1 个答案:

答案 0 :(得分:1)

我还没有使用data.aws_subnet,但我认为您已经尝试了for_each-

resource "aws_ec2_transit_gateway_route" "shared-routes" {
...
 for_each                = [for s in data.aws_subnet.cidrblocks: s.cidr_block]
 destination_cidr_block  = each.value
...
}