Terraform Workspaces with Local Backend
Step-01: Introduction¶
- We are going to use Terraform Local Backend
- We are going to create 2 workspaces (default, dev) in addition to default workspace
- Update our terraform manifests to support
terraform workspace - Master the below listed
terraform workspacecommands - terraform workspace show
- terraform workspace list
- terraform workspace new
- terraform workspace select
- terraform workspace delete
Step-02: Review Terraform Configs and make changes¶
- Copy
terraform-manifestsfrom38-Terraform-Remote-State-Storage-and-Lockingand make following changes
Step-03: c1-versions.tf¶
- Remove Backend block from Terraform Settings block if any present
Step-04: c3-locals.tf¶
- What is ${terraform.workspace}? - It will get the workspace name
- Popular Usage-1: Using the workspace name as part of naming or tagging behavior
-
Popular Usage-2: Referencing the current workspace is useful for changing behavior based on the workspace. For example, for non-default workspaces, it may be useful to spin up smaller cluster sizes.
-
Replace
${var.environment}with${terraform.workspace}for all resource namesrg_name = "${var.business_unit}-${terraform.workspace}-${var.resoure_group_name}" vnet_name = "${var.business_unit}-${terraform.workspace}-${var.virtual_network_name}" snet_name = "${var.business_unit}-${terraform.workspace}-${var.subnet_name}" pip_name = "${var.business_unit}-${terraform.workspace}-${var.publicip_name}" nic_name = "${var.business_unit}-${terraform.workspace}-${var.network_interface_name}" vm_name = "${var.business_unit}-${terraform.workspace}-${var.virtual_machine_name}"
Step-05: c5-virtual-network.tf¶
- Update Public IP
domain_name_labelwith${terraform.workspace}# Create Public IP Address resource "azurerm_public_ip" "mypublicip" { name = local.pip_name resource_group_name = azurerm_resource_group.myrg.name location = azurerm_resource_group.myrg.location allocation_method = "Static" domain_name_label = "app1-${terraform.workspace}-${random_string.myrandom.id}" tags = local.common_tags }
Step-06: Create resources in default workspaces¶
- Default Workspace: Every initialized working directory has at least one workspace.
- If you haven't created other workspaces, it is a workspace named default
- For a given working directory, only one workspace can be selected at a time.
- Most Terraform commands (including provisioning and state manipulation commands) only interact with the currently selected workspace.
# Terraform Init terraform init # List Workspaces terraform workspace list # Output Current Workspace using show terraform workspace show # Terraform Plan terraform plan Observation: 1. The names of Resources should have "default" in them in place of environment 2. Resource Group Name: it-default-rg 3. Virtual Network: it-default-vnet 4. Subnet Name: it-default-subnet 5. Public IP Name: it-default-publicip 6. Network Interface Name: it-default-nic 7. Virtual Machine Name: it-default-vm # Terraform Apply terraform apply -auto-approve # Verify Verify the same in Azure Management console Observation: 1. The names of Resources should have "default" in them in place of environment 2. Resource Group Name: it-default-rg 3. Virtual Network: it-default-vnet 4. Subnet Name: it-default-subnet 5. Public IP Name: it-default-publicip 6. Network Interface Name: it-default-nic 7. Virtual Machine Name: it-default-vm # Access Application http://<public-ip-dns-name>
Step-07: Create New Workspace and Provision Infra¶
# Create New Workspace
terraform workspace new dev
# Verify the folder
cd terraform.tfstate.d
cd dev
ls
cd ../../
# Terraform Plan
terraform plan
Observation:
1. The names of Resources should have "dev" in them in place of environment
2. Resource Group Name: it-dev-rg
3. Virtual Network: it-dev-vnet
4. Subnet Name: it-dev-subnet
5. Public IP Name: it-dev-publicip
6. Network Interface Name: it-dev-nic
7. Virtual Machine Name: it-dev-vm
# Terraform Apply
terraform apply -auto-approve
# Verify Dev Workspace statefile
cd terraform.tfstate.d/dev
ls
cd ../../
Observation: You should fine "terraform.tfstate" in "current-working-directory/terraform.tfstate.d/dev" folder
# Verify Resources in Azure mgmt console
Observation:
1. The names of Resources should have "dev" in them in place of environment
2. Resource Group Name: it-dev-rg
3. Virtual Network: it-dev-vnet
4. Subnet Name: it-dev-subnet
5. Public IP Name: it-dev-publicip
6. Network Interface Name: it-dev-nic
7. Virtual Machine Name: it-dev-vm
# Access Application
http://<public-ip-dns-name>
Step-08: Switch workspace and destroy resources¶
- Switch workspace from
dev to defaultand destroy resources in default workspace
Step-09: Delete dev workspace¶
- We cannot delete "default" workspace
- We can delete workspaces which we created (dev, qa etc)
# Delete Dev Workspace terraform workspace delete dev Observation: Workspace "dev" is not empty. Deleting "dev" can result in dangling resources: resources that exist but are no longer manageable by Terraform. Please destroy these resources first. If you want to delete this workspace anyway and risk dangling resources, use the '-force' flag. # Switch to Dev Workspace terraform workspace select dev # Destroy Resources terraform destroy -auto-approve # Delete Dev Workspace terraform workspace delete dev Observation: Workspace "dev" is your active workspace. You cannot delete the currently active workspace. Please switch to another workspace and try again. # Switch Workspace to default terraform workspace select default # Delete Dev Workspace terraform workspace delete dev Observation: Successfully delete workspace dev # Verify In Azure mgmt console, all Resources should be deleted
Step-10: Clean-Up Local folder¶
References¶
🎉 New Course
Ultimate DevOps Real-World Project Implementation on AWS
$15.99
$84.99
81% OFF
DEVOPS2026FEB
Enroll Now on Udemy →
🎉 Offer