DEV Community

Vishal Raju
Vishal Raju

Posted on • Edited on

A DEEP DIVE INTO TERRAFORM

What is Infrastructure as Code with Terraform?
Getting Started with Terraform on AWS
Infrastructure as Code (IaC) lets you manage infrastructure with configuration files. Terraform, HashiCorp's IaC tool, offers several
advantages as follows:
• Multi-Cloud Management: Manage resources across AWS, Azure, GCP, etc.
• Declarative Language: Write and maintain infrastructure code easily.
• State Management: Track resource changes with Terraform's state file.
• Version Control: Safely collaborate using version control systems.

Terraform Workflow

  1. Scope: Identify infrastructure needs.
  2. Author: Write configuration files.
  3. Initialize: Install necessary plugins.
  4. Plan: Preview changes.
  5. Apply: Implement the changes.

Collaboration and Tracking
• State File: Acts as the source of truth for your infrastructure.
• HCP Terraform: Share state securely, prevent race conditions, and integrate with VCS like GitHub.

Image description

1)Install Terraform
Creating Your First AWS EC2 Instance with Terraform
To get started with Terraform and AWS, follow these steps:

  1. Prerequisites: o Install Terraform CLI (1.2.0+) and AWS CLI. o Have an AWS account with credentials ready.
  2. Set AWS Credentials:
    bash
    Copy code
    $ export AWS_ACCESS_KEY_ID=
    $ export AWS_SECRET_ACCESS_KEY=

  3. Write Configuration:
    o Create a directory and main.tf file:
    bash
    Copy code
    $ mkdir learn-terraform-aws-instance
    $ cd learn-terraform-aws-instance
    $ touch main.tf
    o Paste the configuration into main.tf:
    hcl
    Copy code
    terraform {
    required_providers {
    aws = {
    source = "hashicorp/aws"
    version = "~> 4.16"
    }
    }

required_version = ">= 1.2.0"
}

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

resource "aws_instance" "app_server" {
ami = "ami-830c94e3"
instance_type = "t2.micro"

tags = {
Name = "ExampleAppServerInstance"
}
}

  1. Initialize and Apply Configuration: bash Copy code $ terraform init $ terraform apply
  2. Inspect State: bash Copy code $ terraform show That's it! You've now created your first AWS EC2 instance using Terraform. Explore further by modifying configurations and diving deeper into Terraform's capabilities. Happy provisioning!

2)Change infrastructure
Prerequisites
Ensure you have:
• Terraform CLI (1.2.0+) installed.
• AWS CLI configured with a default profile.
Setting Up Your Project

  1. Create Directory and Configuration File: Start by creating a directory and main.tf file: bash Copy code $ mkdir learn-terraform-aws-instance $ cd learn-terraform-aws-instance $ touch main.tf
  2. Configure main.tf: Add AWS instance configuration to main.tf: hcl Copy code terraform { required_providers { aws = { source = "hashicorp/aws" version = "~> 4.16" } }

required_version = ">= 1.2.0"
}

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

resource "aws_instance" "app_server" {
ami = "ami-830c94e3"
instance_type = "t2.micro"

tags = {
Name = "ExampleAppServerInstance"
}
}

  1. Initialize and Apply Configuration: Initialize and apply your configuration: bash Copy code $ terraform init $ terraform apply

3)Updating Infrastructure
To update instance configuration (e.g., change AMI):

  1. Modify main.tf: Update ami under aws_instance.app_server: diff Copy code resource "aws_instance" "app_server" {
  2. ami = "ami-830c94e3"
  3. ami = "ami-08d70e59c07c61a3a" // New AMI ID instance_type = "t2.micro"
  4. Apply Changes: Apply changes to update the instance: bash Copy code $ terraform apply Execution Plan • Terraform's plan (terraform apply) shows actions like creating new resources or updating existing ones. • Changing the AMI forces recreation (-/+ destroy and then create replacement) due to AWS constraints. Conclusion Terraform simplifies AWS resource management with automation and consistency.

4)Destroy infrastructure
Managing Infrastructure Lifecycle with Terraform
In this tutorial, you've learned how to create and update an EC2 instance on AWS using Terraform. Now, let's explore how to destroy resources when they are no longer needed.
Why Destroy?
• Cost Reduction: Stop paying for unused resources.
• Security: Minimize exposure by removing unnecessary components.
Destroying Resources
To destroy managed resources:
bash
Copy code
$ terraform destroy
Execution Plan
Terraform outlines what will be destroyed:
text
Copy code

  • destroy

Terraform will perform the following actions:

# aws_instance.app_server will be destroyed

  • resource "aws_instance" "app_server" {
    • ami = "ami-08d70e59c07c61a3a" -> null
    • arn = "arn:aws:ec2:us-west-2:561656980159:instance/i-0fd4a35969bd21710" -> null ##...

Plan: 0 to add, 0 to change, 1 to destroy.
Confirm and Execute
Terraform requires confirmation before proceeding:
text
Copy code
Do you really want to destroy all resources?
Terraform will destroy all your managed infrastructure, as shown above.
There is no undo. Only 'yes' will be accepted to confirm.

Enter a value:
Finalization
Once confirmed, Terraform begins destroying the resources:
text
Copy code
aws_instance.app_server: Destroying... [id=i-0fd4a35969bd21710]
aws_instance.app_server: Destruction complete after 31s

Destroy complete! Resources: 1 destroyed.
Conclusion
By following these steps, you've seen how Terraform efficiently manages the lifecycle of your cloud infrastructure, ensuring cost-effectiveness and security.

5)Define input variables
Streamlining Infrastructure Management with Terraform Variables
In this tutorial, you'll optimize your Terraform setup by introducing variables for more flexible infrastructure configuration.
Prerequisites
Ensure:
• Terraform CLI (1.2.0+) is installed.
• AWS CLI is configured with a default profile.
• Directory learn-terraform-aws-instance exists with main.tf configured as specified.
Configuring Variables

  1. Create variables.tf: Define a instance_name variable to customize the EC2 instance's Name tag: hcl Copy code variable "instance_name" { description = "Name tag for the EC2 instance" type = string default = "ExampleAppServerInstance" }
  2. Update main.tf: Modify the aws_instance resource to utilize the instance_name variable: hcl Copy code resource "aws_instance" "app_server" { ami = "ami-08d70e59c07c61a3a" instance_type = "t2.micro"

tags = {
Name = var.instance_name
}
}
Applying Configuration

  1. Initialize and Apply: Initialize Terraform and apply the configuration: bash Copy code $ terraform init $ terraform apply
  2. Customize Instance Name: Override the default instance name using -var flag during apply: bash Copy code $ terraform apply -var "instance_name=YetAnotherName" Verification • Terraform presents an execution plan before applying changes for clarity and safety. • Confirm changes when prompted, observing Terraform's efficient handling of resource updates. Conclusion By using Terraform variables, you've enhanced your infrastructure's adaptability and reduced configuration repetition.

6)Query data with outputs
Streamlining Terraform with Output Values
In this guide, we'll maximize Terraform's capabilities by utilizing output values to extract essential information about our AWS infrastructure.
Prerequisites
Ensure:
• Terraform CLI (1.2.0+) is installed.
• AWS CLI is configured with a default profile.
• You have a directory named learn-terraform-aws-instance with configured main.tf and variables.tf.
Initial Setup
Recap your current configuration in main.tf and variables.tf:
hcl
Copy code

main.tf

terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.16"
}
}

required_version = ">= 1.2.0"
}

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

resource "aws_instance" "app_server" {
ami = "ami-08d70e59c07c61a3a"
instance_type = "t2.micro"

tags = {
Name = var.instance_name
}
}

variables.tf

variable "instance_name" {
description = "Name tag for the EC2 instance"
type = string
default = "ExampleAppServerInstance"
}
Defining Outputs
Create outputs.tf to specify outputs for the instance's ID and public IP:
hcl
Copy code

outputs.tf

output "instance_id" {
description = "ID of the EC2 instance"
value = aws_instance.app_server.id
}

output "instance_public_ip" {
description = "Public IP address of the EC2 instance"
value = aws_instance.app_server.public_ip
}
Applying Configuration

  1. Initialize and Apply Configuration: bash Copy code $ terraform init $ terraform apply
  2. Inspect Output Values: Upon applying, Terraform displays outputs such as instance_id and instance_public_ip, crucial for managing and automating your infrastructure. bash Copy code Outputs:

instance_id = "i-0bf954919ed765de1"
instance_public_ip = "54.186.202.254"
Conclusion
Utilizing Terraform outputs enhances operational visibility and automation by providing essential resource details. These outputs are seamlessly integrable with other infrastructure components or subsequent Terraform projects.
Cleanup (Optional)
If not continuing to further tutorials, clean up your infrastructure:
bash
Copy code
$ terraform destroy
Confirm destruction to optimize cost and security by removing unused resources.

7)Store remote state
Getting Started with Terraform and HCP Terraform
Overview
Terraform simplifies infrastructure management by treating it as code. This guide helps you set up Terraform to provision AWS resources and integrate with HashiCorp Cloud Platform (HCP) Terraform for centralized state management.
Prerequisites

  1. Configuration Setup: Create a directory named learn-terraform-aws-instance and save the following in main.tf: hcl Copy code terraform { required_providers { aws = { source = "hashicorp/aws" version = "~> 4.16" } } required_version = ">= 1.2.0" }

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

resource "aws_instance" "app_server" {
ami = "ami-08d70e59c07c61a3a"
instance_type = "t2.micro"
}

  1. Initialize and Apply: Initialize Terraform and apply your configuration: bash Copy code $ terraform init $ terraform apply Setting up HCP Terraform
  2. Log in to HCP Terraform: Use the Terraform CLI to log in and authenticate with HCP Terraform: bash Copy code $ terraform login
  3. Configure for HCP Terraform: Modify main.tf to integrate with HCP Terraform: hcl Copy code terraform { cloud { organization = "organization-name" workspaces { name = "learn-terraform-aws" } }

required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.16"
}
}
}

  1. Initialize and Migrate State: Re-initialize Terraform to migrate state to HCP Terraform: bash Copy code $ terraform init Confirm migration and delete the local state file.

Applying Configuration and Managing Workspace

  1. Set Workspace Variables: Configure AWS credentials in HCP Terraform's workspace variables.
  2. Apply Configuration: Apply your Terraform configuration to ensure infrastructure consistency: bash Copy code $ terraform apply Destroying Infrastructure Clean up resources using: bash Copy code $ terraform destroy

Conclusion
You've completed the essentials for Terraform and HCP Terraform integration

Image description

Frequently Asked Questions:-
1.Do I need prior programming or infrastructure experience to follow the guide?
No, prior programming or infrastructure experience is not necessary to follow the guide. It is designed to cater to beginners and assumes no prior knowledge of Terraform. The guide provides step-by-step explanations and examples to help newcomers understand and apply the concepts effectively.

2.Are there any prerequisites for using Terraform?
The guide may mention a few prerequisites, such as having a basic understanding of cloud computing concepts and having an account with a cloud provider (if you plan to provision resources in the cloud). Additionally, it may recommend installing Terraform and a text editor suitable for writing code.

3.Does the guide provide hands-on examples and exercises?
Yes, the Terraform Beginner's Guide typically includes hands-on examples and exercises throughout the content. These examples help solidify the concepts and allow readers to practice writing Terraform configurations, executing commands, and managing infrastructure resources.

4.How does Infrastructure as Code handle infrastructure updates and changes?
Infrastructure as Code tools typically handle updates and changes by comparing the desired state defined in the code with the current state of the infrastructure. When changes are made to the code, the tools generate an execution plan that outlines the modifications required to achieve the desired state. This plan can be reviewed and then applied to update or modify the infrastructure accordingly.

5.Can I use Infrastructure as Code for existing infrastructure?
Yes, Infrastructure as Code can be used for existing infrastructure. By defining the existing infrastructure in code, you can capture its current state and make modifications to it using code-based configuration files. This approach allows you to manage existing infrastructure in a consistent and automated manner.

Top comments (0)