Lab3: Terraform Commands - OT-TRAINING/TerraformAWS GitHub Wiki

Terraform Commands

- First we need to create one file where we will keep all code provided by team.
- Now we need to initialize the terraform code and see what all things have been changed.
- Make sure the indentation of HCL Language is fine.
- Make sure that we are not having syntax error in tf code.
- Plan the infrastructure by using Terraform.
- Create the infrastructure using Terraform.
- Check what all resources have created in human readble format.
- Also see all the values assigned to these resources.
- Add another block of code for SG.
- Plan the new changes and observe what exactly is getting changed.
- Update the new changes by using Terraform.
- Now try to remove ec2 from the console and notice what will happen in terraform.
- Update the tfstate file without running apply command of terraform.
- Destroy the complete infrastructure.

Let's Start

Step 1: First we need to create one file where we will keep all code provided by team.

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


variable "resource_name" {
  default = "test"
}

#  create VPC
resource "aws_vpc" "main" {
  cidr_block       = "10.0.0.0/16"
  instance_tenancy = "default"
  tags = {
    Name = var.resource_name
  }
}

# create public subnet
resource "aws_subnet" "main" {
  vpc_id                  = aws_vpc.main.id
  cidr_block              = "10.0.1.0/24"
  map_public_ip_on_launch = true
  tags = {
    Name = "${var.resource_name}-subnet"
  }
}

# for ami
data "aws_ami" "ubuntu" {
  most_recent = true

  filter {
    name   = "name"
    values = ["ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"]
  }

  filter {
    name   = "virtualization-type"
    values = ["hvm"]
  }
  owners = ["099720109477"] # Canonical
}

# create ec-2
resource "aws_instance" "main" {
  ami           = data.aws_ami.ubuntu.id
  count         = 2
  instance_type = "t2.micro"
  subnet_id     = aws_subnet.main.id
  #  vpc_security_group_ids = [aws_security_group.main.id]
  tags = {
    Name = "${var.resource_name}-instance"
  }
}

Now we need to initialise the terraform code and see what all things have been changed.

terraform init

Make sure the indentation of HCL Language is fine.

terraform fmt

Make sure that we are not having syntax error in tf code.

terraform validate

Plan the infrastructure by using Terraform.

terraform plan

Create the infrastructure using Terraform.

 terraform apply

Check what all resources have created in human readable format.

terraform show

Also see all the values assigned to these resources.

terraform state list

Note:- Explore other option as well

Add another block of code for SG.

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


variable "resource_name" {
  default = "test"
}

#  create VPC
resource "aws_vpc" "main" {
  cidr_block       = "10.0.0.0/16"
  instance_tenancy = "default"
  tags = {
    Name = var.resource_name
  }
}

# create public subnet
resource "aws_subnet" "main" {
  vpc_id                  = aws_vpc.main.id
  cidr_block              = "10.0.1.0/24"
  map_public_ip_on_launch = true
  tags = {
    Name = "${var.resource_name}-subnet"
  }
}

# for ami
data "aws_ami" "ubuntu" {
  most_recent = true

  filter {
    name   = "name"
    values = ["ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"]
  }

  filter {
    name   = "virtualization-type"
    values = ["hvm"]
  }
  owners = ["099720109477"] # Canonical
}

# create ec-2
resource "aws_instance" "main" {
  ami           = data.aws_ami.ubuntu.id
  count         = 2
  instance_type = "t2.micro"
  subnet_id     = aws_subnet.main.id
  vpc_security_group_ids = [aws_security_group.main.id]
  tags = {
    Name = "${var.resource_name}-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"
  }

  # allow egress of all ports
  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
  tags = {
    Name = "${var.resource_name}-SG"
  }
}

Plan the new changes and observe what exactly is getting changed.

terraform plan

Update the new changes by using Terraform.

terraform apply

Now try to remove ec2 from the console and notice what will happen in terraform.

Update the tfstate file without running apply command of terraform.

terraform refresh

Destroy the complete infrastructure.

terraform destroy