#amazon-web-services #terraform #terraform-provider-aws
Вопрос:
я думаю, что я должен быть в состоянии сделать что-то подобное. но карта портов, протоколов и cidr неверна… как мне составить карту списков и взаимодействовать по карте.
variable "master-sg-ingress-ports" {
//depends_on [aws_security_group.master-lb-sg, aws_security_group.worker-sg]
description = "List of port numbers for specific security group"
type = map(any)
// format should be [ sg1 = [from_port, to_port, protocol, from_ip_cidr] ] ]
default = [ "ingress1" = [80, 80, "TCP", "0.0.0/0"],
"ingress2" = [80, 80, "TCP", "::0/0"],
"ingress3" = [443, 80, "TCP", "0.0.0.0/0"],
"ingress4" = [443, 80, "TCP", "::0/0"],
"ingress5 "= [0, 0, "-1", "172.30.0.0/16"],]
}
resource "aws_security_group" "master_sg" {
depends_on = [aws_security_group.master_lb_sg, aws_security_group.worker_sg]
provider = aws.region_master
name = "master-sg"
description = "security group for Jenkins master"
vpc_id = aws_vpc.vpc_master.id
dynamic "ingress" {
# this for_each is not identical to for_each in line 21
for_each = toset(var.master-sg-ingress-ports) # iterator can be (need to be) configured
iterator = it # set the name of the iterator, which can be any name, but "each" (!!)
content {
from_port = it[0].value
to_port = it[1].value
protocol = it[2].value
cidr_blocks = [it[3].value]
}
}
}
terraform init
дает мне следующее с подчеркиванием под ingress1
The Terraform configuration must be valid before initialization so that
Terraform can determine which modules and providers need to be installed.
╷
│ Error: Invalid default value for variable
│
│ on security_groups.tf line 64, in variable "master-sg-ingress-ports":
│ 64: default = [ "ingress1" = [80, 80, "TCP", "0.0.0/0"],
│ 65: "ingress2" = [80, 80, "TCP", "::0/0"],
│ 66: "ingress3" = [443, 80, "TCP", "0.0.0.0/0"],
│ 67: "ingress4" = [443, 80, "TCP", "::0/0"],
│ 68: "ingress5 "= [0, 0, "-1", "172.30.0.0/16"],].
╵```
Ответ №1:
Правильное значение по умолчанию-это карта, а не список карт, как у вас сейчас. Так и должно быть:
variable "master-sg-ingress-ports" {
description = "List of port numbers for specific security group"
type = map(any)
default = { "ingress1" = [80, 80, "TCP", "0.0.0.0/0"],
"ingress2" = [80, 80, "TCP", "::/0"],
"ingress3" = [443, 80, "TCP", "0.0.0.0/0"],
"ingress4" = [443, 80, "TCP", "::/0"],
"ingress5 "= [0, 0, "-1", "172.30.0.0/16"]}
}
Обновление для master_sg
:
resource "aws_security_group" "master_sg" {
# depends_on = [aws_security_group.master_lb_sg, aws_security_group.worker_sg]
# provider = aws.region_master
name = "master-sg"
description = "security group for Jenkins master"
vpc_id = data.aws_vpc.default.id
dynamic "ingress" {
# this for_each is not identical to for_each in line 21
for_each = var.master-sg-ingress-ports
content {
from_port = ingress.value[0]
to_port = ingress.value[1]
protocol = ingress.value[2]
cidr_blocks = [ingress.value[3]]
}
}
}
Комментарии:
1. ну, это 1/2 проблемы, теперь Terraform не нравится назначение итератора. получение «Данный ключ не идентифицирует элемент в этом значении коллекции» в rom_port = it[0].значение
2. @petercooke Я обновил ответ, но ваш код не будет работать, так как вы смешиваете ipv4 и ipv6, и в любом случае у вас неверный CIDR и диапазоны портов. Вы не можете смешивать ip4 и ip6 таким образом. Для ipv6 вы должны использовать
ipv6_cidr_blocks
, а неcidr_blocks
. Я бы предложил задать новый вопрос, как с этим справиться, или просто удалить ipv6, если он вам не нужен.3. просто к твоему сведению. ему не нравится «[443,80», порт 443 должен быть 443,443
4. черт возьми, получается «Ошибка авторизации правил входа в группу безопасности: недопустимое значение параметра: Блок CIDR ::/0 неправильно сформирован» в Google много об этом, реального решения нет
5. @petercooke Я написал, что вы не можете смешивать ipv4 с ipv6. ::/0-это ipv6.