Terraform vs Cloudformation
Terraform or Cloudformation for managing AWS infrastructure?
Published: Wednesday, Apr 19, 2023 Last modified: Wednesday, Oct 2, 2024
I have issues with Terraform, but I didn’t make clear why I prefer Cloudformation.
Terraform | Cloudformation | |
---|---|---|
Cloud agnostic | Oversold due to differences with providers | AWS only |
Modules | Often misunderstood but far easier to use | There are modules and “Transforms” though are not easy to use |
Toolchain | Great ecosystem of “shift left” tooling | AWS tooling only works once infrastructure created |
Language refactorability | HCL has some imperative constructs & offers alternate interfaces/abstractions | YAML describes the end state, i.e. solely declarative |
Native | State managed externally with lots of polling | “stacks” best maintain state & knows to wait without API retries |
Documentation | AWS Provider is a great reference, e.g. S3 | AWS’s is typically generated and misses notes, S3 |
Serverless
Terraform is particularly painful to provision Serverless functions due to the role, permissions, the “aws_iam_role_policy_attachment”, s3 bucket and other aspects like Cloudwatch and sns topics. A lot of boilerplate and not easy to get right for Terraform to deploy lambda.
AWS Severless Application Model (SAM), a Cloudformation “Transform” is much easier to use for deploying Serverless functions.
Toolchain: Shift left
Terraform has tooling to detect when declarations might violate security / organisational policies before it’s applied.
Terraform’s key plan and apply workflow is a good way to see the impact (including cost!) of changes before you apply. This makes it much easier to review infrastructure changes.
Cloudformation doesn’t have Terraform’s workflow and the AWS compliance tooling like AWS config only works once you’ve applied the changes. To catch issues is to carefully monitor your environments “path to production”, where impact of changes are tracked (via tags?) from dev to staging to production. AWS has a whole suite of Governance / security tools like GuardDuty, Billing, Cloudtrail, Config which are all need knowledge and experience to effectively use.
The future of Cloudformation
AWS’s Cloud Development Kit (CDK) is an imperative language that compiles to Cloudformation. However it has teething issues:
Learning CDK is a complete disaster. Anyone who thinks this is solution for developers is fooling themselves.
— Darren Shepherd (@ibuildthecloud) March 29, 2023
With CDK you can develop using any language of your choice as long as that language is Typescript.
— Darren Shepherd (@ibuildthecloud) March 30, 2023
The comparison between CF and TF is not really technical IMHO. TF + TF cloud is the clear winner in my mind. It’s borb from users just trying to get crap done and reflects that’s. Everything about CF and CDK is utter crap, but it’s AWS native. People don’t use AWS at this 1/2
— Darren Shepherd (@ibuildthecloud) April 20, 2023
Conclusion
The choice between Terraform and Cloudformation is not a clear cut one. For larger teams, Terraform’s “shift left”, flexibility and “blast radius” is industry proven. For smaller perhaps more knowledgable teams, Cloudformation’s simplicity and declarative nature is a good fit, depending on the use case.