The Terraform AWS Provider covers basically every AWS service you'll actually use. Yeah, it takes a few weeks to support new AWS features, but that's still faster than waiting for your enterprise to approve CloudFormation changes. While Terraform supports thousands of providers, you're probably here because you got stuck with AWS and need something that doesn't completely suck.
AWS Service Coverage That Actually Matters
The AWS Provider supports way more resources than you'll ever touch - pretty much everything plus a ton of shit you'll never use. From the obvious like EC2 and S3 to the bizarre edge cases like Amazon Bedrock (which breaks half the time anyway) and some SageMaker resources that nobody outside of ML teams ever touches.
The coverage hits all the usual suspects - compute, storage, networking, databases, plus the security and monitoring stuff that actually matters. You don't have to remember which obscure AWS service needs which specific CloudFormation template - it's all there in the registry docs.
You can manage all your AWS stuff in one place instead of juggling 5 different tools. CloudFormation covers less and CDK makes you learn TypeScript just to deploy a bucket, while the AWS Provider has docs that mostly work and a community that might actually help.
Multi-Region Support Finally Doesn't Suck (v6.0+)
Before v6.0, setting up multi-region anything was provider alias hell. You'd end up with 12 provider blocks for 3 regions and hate your life. The AWS Provider v6.0 finally introduced enhanced region support that actually made sense for once.
The old way (v5.x nightmare):
## This was fucking terrible - provider aliases everywhere
provider \"aws\" {
alias = \"west\"
region = \"us-west-2\"
}
provider \"aws\" {
alias = \"east\"
region = \"us-east-1\"
}
resource \"aws_s3_bucket\" \"west_bucket\" {
provider = aws.west
bucket = \"my-west-bucket\"
}
resource \"aws_s3_bucket\" \"east_bucket\" {
provider = aws.east
bucket = \"my-east-bucket\"
}
## ...repeat for every region, every environment
The new way (v6.0+ - actually usable):
## Finally, just override regions per resource like a normal person
provider \"aws\" {
region = \"us-west-2\" # Default region
}
resource \"aws_s3_bucket\" \"west_bucket\" {
bucket = \"my-west-bucket\"
# Uses default region (us-west-2)
}
resource \"aws_s3_bucket\" \"east_bucket\" {
bucket = \"my-east-bucket\"
region = \"us-east-1\" # Override per resource - simple
}
This change alone is worth upgrading, even though the v6.0 migration will break half your configs and make you question your career choices. I wasted 3 days on provider alias bullshit before v6.0. The old syntax broke resource references in ways that still make no sense. At least now I can deploy to us-east-1 without wanting to quit. The migration process took way longer than their optimistic docs claimed - surprise, surprise.
Version 6.14.1: Finally Less Broken
The current stable release, v6.14.1, fixed some bugs that were pissing everyone off. Key improvements include:
- Fixed resource identity errors that made resources disappear during updates (GitHub issue #44366)
- Plugin SDK v2 updates that slightly improve performance and reduce memory leaks
- Enhanced error handling so you get less cryptic error messages when shit breaks
This release is stable enough for production use, unlike some earlier 6.x versions that had state corruption issues. Always pin to ~> 6.14.0
in your provider requirements - minor releases can still break things in weird ways.
The AWS Provider roadmap shows upcoming features, but don't hold your breath - they're always way behind schedule. For production stuff, stick with versions that have been out for a while and won't randomly break your infrastructure on a Tuesday.