Создание ресурсов из местных жителей.tf с переменными входами

#terraform #terraform-provider-aws

Вопрос:

У меня есть длинный список правил 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 =gt; 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.  

Можно ли это сделать из локального файла или карты переменных?

Комментарии:

1. вы видели мой ответ @CEamonn? Это сработало?

2. @JuanFontes, вот и все, оценил.

Ответ №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  }, ......