首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用terraform从json模板中定义的字符串数组中获取字符串值

如何使用terraform从json模板中定义的字符串数组中获取字符串值
EN

Stack Overflow用户
提问于 2021-07-31 12:18:36
回答 1查看 122关注 0票数 1

我正在尝试使用json模板在运输网关路由表中创建路由。但是,从json模板中定义字符串数组中获取每个字符串值时,会出现如下错误;

代码语言:javascript
复制
Error: Incorrect attribute value type\n\n  on main.tf line 90, in resource \"aws_ec2_transit_gateway_route\" \"ip_route\":\n  90:   destination_cidr_block         = each.value.ip_network\n    |----------------\n    | each.value.ip_network is tuple with 3 elements\n\nInappropriate value for attribute \"destination_cidr_block\": string require

下面是我的代码-->

代码语言:javascript
复制
resource "aws_ec2_transit_gateway_route" "ip_route" {
  for_each                       = jsondecode(file("templates/my.json"))
  destination_cidr_block         = each.value.ip_network
  transit_gateway_attachment_id  = "tgw-attach-123"
  transit_gateway_route_table_id = each.value.tgw_rt_id
}

json文件-->

代码语言:javascript
复制
{
  
  "RT-1": {
    "tgw_rt_id": "tgw-rtb-00128",
    "ip_network": [ 
      "1.1.1.0/24",
      "1.1.2.0/24",
      "1.1.3.0/24"
    ]
    },

  "RT-2": {
    "tgw_rt_id": "tgw-rtb-01f1b",
    "ip_network": [ 
      "1.1.1.0/24",
      "1.1.2.0/24",
      "1.1.3.0/24"
    ]
    }
  
}

如果只有一个字符串传入"ip_network“(例如:"ip_network":"1.1.1.0/24"),我可以将"destination_cidr_block”值获取为" string“,但使用字符串数组定义时无法获取。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-31 19:18:28

如前所述,destination_cidr_block仅接受单个CIDR块(字符串),而不接受多个CIDR块。您需要为每个路由表的每个CIDR块创建单独的aws_ec2_transit_gateway_route。您可以通过展平映射来实现这一点,以便每个RT/CIDR组合都有一个元素。

代码语言:javascript
复制
locals {
  route_tables = jsondecode(file("templates/my.json"))
  rt_cidr_blocks = merge([
    for k, rt in local.route_tables:
    { 
      for i, ip_network in rt.ip_network:
      "${k}-${i}" => {
        tgw_rt_id = rt.tgw_rt_id
        ip_network = ip_network
      }
    }
  ]...)
}

resource "aws_ec2_transit_gateway_route" "ip_route" {
  for_each                       = local.rt_cidr_blocks
  destination_cidr_block         = each.value.ip_network
  transit_gateway_attachment_id  = each.key
  transit_gateway_route_table_id = each.value.tgw_rt_id
}

如果您想要查看展平的贴图现在是什么样子:

代码语言:javascript
复制
output "rt_cidr_blocks" {
  value = local.rt_cidr_blocks
}

输出:

代码语言:javascript
复制
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

blocks = {
  "RT-1-0" = {
    "ip_network" = "1.1.1.0/24"
    "tgw_rt_id" = "tgw-rtb-00128"
  }
  "RT-1-1" = {
    "ip_network" = "1.1.2.0/24"
    "tgw_rt_id" = "tgw-rtb-00128"
  }
  "RT-1-2" = {
    "ip_network" = "1.1.3.0/24"
    "tgw_rt_id" = "tgw-rtb-00128"
  }
  "RT-2-0" = {
    "ip_network" = "1.1.1.0/24"
    "tgw_rt_id" = "tgw-rtb-01f1b"
  }
  "RT-2-1" = {
    "ip_network" = "1.1.2.0/24"
    "tgw_rt_id" = "tgw-rtb-01f1b"
  }
  "RT-2-2" = {
    "ip_network" = "1.1.3.0/24"
    "tgw_rt_id" = "tgw-rtb-01f1b"
  }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68602035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档