π Project Structure
terraform-locals-lab/
βββ main.tf
βββ variables.tf
βββ outputs.tf
βββ providers.tf
βββ terraform.tfvars
1οΈβ£ providers.tf
provider "aws" {
region = var.aws_region
}
2οΈβ£ variables.tf
π Only inputs (NO hardcoding)
variable "aws_region" {
type = string
}
variable "project_name" {
type = string
}
variable "environment" {
type = string
}
variable "bucket_suffix" {
type = string
}
3οΈβ£ locals (MAIN PART)
π This is where magic happens
locals {
name_prefix = "${var.project_name}-${var.environment}"
common_tags = {
Project = var.project_name
Environment = var.environment
ManagedBy = "Terraform"
}
bucket_name = "${local.name_prefix}-${var.bucket_suffix}"
}
4οΈβ£ main.tf
resource "aws_s3_bucket" "this" {
bucket = local.bucket_name
tags = local.common_tags
}
5οΈβ£ terraform.tfvars
aws_region = "us-east-2"
project_name = "jumptotech"
environment = "dev"
bucket_suffix = "lab"
6οΈβ£ outputs.tf
output "bucket_name" {
value = local.bucket_name
}
π How to Run
terraform init
terraform plan
terraform apply
π What You Will See
Bucket created like:
jumptotech-dev-lab
π That name came from:
- variable + locals (NOT hardcoded)
π Test Real DevOps Behavior
Change environment:
environment = "prod"
π Run again:
terraform apply
Now bucket becomes:
jumptotech-prod-lab
π§ What You Learned
β No hardcoding
β Reusable naming
β Centralized logic
β Clean production code
π₯ Bonus (VERY IMPORTANT)
Add logic (real interview level):
locals {
is_prod = var.environment == "prod"
}
Use it:
resource "aws_s3_bucket_versioning" "this" {
bucket = aws_s3_bucket.this.id
versioning_configuration {
status = local.is_prod ? "Enabled" : "Suspended"
}
}
π In prod β versioning ON
π In dev β OFF
π― Interview Ready Answer
π "In this lab, locals are used to dynamically generate resource names, centralize tagging strategy, and control behavior like enabling versioning based on environment."
Top comments (0)