πŸ“Œ Mutable vs Immutable Infrastructure (Terraform)

🧱 Mutable Infrastructure

Info

Can be changed / modify

  • Can be changed/modify
  • Change existing resources in place
  • Terraform shows ~ (update)

🧊 Immutable Infrastructure

Success

Immutable == cannot be changed

  • Immutable == cannot be changed
  • Immutable resource has to be β€” -/+ (destroy & create) cannot be ~ (update)
  • Never allow to modify existing resources
  • Replace with new ones

βš™οΈ Terraform Behavior

Terraform

  • Decides replace vs update per resource
  • AMI / disk / db name β†’ replacement
  • Small config change β†’ in-place update

πŸ” Terraform Lifecycle Rules

πŸ“Œ What are lifecycle rules?

Note

Lifecycle rules control how Terraform creates, updates, and destroys resources.

Defined inside a resource block using:

lifecycle {
  ...
}

πŸ“Š Terraform Lifecycle Rules

Lifecycle RuleEffect on ResourcePurposeCommon Use Case
create_before_destroyCreates new resource first, then deletes oldAvoid downtime during replacementALB, ASG, EC2, zero-downtime deployments. Used for immutable deployments
prevent_destroyBlocks terraform destroy or replacementProtect critical resourcesMust Add On Prod DBs, VPCs, S3 buckets
ignore_changesTerraform won’t act on listed changesIgnore specific attribute updatesTags, autoscaling changes, external updates
replace_triggered_byResource replaced when referenced item changesForce replacement based on dependencyAMI change, config dependency refresh

Syntex

lifecycle {
  ignore_changes = [tags, user_data]    OR   ignore_changes = all
}
  • Forces replacement when another resource changes
lifecycle {
  replace_triggered_by = [aws_ami.new.id]
}