Setup Terraform
Use this skill when the user asks to set up Terraform, infrastructure as code, cloud provisioning, or IaC.
Steps
- Initialize the project structure
infra/ ├── main.tf ├── variables.tf ├── outputs.tf ├── terraform.tfvars # (gitignored) ├── providers.tf └── modules/ - Configure the provider — in
providers.tf:terraform {required_version = ">= 1.5" required_providers {aws = {source = "hashicorp/aws" version = "~> 5.0"}} backend "s3" {bucket = "my-terraform-state" key = "prod/terraform.tfstate" region = "us-east-1"}} provider "aws" {region = var.aws_region}Adapt the provider for the user's cloud (AWS, GCP, Azure). - Define variables — in
variables.tf, define inputs with types, descriptions, and defaults:variable "aws_region" {type = string default = "us-east-1" description = "AWS region for resources"} variable "environment" {type = string description = "Deployment environment (dev, staging, prod)"} - Create resources — in
main.tf, define the infrastructure the user needs (VPC, RDS, ECS, S3, Lambda, etc.). Extract reusable patterns into modules undermodules/. - Configure remote state — use an S3 bucket (AWS), GCS bucket (GCP), or Azure Storage for state. Enable state locking with DynamoDB (AWS).
- Add to
.gitignore*.tfstate *.tfstate.*.terraform/ terraform.tfvars *.tfvars - Add CI pipeline — create a GitHub Actions workflow that runs
terraform fmt -check,terraform validate, andterraform planon PRs, withterraform applyon merge to main (with approval gate).
Notes
- Never commit state files or
.tfvarswith secrets. - Use workspaces or separate state files for dev/staging/prod.
- Pin provider versions to avoid breaking changes.
- Run
terraform fmtbefore committing.