Provisioning a new cloud environment took 4+ weeks of manual click-ops. Every environment was slightly different from the last — configuration drift meant 'it works in staging' was meaningless.
Built Terraform modules for VPCs, EKS, and RDS. Orchestrated via GitHub Actions with S3/DynamoDB remote state. Enforced compliance with tfsec on every PR.
Built reusable modules for VPCs (with public/private subnet patterns), EKS clusters, and RDS instances with parameter groups. Remote state in S3 with DynamoDB locking — no concurrent apply conflicts.
module "eks" {
source = "terraform-aws-modules/eks/aws"
cluster_name = var.cluster_name
cluster_version = "1.29"
vpc_id = var.vpc_id
subnet_ids = var.private_subnet_ids
node_groups = {
default = {
instance_types = ["t3.medium"]
min_size = 2
max_size = 10
desired_size = 3
}
}
}GitHub Actions runs tfsec (security scan) and terraform plan on every PR. Plan output is posted as a PR comment. On merge to main, terraform apply runs with the locked plan file.
- name: Security scan
uses: aquasecurity/tfsec-action@v1
with:
soft_fail: false
- name: Terraform plan
run: terraform plan -out=tfplan
- name: Comment plan on PR
uses: borchero/terraform-plan-comment@v1New environment provisioning dropped from 4 weeks to 15 minutes. 100% configuration consistency across all environments. Compute costs cut 15% via automated dev teardown.
"Infrastructure code now lives in Git, gets reviewed like application code, and deploys automatically. The team stopped being afraid of infrastructure changes."