I'd add one critical piece: separate state files by environment and team ownership. I've seen teams try to manage everything in one state, and scaling becomes a nightmare—one typo risks the entire infrastructure.
What worked for me: one state per environment (staging/prod), organized by logical component. Use terraform_remote_state data sources for cross-stack references. This way teams own their boundaries clearly.
Also enforce state locking religently. I've watched people disable it "just this once" during deploys. Never again. DynamoDB locking saved us from concurrent modifications more than once.
The real win: pair this with clear RBAC on S3 and DynamoDB. State contains secrets and sensitive outputs—treat it like production data.
Ravi Menon
Cloud architect. AWS and serverless.