Terraform Resource Meta-Argument depends_on
Step-01: Introduction
- We will create the below Azure Resources using Terraform
- Azure Resource Group
- Azure Virtual Network
- Azure Subnet
- Azure Public IP
- Azure Network Interface
- Use
depends_on
Resource Meta-Argument attribute when creating Azure Public IP
- Create Terraform Block
- Create Provider Block
- Create Random Resource Block
# Terraform Block
terraform {
required_version = ">= 1.0.0"
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = ">= 2.0"
}
random = {
source = "hashicorp/random"
version = ">= 3.0"
}
}
}
# Provider Block
provider "azurerm" {
features {}
}
# Random String Resource
resource "random_string" "myrandom" {
length = 6
upper = false
special = false
number = false
}
Step-03: c2-resource-group.tf
# Resource-1: Azure Resource Group
resource "azurerm_resource_group" "myrg" {
name = "myrg-1"
location = "East US"
}
Step-04: c3-vritual-network.tf - Virtual Network Resource
# Create Virtual Network
resource "azurerm_virtual_network" "myvnet" {
name = "myvnet-1"
address_space = ["10.0.0.0/16"]
location = azurerm_resource_group.myrg.location
resource_group_name = azurerm_resource_group.myrg.name
}
Step-05: c3-vritual-network.tf - Azure Subnet Resource
# Create Subnet
resource "azurerm_subnet" "mysubnet" {
name = "mysubnet-1"
resource_group_name = azurerm_resource_group.myrg.name
virtual_network_name = azurerm_virtual_network.myvnet.name
address_prefixes = ["10.0.2.0/24"]
}
Step-06: c3-vritual-network.tf - Azure Public IP Resource
# Create Public IP Address
resource "azurerm_public_ip" "mypublicip" {
name = "mypublicip-1"
resource_group_name = azurerm_resource_group.myrg.name
location = azurerm_resource_group.myrg.location
allocation_method = "Static"
domain_name_label = "app1-vm-${random_string.myrandom.id}"
tags = {
environment = "Dev"
}
}
Step-07: c3-vritual-network.tf - Network Interface Resource
# Create Network Interface
resource "azurerm_network_interface" "myvmnic" {
name = "vmnic"
location = azurerm_resource_group.myrg.location
resource_group_name = azurerm_resource_group.myrg.name
ip_configuration {
name = "internal"
subnet_id = azurerm_subnet.mysubnet.id
private_ip_address_allocation = "Dynamic"
public_ip_address_id = azurerm_public_ip.mypublicip.id
}
}
# Change Directory
cd terraform-manifests-v1
# Initialize Terraform
terraform init
# Terraform Validate
terraform validate
# Terraform Plan
terraform plan
# Terraform Apply
terraform apply
# Observation
1. Public IP Resource will get created in parallel with Virtual Network Resource
# Terraform Destroy
terraform destroy -auto-approve
# Clean-Up
rm -rf .terraform*
rm -rf terraform.tfstate*
Step-09: c3-virtual-network.tf - depends_on for azurerm_public_ip
- We will review this in
terraform-manifests-v2
folder
# Create Public IP Address
resource "azurerm_public_ip" "mypublicip" {
# Add Explicit Dependency to have this resource created only after Virtual Network and Subnet Resources are created.
depends_on = [
azurerm_virtual_network.myvnet,
azurerm_subnet.mysubnet
]
name = "mypublicip-1"
resource_group_name = azurerm_resource_group.myrg.name
location = azurerm_resource_group.myrg.location
allocation_method = "Static"
domain_name_label = "app1-vm-${random_string.myrandom.id}"
tags = {
environment = "Dev"
}
}
# Change Directory
cd terraform-manifests-v2
# Initialize Terraform
terraform init
# Terraform Validate
terraform validate
# Terraform Plan
terraform plan
# Terraform Apply
terraform apply
# Observation
1. Public IP Resource will get created only afer Virtual Network and Subnet Resource got created.
2. As we have defined explicit dependency `depends_on` in Public IP Resource, it will wait till those two other resources got created.
3. Important Point to remember is "Explicitly specifying a dependency is only necessary when a resource or module relies on some other resource's behavior but doesn't access any of that resource's data in its arguments."
# Terraform Destroy
terraform destroy -auto-approve
# Clean-Up
rm -rf .terraform*
rm -rf terraform.tfstate*
References
- Azure Resource Group
- Azure Virtual Network
- Azure Subnet
- Azure Public IP
- Azure Network Interface
- Azure Virtual Machine