Most infrastructure problems are not technical. They are archaeological. Someone changed a security group eight months ago, nobody wrote it down, and now you are reverse-engineering a production system by clicking through a console. Infrastructure as Code (IaC) is the way out.
What “as code” actually buys you
Defining your servers, networks, and permissions in files - Terraform, Pulumi, CloudFormation - is not about looking modern. It buys three concrete things:
- A diff. Every change is a reviewable pull request, not a silent click.
- A source of truth. The repo says what should exist. Drift becomes visible instead of invisible.
- Reproducibility. You can rebuild the whole stack in a fresh account and get the same result.
Start smaller than you think
The common mistake is trying to codify everything at once. Don’t. Pick one painful, hand-managed piece - usually networking or IAM - and bring just that under code.
resource "aws_security_group" "web" {
name = "web-tier"
description = "HTTP/HTTPS from the load balancer only"
vpc_id = var.vpc_id
ingress {
from_port = 443
to_port = 443
protocol = "tcp"
security_groups = [aws_security_group.alb.id]
}
}
That is a rule anyone can read, review, and trust. No more “I think port 8080 is open, let me check.”
State is the part people underestimate
Terraform keeps a state file mapping your code to real resources. Treat it like a production database: store it remotely, lock it, back it up, never edit it by hand. Most IaC horror stories are really state-management horror stories.
The payoff
Once infrastructure lives in git, the console stops being where you make changes and becomes where you look at them. That single shift - from clicking to reviewing - is what turns infrastructure from something you remember into something you manage.