【问题标题】:Creating resources from locals.tf with variable inputs使用可变输入从 locals.tf 创建资源
【发布时间】:2021-12-02 02:29:57
【问题描述】:

我有一长串 ACL 规则,并试图通过迭代它们来生成 aws_network_acl。规则在我的模块中的 locals.tf 文件中,以使 main.tf 更整洁,看起来像这样

locals.tf

locals {
  webapp = [{
    "protocol"  = "tcp"
    "rule_no"   = 100
    "action"    = "allow"
    "from_port" = 22
    "to_port"   = 22
    },
    {
      "protocol"  = "tcp"
      "rule_no"   = 110
      "action"    = "allow"
      "from_port" = 60111
      "to_port"   = 60111
    },
    {
      "protocol"  = "tcp"
      "rule_no"   = 120
      "action"    = "allow"
      "from_port" = 3243
      "to_port"   = 3243
    },
    {
      "protocol"  = "tcp"
      "rule_no"   = 130
      "action"    = "allow"
      "from_port" = 6379
      "to_port"   = 6379
    },
    {
      "protocol"  = "tcp"
      "rule_no"   = 140
      "action"    = "allow"
      "from_port" = 50123
      "to_port"   = 50123
    },
    {
      "protocol"  = "tcp"
      "rule_no"   = 150
      "action"    = "allow"
      "from_port" = 50432
      "to_port"   = 50432
    },
    {
      "protocol"  = "tcp"
      "rule_no"   = 160
      "action"    = "allow"
      "from_port" = 3306
      "to_port"   = 3306
    },
    {
      "protocol"  = "tcp"
      "rule_no"   = 170
      "action"    = "allow"
      "from_port" = 50001
      "to_port"   = 50001
    },
    {
      "protocol"  = "tcp"
      "rule_no"   = 180
      "action"    = "allow"
      "from_port" = 50010
      "to_port"   = 50015
    },
    {
      "protocol"  = "tcp"
      "rule_no"   = 190
      "action"    = "allow"
      "from_port" = 50650
      "to_port"   = 50660
    }
  ]
}

(还有更多,但为简洁起见。

在我的模块的 main.tf 中,我想遍历每个,创建一个 ACL

resource "aws_network_acl" "webapp" {
  vpc_id = data.aws_vpc.posttrade-vpc.id

  for_each = {for idx, query in locals.posttrade: idx => query}
  egress = [
    protocol = each.value.protocol
    rule_no = each.value.rule_no
    action = "allow"
    from_port = each.value.from_port
    to_port = each.value.to_port
  ]
}

但得到错误

Missing item separator: Expected a comma to mark the beginning of the next item.

是否可以从本地文件或变量映射中执行此操作?

【问题讨论】:

  • 你看到我的回答@CEamonn 了吗?成功了吗?
  • @JuanFontes 就是这样,感谢。

标签: terraform terraform-provider-aws


【解决方案1】:

您缺少创建多个出口的动态块。你只需要添加代码:

resource "aws_network_acl" "webapp" {
  vpc_id = data.aws_vpc.posttrade-vpc.id
  dynamic "egress" {

    for_each = toset(local.webapp)

    content {
      protocol  = egress.value["protocol"]
      rule_no   = egress.value["rule_no"]
      action    = "allow"
      from_port = egress.value["from_port"]
      to_port   = egress.value["to_port"]
    }

  }
}

这将导致:

Terraform will perform the following actions:

  # aws_network_acl.webapp will be created
  + resource "aws_network_acl" "webapp" {
      + arn        = (known after apply)
      + egress     = [
          + {
              + action          = "allow"
              + cidr_block      = ""
              + from_port       = 22
              + icmp_code       = null
              + icmp_type       = null
              + ipv6_cidr_block = ""
              + protocol        = "tcp"
              + rule_no         = 100
              + to_port         = 22
            },
          + {
              + action          = "allow"
              + cidr_block      = ""
              + from_port       = 3243
              + icmp_code       = null
              + icmp_type       = null
              + ipv6_cidr_block = ""
              + protocol        = "tcp"
              + rule_no         = 120
              + to_port         = 3243
            },
......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-11
    • 2021-05-05
    • 1970-01-01
    • 2022-01-22
    • 2012-06-12
    • 2022-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多