Terraform: adjunte varios grupos de seguridad a la instancia EC2

Terraform: adjunte varios grupos de seguridad a la instancia EC2

¿Cómo adjuntar múltiples grupos de seguridad en la creación de EC2? Lo he modularizado de la siguiente manera:

**networking/main.tf**
# Web Server Security Group
resource "aws_security_group" "web_sg" {
  name        = "web_sg"
  description = "This security group will control the private Web Servers"
  vpc_id      = aws_vpc.perf_vpc.id
  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

# Load Balancer Security Group
resource "aws_security_group" "alb_sg" {
  name        = "alb_sg"
  description = " This secruity group is for Application Load Balancer"
  vpc_id      = aws_vpc.perf_vpc.id
  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

resource "aws_security_group" "perf_pvt_sg" {
  name        = "perf_pvt_sg"
  description = "Aptean_Base-Perf_Pvt"
  vpc_id      = aws_vpc.perf_vpc.id
  depends_on  = [aws_security_group.bastion_sg]

  ingress {
    description = "kaspersky"
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["10.176.0.35/32"]
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

**networking/outputs.tf**
output "perf_pvt_sg" {
  value = aws_security_group.perf_pvt_sg.id
}

output "web_sg" {
  value = aws_security_group.web_sg.id
}

output "alb_sg" {
  value = aws_security_group.alb_sg.id
}

**root/main.tf**
# Deploy Web Servers
module "web_servers" {
  source          = "./web_servers"
  keyname         = module.domain_controllers.key_name
  public_key_path = var.public_key_path
  web_count       = var.web_count
  web_inst_type   = var.web_inst_type
  pvtsubnets      = module.networking.private_subnets
  webserver_sg    = [
    module.networking.web_sg,
    module.networking.perf_pvt_sg,
    module.networking.alb_sg
  ]
}

Todo está bien y se crea como se esperaba y la salida de terraform también muestra los recursos, pero todas las instancias EC2 (en este caso, solo estoy señalando los servidores web) tienen adjunto el grupo de seguridad predeterminado. Ya veo, todos los demás grupos de seguridad creados aunque no hay ninguno adjunto. Intenté cambiar web_sg como atributo de identificación y nombre también:

web_sg          = [
        module.networking.web_sg.id,
        module.networking.perf_pvt_sg.id,
        module.networking.alb_sg.id
        ]

Esto arroja un error (el mismo error para *.id y *.name):

Error: Unsupported attribute

  on main.tf line 46, in module "web_servers":
  46:     module.networking.web_sg.name,
    |----------------
    | module.networking.web_sg is "sg-008001301c71877a9"
This value does not have any attributes.


Error: Unsupported attribute

  on main.tf line 47, in module "web_servers":
  47:     module.networking.perf_pvt_sg.name,
    |----------------
    | module.networking.perf_pvt_sg is "sg-0a50f754aceaae6cd"

This value does not have any attributes.


Error: Unsupported attribute

  on main.tf line 48, in module "web_servers":
  48:     module.networking.alb_sg.name
    |----------------
    | module.networking.alb_sg is "sg-05c898e0b6873c411"

This value does not have any attributes.

¿Qué estoy haciendo mal?

Consola de AWS: ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Editar1: servidores_web/main.tf

#Web Server
resource "aws_instance" "web" {
  count         = var.web_count
  ami           = data.aws_ami.server_ami.id
  ebs_optimized = true
  instance_type = var.web_inst_type
  subnet_id     = element(var.pvtsubnets, count.index)
  credit_specification {
    cpu_credits = "standard"
  }
  root_block_device {
    volume_type = "gp2"
    volume_size = 80
    encrypted   = true
    kms_key_id  = "1d9ef127-cc8f-4dda-9bdf-abdad498ea6f"
  }
  ebs_block_device {
    device_name = "/dev/sdf"
    volume_type = "gp2"
    volume_size = 40
    encrypted   = true
    kms_key_id  = "1d9ef127-cc8f-4dda-9bdf-abdad498ea6f"
  }
  tags = {
    Name = "PerformanceWeb0${count.index + 1}"
  }
}

servidores_web/variables.tf

variable "keyname" {}
variable "public_key_path" {}
variable "web_count" {}
variable "web_inst_type" {}
variable "pvtsubnets" {
  type = list(string)
}
variable "webserver_sg" {}

Respuesta1

Lo había solucionado. No estoy seguro si esta es la única manera. Mientras reviso el código me aparece ya que había comentadovpc_security_group_idsen el módulo web_servers, estaba tomando el grupo de seguridad predeterminado de VPC. Hizo algunos cambios como se muestra a continuación:

servidores_web/main.tf

#Web_servers
resource "aws_instance" "web" {
  count         = var.web_count
  ami           = data.aws_ami.server_ami.id
  ebs_optimized = true
  instance_type = var.web_inst_type
  subnet_id     = element(var.pvtsubnets, count.index)
  vpc_security_group_ids = [
    var.web_sg,
    var.perf_pvt_sg,
    var.alb_traffic_sg
  ]

servidores_web/variable.tf

variable "web_sg" {}
variable "perf_pvt_sg" {}
variable "alb_traffic_sg" {}

raíz/principal.tf

#Deploy Web Servers
module "web_servers" {
  source            = "./web_servers"
  keyname           = module.domain_controllers.key_name
  public_key_path   = var.public_key_path
  web_count     = var.web_count
  web_inst_type = var.web_inst_type
  pvtsubnets        = module.networking.private_subnets
  web_sg        = module.networking.web_sg
  perf_pvt_sg       = module.networking.perf_pvt_sg
  alb_traffic_sg       = module.networking.alb_traffic_sg
}

Salida deseada ingrese la descripción de la imagen aquí

información relacionada