Intenté crear un grupo de seguridad de AWS con varias reglas de entrada. Normalmente, necesitamos varias entradas en el sg para varias reglas de entrada. En lugar de crear varias reglas de ingreso por separado, traté de crear una lista de ingreso para poder reutilizar fácilmente el módulo para diferentes aplicaciones.
PFB,
modulo/sg/sg.tf >>
resource "aws_security_group" "ec2_security_groups" { name = var.name_security_groups vpc_id = var.vpc_id }módulo/sg/reglas.tf >>
resource "aws_security_group_rule" "ingress_rules" { count = lenght(var.ingress_rules) type = "ingress" from_port = var.ingress_rules[count.index][0] to_port = var.ingress_rules[count.index][1] protocol = var.ingress_rules[count.index][2] cidr_blocks = var.ingress_rules[count.index][3] description = var.ingress_rules[count.index][4] security_group_id = aws_security_group.ec2_security_groups.id }módulo/sg/variable.tf >>
variable "vpc_id" { } variable "name_security_groups" { } variable "ingress_rules" { type = list(string) }En la carpeta de la aplicación,
aplicación/dev/sg.tf >>
module "sg_test" { source = "../modules/sg" vpc_id = "vpc-xxxxxxxxx" name_security_groups = "sg_test" ingress_rules = var.sg_ingress_rules }aplicacion/dev/variable.tf >>
variable "sg_ingress_rules" { type = list(string) default = { [22, 22, "tcp", "1.2.3.4/32", "test"] [23, 23, "tcp", "1.2.3.4/32", "test"] } }Error:
Error: Missing attribute value on test-sgs.tf line 21, in variable "sg_ingress_rules": 20: 21: 22: Expected an attribute value, introduced by an equals sign ("=").Ayúdenos a corregir esto o si hay algún otro método, sugiéralo.
Saludos,
Gracias @apparentlymart, que ayudó a resolver esto en la discusión de Terraform
La regla de seguridad:-
resource "aws_security_group_rule" "ingress_rules" { count = length(var.ingress_rules) type = "ingress" from_port = var.ingress_rules[count.index].from_port to_port = var.ingress_rules[count.index].to_port protocol = var.ingress_rules[count.index].protocol cidr_blocks = [var.ingress_rules[count.index].cidr_block] description = var.ingress_rules[count.index].description security_group_id = aws_security_group.ec2_security_groups.id }Y la variable:
variable "sg_ingress_rules" { type = list(object({ from_port = number to_port = number protocol = string cidr_block = string description = string })) default = [ { from_port = 22 to_port = 22 protocol = "tcp" cidr_block = "1.2.3.4/32" description = "test" }, { from_port = 23 to_port = 23 protocol = "tcp" cidr_block = "1.2.3.4/32" description = "test" }, ] }Si desea que esto funcione literalmente con campos indexados, conviértalo en una lista (lista (cadena)) y cambie la sintaxis oyter predeterminada de llaves (usadas para mapas) a corchetes (usados para listas):
variable "sg_ingress_rules" { type = list(list(string)) default = [ [22, 22, "tcp", "1.2.3.4/32", "test"] [23, 23, "tcp", "1.2.3.4/32", "test"] ] }Esa es una estructura de datos confusa y será difícil trabajar con ella, así que recomiendo esto en su lugar:
variable "sg_ingress_rules" { type = map(map(any)) default = { thing1 = {from=22, to=22, proto="tcp", cidr="1.2.3.4/32", desc=test"] thing2 = {from=23, to=23, proto="tcp", cidr="1.2.3.4/32", desc="test"} } }Puede usar mejores nombres que los terribles que he elegido y luego referirse a ellos en su recurso:
resource "aws_security_group_rule" "ingress_rules" { for_each = var.ingress_rules type = "ingress" from_port = each.value.from to_port = each.value.to protocol = each.value.proto cidr_blocks = each.value.cidr description = each.value.desc security_group_id = aws_security_group.ec2_security_groups.id }Obtendrá varias copias con nombre de aws_security_group_rule, que sobrevive mejor a las inserciones y eliminaciones de la variable ingress_rules y le ahorrará dolores de cabeza. De lo contrario, obtendrá destrucción y creación superfluas de reglas y, a veces, conflictos debido a los recursos indexados que crea un recuento.
Si desea tener mejores medidas de seguridad para las personas que configuran el valor de ingress_rules, puede usar object para requerir y restringir a un conjunto particular de campos con ciertos tipos de la siguiente manera:
variable "sg_ingress_rules" { type = map(object( { from = number to = number proto = string cidr = string desc = string } )) default = { thing1 = {from=22, to=22, proto="tcp", cidr="1.2.3.4/32", desc=test"] thing2 = {from=23, to=23, proto="tcp", cidr="1.2.3.4/32", desc="test"} } }Podemos hacer esto de una manera simple: -
locals { ports_in = [ 443, 80 ] ports_out = [ 0 ] } resource "aws_security_group" "internet_facing_alb" { name = "internetfacing-loadbalancer-sg" description = "Security group attached to internet facing loadbalancer" vpc_id = var.vpc_id dynamic "ingress" { for_each = toset(local.ports_in) content { description = "Web Traffic from internet" from_port = ingress.value to_port = ingress.value protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } } dynamic "egress" { for_each = toset(local.ports_out) content { description = "Web Traffic to internet" from_port = egress.value to_port = egress.value protocol = "-1" cidr_blocks = ["0.0.0.0/0"] } } tags = { Name = "internetfacing-loadbalancer-sg" } }