Skip to content

Terraform Resource Meta-Argument depends_on

Step-01: Introduction

  • Create 9 aws resources in a step by step manner
  • Create Terraform Block
  • Create Provider Block
  • Create 9 Resource Blocks
  • Create VPC
  • Create Subnet
  • Create Internet Gateway
  • Create Route Table
  • Create Route in Route Table for Internet Access
  • Associate Route Table with Subnet
  • Create Security Group in the VPC with port 80, 22 as inbound open
  • Create EC2 Instance in respective new vpc, new subnet created above with a static key pair, associate Security group created earlier
  • Create Elastic IP Address and Associate to EC2 Instance
  • Use depends_on Resource Meta-Argument attribute when creating Elastic IP

Step-02: Pre-requisite - Create a EC2 Key Pair

  • Create EC2 Key pair terraform-key and download pem file and put ready for SSH login

Step-03: c1-versions.tf - Create Terraform & Provider Blocks

  • Create Terraform Block
  • Create Provider Block
    # Terraform Block
    terraform {
      required_version = "~> 0.14.6"
      required_providers {
        aws = { 
          source = "hashicorp/aws"
          version = "~> 3.0"
        }
      }
    }
    
    # Provider Block
    provider "aws" {
      region = "us-east-1"
      profile = "default"
    }
    

Step-04: c2-vpc.tf - Create VPC Resources

Step-04-01: Create VPC using AWS Management Console

  • Create VPC Manually and understand all the resources we are going to create. Delete that VPC and start writing the VPC template using terraform

Step-04-02: Create VPC using Terraform

  • Create VPC Resources listed below
  • Create VPC
  • Create Subnet
  • Create Internet Gateway
  • Create Route Table
  • Create Route in Route Table for Internet Access
  • Associate Route Table with Subnet
  • Create Security Group in the VPC with port 80, 22 as inbound open
    # Resource Block
    # Resource-1: Create VPC
    resource "aws_vpc" "vpc-dev" {
      cidr_block = "10.0.0.0/16"
    
      tags = {
        "name" = "vpc-dev"
      }
    }
    
    # Resource-2: Create Subnets
    resource "aws_subnet" "vpc-dev-public-subnet-1" {
      vpc_id = aws_vpc.vpc-dev.id
      cidr_block = "10.0.1.0/24"
      availability_zone = "us-east-1a"
      map_public_ip_on_launch = true
    }
    
    
    # Resource-3: Internet Gateway
    resource "aws_internet_gateway" "vpc-dev-igw" {
      vpc_id = aws_vpc.vpc-dev.id
    }
    
    # Resource-4: Create Route Table
    resource "aws_route_table" "vpc-dev-public-route-table" {
      vpc_id = aws_vpc.vpc-dev.id
    }
    
    # Resource-5: Create Route in Route Table for Internet Access
    resource "aws_route" "vpc-dev-public-route" {
      route_table_id = aws_route_table.vpc-dev-public-route-table.id 
      destination_cidr_block = "0.0.0.0/0"
      gateway_id = aws_internet_gateway.vpc-dev-igw.id 
    }
    
    
    # Resource-6: Associate the Route Table with the Subnet
    resource "aws_route_table_association" "vpc-dev-public-route-table-associate" {
      route_table_id = aws_route_table.vpc-dev-public-route-table.id 
      subnet_id = aws_subnet.vpc-dev-public-subnet-1.id
    }
    
    # Resource-7: Create Security Group
    resource "aws_security_group" "dev-vpc-sg" {
      name = "dev-vpc-default-sg"
      vpc_id = aws_vpc.vpc-dev.id
      description = "Dev VPC Default Security Group"
    
      ingress {
        description = "Allow Port 22"
        from_port   = 22
        to_port     = 22
        protocol    = "tcp"
        cidr_blocks = ["0.0.0.0/0"]
      }
    
      ingress {
        description = "Allow Port 80"
        from_port   = 80
        to_port     = 80
        protocol    = "tcp"
        cidr_blocks = ["0.0.0.0/0"]
      }
    
      egress {
        description = "Allow all ip and ports outboun"
        from_port   = 0
        to_port     = 0
        protocol    = "-1"
        cidr_blocks = ["0.0.0.0/0"]
      }
    
    }
    

Step-05: c3-ec2-instance.tf - Create EC2 Instance Resource

  • Review apache-install.sh
    #! /bin/bash
    sudo yum update -y
    sudo yum install -y httpd
    sudo service httpd start  
    sudo systemctl enable httpd
    echo "<h1>Welcome to StackSimplify ! AWS Infra created using Terraform in us-east-1 Region</h1>" > /var/www/html/index.html
    
  • Create EC2 Instance Resource
    # Resource-8: Create EC2 Instance
    resource "aws_instance" "my-ec2-vm" {
      ami = "ami-0be2609ba883822ec" # Amazon Linux
      instance_type = "t2.micro"
      subnet_id = aws_subnet.vpc-dev-public-subnet-1.id
      key_name = "terraform-key"
        #user_data = file("apache-install.sh")
      user_data = <<-EOF
        #!/bin/bash
        sudo yum update -y
        sudo yum install httpd -y
        sudo systemctl enable httpd
        sudo systemctl start httpd
        echo "<h1>Welcome to StackSimplify ! AWS Infra created using Terraform in us-east-1 Region</h1>" > /var/www/html/index.html
        EOF  
      vpc_security_group_ids = [ aws_security_group.dev-vpc-sg.id ]
    }
    

Step-06: c4-elastic-ip.tf - Create Elastic IP Resource

  • Create Elastic IP Resource
  • Add a Resource Meta-Argument depends_on ensuring Elastic IP gets created only after AWS Internet Gateway in a VPC is present or created
    # Resource-9: Create Elastic IP
    resource "aws_eip" "my-eip" {
      instance = aws_instance.my-ec2-vm.id
      vpc = true
      depends_on = [ aws_internet_gateway.vpc-dev-igw ]
    }
    

Step-07: Execute Terraform commands to Create Resources using Terraform

# Initialize Terraform
terraform init

# Terraform Validate
terraform validate

# Terraform Plan to Verify what it is going to create / update / destroy
terraform plan

# Terraform Apply to Create EC2 Instance
terraform apply 

Step-08: Verify the Resources

  • Verify VPC
  • Verify EC2 Instance
  • Verify Elastic IP
  • Review the terraform.tfstate file
  • Access Apache Webserver Static page using Elastic IP
    # Access Application
    http://<AWS-ELASTIC-IP>
    

Step-09: Destroy Terraform Resources

# Destroy Terraform Resources
terraform destroy

# Remove Terraform Files
rm -rf .terraform*
rm -rf terraform.tfstate*

References

🎉 New Course
Ultimate DevOps Real-World Project Implementation on AWS
$15.99 $84.99 81% OFF
MARCH2026
Enroll Now on Udemy →
🎉 Offer