Lab4: Terraform Resources - OT-TRAINING/TerraformAWS GitHub Wiki

Terraform Providers, Resources, and Commands

Must To DO:

  • Create One file with name main.tf.
  • Configure AWS as a provider and download the Terraform plugin for AWS.
  • Add resource code to create one Subnet.
  • Add resource code to create one VPC.
  • Add resource code to create one SG.
  • Add resource code to create one EC2. NOTE- Make Sure You are validating your code after adding all resources. Try to use optional arguments as well as much you can. Good To DO:
  • Create one resource for ALB.

Let's Begin Now

provider "aws" {
  region = "us-east-2"
}


#  create VPC
resource "aws_vpc" "main" {
  cidr_block       = "10.0.0.0/16"
  instance_tenancy = "default"
  tags = {
    Name = "test-vpc"
  }
}

variable "az_map" {
  type = list

  default = [
    {
      name = "us-east-2a"
      az   = "us-east-2a"
      cidr = "10.0.1.0/24"
    },
    {
      name = "us-east-2b"
      az   = "us-east-2b"
      cidr = "10.0.2.0/24"
    },
    {
      name = "us-east-2c"
      az   = "us-east-2c"
      cidr = "10.0.3.0/24"
    }
  ]
}

# create public subnet
resource "aws_subnet" "main" {
  count                   = length(var.az_map)  
  vpc_id                  = aws_vpc.main.id
  cidr_block              = lookup(var.az_map[count.index], "cidr")
  availability_zone       = lookup(var.az_map[count.index], "az")
  map_public_ip_on_launch = true
  tags = {
    Name = lookup(var.az_map[count.index], "name")
  }
}

# create IGW
resource "aws_internet_gateway" "main" {
 vpc_id = aws_vpc.main.id
 tags = {
        Name = "test_igw"
    }
}

# Public Route Table
resource "aws_route_table" "main" {
 vpc_id = aws_vpc.main.id
  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.main.id
  }
}

# Associate the Route Table with the public Subnet
resource "aws_route_table_association" "rahul" {
  subnet_id       = aws_subnet.main[0].id 
  route_table_id = aws_route_table.main.id
}



# create ec-2
resource "aws_instance" "main" {
  count         = 2
  ami           = "ami-08962a4068733a2b6"
  instance_type = "t2.micro"
  subnet_id     = aws_subnet.main[0].id
  vpc_security_group_ids = [aws_security_group.main.id]
  tags = {
    Name = "test-instance"
  }
}


# Create the Security Group
resource "aws_security_group" "main" {
  vpc_id = aws_vpc.main.id
  name   = "main Security Group"

 # allow ingress of port 22
  ingress {
    cidr_blocks = ["0.0.0.0/0"]
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
  }
  ingress {
    cidr_blocks = ["0.0.0.0/0"]
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
  }
  
  # allow egress of all ports
  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
  tags = {
    Name = "test-SG"
  }
}

resource "aws_lb" "test" {
  name               = "test-lb-tf"
  internal           = false
  load_balancer_type = "application"
  security_groups    = [aws_security_group.main.id]
  subnets            = aws_subnet.main.*.id


  tags = {
    Environment = "production"
  }
}

resource "aws_lb_target_group" "test" {
  name     = "tf-test-lb-tg"
  port     = 80
  protocol = "HTTP"
  vpc_id   = aws_vpc.main.id
}


resource "aws_lb_listener" "redirect" {
  load_balancer_arn = aws_lb.test.arn
  port              = "80"
  protocol          = "HTTP"

  default_action {
    type = "redirect"

    redirect {
      port        = "443"
      protocol    = "HTTPS"
      status_code = "HTTP_301"
    }
  }
}


resource "aws_lb_target_group_attachment" "test" {
  count = length(aws_instance.main)
  target_group_arn = aws_lb_target_group.test.arn
  target_id = aws_instance.main[count.index].id
  port             = 80
}