Skip to main content

Command Palette

Search for a command to run...

🚀Day 65 - Working with Terraform Resources 🔥

Yesterday, we saw how to create a Terraform script with Blocks and Resources. Today, we will dive deeper into Terraform resources.

Published
4 min read
🚀Day 65 - Working with Terraform Resources 🔥
T

As a DevOps Engineer, I'm passionate about building and maintaining robust, efficient, and scalable infrastructure to enable seamless software delivery. With a strong foundation in C/C++, Linux, and a toolkit that spans AWS, Jenkins, Docker, Nagios, Kubernetes, YAML, Ansible, Terraform, Bash Scripting, Git, and GitHub, I'm well-equipped to tackle the challenges of modern software development and deployment.

Welcome to Day 65 of the #90DaysOfDevOps Challenge! Today, we will explore how to work with Terraform resources, which are essential for provisioning and managing infrastructure. Let’s dive in!

Understanding Terraform Resources

A resource in Terraform represents a component of your infrastructure, such as a physical server, a virtual machine, a DNS record, or an S3 bucket. Resources have attributes that define their properties and behaviors, such as the size and location of a virtual machine or the domain name of a DNS record.

When you define a resource in Terraform, you specify the type of resource, a unique name for the resource, and the attributes that define the resource. Terraform uses the resource block to define resources in your Terraform configuration.

Here’s an example of a resource block defining an AWS EC2 instance:

resource "aws_instance" "example" {
  ami           = "ami-0c94855ba95c71c99"
  instance_type = "t2.micro"
  key_name      = "my-keypair"
  tags = {
    Name = "example-instance"
  }
}

In this example, we define an AWS EC2 instance resource with the AMI ID, instance type, key pair name, and a tag for identifying the instance. This resource block tells Terraform to create and manage the specified EC2 instance in your infrastructure.

Task 1: Create a Security Group

To allow traffic to your EC2 instance, you need to create a security group. Here’s how:

  1. Open your main.tf file and add the following code to create a security group:
terraform {
  required_providers {
    aws = {
      source = "hashicorp/aws"
      version = "5.8.0"
    }
  }
}
provider "aws" {
  region = "eu-west-2"
}resource "aws_security_group" "web_server" {
  name_prefix = "web-server-sg"  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }  ingress {
    from_port   = 443
    to_port     = 443
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }  ingress {
    from_port   = 22
    to_port     = 22
    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"]
    ipv6_cidr_blocks = ["::/0"]
  }}

2. Run terraform init to initialize the Terraform project.

3. Run terraform plan to see an execution plan of the changes that Terraform will make to your infrastructure

4. Run terraform apply to create the security group.

5. We can verify the Security Group has been successfully created in our AWS account.

Task 2: Create an EC2 Instance

Now, let’s provision an EC2 instance using Terraform. Follow these steps:

  1. In your main.tf file, add the following code to create an EC2 instance:
 terraform {
   required_providers {
     aws = {
       source = "hashicorp/aws"
       version = "5.8.0"
     }
   }
 }

 provider "aws" {
   region = "eu-west-2"
 }

 resource "aws_security_group" "web_server" {
   name_prefix = "web-server-sg"

   ingress {
     from_port   = 80
     to_port     = 80
     protocol    = "tcp"
     cidr_blocks = ["0.0.0.0/0"]
   }

   ingress {
     from_port   = 443
     to_port     = 443
     protocol    = "tcp"
     cidr_blocks = ["0.0.0.0/0"]
   }

   ingress {
     from_port   = 22
     to_port     = 22
     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"]
     ipv6_cidr_blocks = ["::/0"]
   }

 }

 resource "aws_instance" "web_server" {
   ami           = "ami-0eb260c4d5475b901"
   instance_type = "t2.micro"
   key_name      = "devopschallenge-key"
   subnet_id     = "subnet-03ff724100ea66d8a"
   security_groups = [
     aws_security_group.web_server.id
   ]
   associate_public_ip_address = true

   user_data = <<-EOF
                 #!/bin/bash
                 sudo apt update
                 sudo apt install -y apache2
                 sudo systemctl start apache2
                 sudo systemctl enable apache2
                 echo "<html><body><h1>Welcome to my website!</h1></body></html>" > /var/www/html/index.html
                 EOF
 }

2. Note: Replace the ami and key_name values with your own. You can find a list of available AMIs in the AWS documentation.

3. Run terraform plan andterraform apply to create the EC2 instance using the Security Group created above.

Task 3: Access Your Website

Now that your EC2 instance is up and running, you can access the website you just hosted on it. Follow these steps:

  1. Obtain the public IP address of your EC2 instance either from the Terraform output or the AWS Management Console.

2. Open a web browser and enter the public IP address. You should see the message “Welcome to my website!” displayed.

Congratulations! You have successfully created a security group, provisioned an EC2 instance, and hosted a website using Terraform. Stay tuned for Day 66 of the #90daysofdevops challenge, where we’ll work on a new Terraform Hands-on Project.

I hope you learned something from this blog. If you have, don’t forget to follow and click the clap 👏 button below to show your support 😄. Subscribe to my blogs so that you won’t miss any future posts.

If you have any questions or feedback, feel free to leave a comment below. Thanks for reading and have an amazing day ahead!

LinkedIn: https://www.linkedin.com/in/trushid-hatmode/

GitHub: https://github.com/Trushid

90DaysOfDevOps

Part 1 of 50

This repository is a Challenge for the DevOps Community to get stronger in DevOps. This challenge starts on the 22nd octobe 2023 and in the next 90 Days we promise ourselves to become better at DevOps

More from this blog

Trushid's blog

90 posts

Proficient in DevOps, Cloud & SDLC including analysis, design. Scripting, testing, automation, version control, documentation and support