#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 }, ......