DEV Community

Aisalkyn Aidarova
Aisalkyn Aidarova

Posted on

Terraform Lab: Using `locals` (Real Project Style)

πŸ“ Project Structure

terraform-locals-lab/
β”œβ”€β”€ main.tf
β”œβ”€β”€ variables.tf
β”œβ”€β”€ outputs.tf
β”œβ”€β”€ providers.tf
β”œβ”€β”€ terraform.tfvars
Enter fullscreen mode Exit fullscreen mode

1️⃣ providers.tf

provider "aws" {
  region = var.aws_region
}
Enter fullscreen mode Exit fullscreen mode

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
}
Enter fullscreen mode Exit fullscreen mode

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}"
}
Enter fullscreen mode Exit fullscreen mode

4️⃣ main.tf

resource "aws_s3_bucket" "this" {
  bucket = local.bucket_name

  tags = local.common_tags
}
Enter fullscreen mode Exit fullscreen mode

5️⃣ terraform.tfvars

aws_region    = "us-east-2"
project_name  = "jumptotech"
environment   = "dev"
bucket_suffix = "lab"
Enter fullscreen mode Exit fullscreen mode

6️⃣ outputs.tf

output "bucket_name" {
  value = local.bucket_name
}
Enter fullscreen mode Exit fullscreen mode

πŸš€ How to Run

terraform init
terraform plan
terraform apply
Enter fullscreen mode Exit fullscreen mode

πŸ” What You Will See

Bucket created like:

jumptotech-dev-lab
Enter fullscreen mode Exit fullscreen mode

πŸ‘‰ That name came from:

  • variable + locals (NOT hardcoded)

πŸ” Test Real DevOps Behavior

Change environment:

environment = "prod"
Enter fullscreen mode Exit fullscreen mode

πŸ‘‰ Run again:

terraform apply
Enter fullscreen mode Exit fullscreen mode

Now bucket becomes:

jumptotech-prod-lab
Enter fullscreen mode Exit fullscreen mode

🧠 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"
}
Enter fullscreen mode Exit fullscreen mode

Use it:

resource "aws_s3_bucket_versioning" "this" {
  bucket = aws_s3_bucket.this.id

  versioning_configuration {
    status = local.is_prod ? "Enabled" : "Suspended"
  }
}
Enter fullscreen mode Exit fullscreen mode

πŸ‘‰ 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)