1
votes

I'm quite busy with trying to learn more about Terraform but I'm having one problem that I have no clue on how to work-around/fix.

The problem is as follows, in my script I am generating an ec2 instance (AWS) with a couple of side things like en EIP and a security group from a module, which is all working fine. But I cannot figure out how to attach the security group to the machine, now it's being created and that's it.

The code is as follows:

data "aws_ami" "latest" {
  most_recent = true
  owners = [ "self"] 

    filter {
      name = "name"
      values = [ lookup(var.default_ami, var.ami) ]
    }
}

module "aws_security_group" {
  source = "./modules/services/Security groups/"
  server_port = 443
}

resource "aws_instance" "test-ec2deployment" {
  ami                           = data.aws_ami.latest.id
  instance_type                 = var.instance_type
  subnet_id                     = var.subnet_id
  availability_zone             = var.availability_zone
  associate_public_ip_address   = var.public_ip
  
  root_block_device {
    volume_type                 = "gp2"
    volume_size                 = 60
    delete_on_termination       = true
  }
  
   tags = {
    Name                        = "Testserver2viaTerraform"
  }
}

resource "aws_eip" "ip" {
  instance = aws_instance.test-ec2deployment.id
}

resource "aws_eip" "example" {
  vpc = true
}

Above is the main file and i'm loading the following module:

resource "aws_security_group" "my-webserver" {
  name        = "webserver"
  description = "Allow HTTP from Anywhere"
  vpc_id      = "vpc-"
  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
  tags = {
    Name = "my-webserver"
    Site = "my-web-site"
  }
}

The last step is attaching the security group to the machine but again, no clue on how to do that. I've been reading several docs and tried to google but I cannot seem to find the answer or the answer does not work for me. So hopefully you guys can help me further.

Thanks for your time, much appreciated!

1

1 Answers

3
votes

In aws_security_group module you need to output security group id by add the following in ./modules/services/Security groups//main.tf

output "securitygroup_id" {
  value = aws_security_group.my-webserver.id
}

then in your main tf file attach security group to your instance like this:

resource "aws_network_interface_sg_attachment" "sg_attachment" {
  security_group_id    = module.aws_security_group.securitygroup_id
  network_interface_id = aws_instance.test-ec2deployment.primary_network_interface_id
}