CloudFormation & Crossplane
Cloud-native and Kubernetes-native IaC.
Two more provisioning tools round out the landscape, each tied to a specific world. AWS CloudFormation is Amazon’s native IaC — it provisions AWS resources from YAML/JSON templates, is deeply integrated with AWS (it manages state for you as "stacks", and knows every service immediately), and requires no extra tooling on AWS. Its limitation is the flip side: it is AWS-only, so a multi-cloud or cloud-agnostic team usually prefers Terraform. You will meet CloudFormation constantly in AWS-centric organizations and in AWS’s own documentation and services.
Resources:WebServer:Type: AWS::EC2::Instance # AWS-native resource typesProperties:ImageId: ami-0abc123InstanceType: t3.microTags: [{ Key: Name, Value: web-server }]# deployed as a "stack"; AWS tracks state for you — no separate state file to manage
CloudFormation vs Terraform on AWS
On AWS specifically, the choice is real. CloudFormation manages state for you (no S3 backend to set up), has same-day support for new AWS features, and integrates with AWS-native workflows and rollback. Terraform is cloud-agnostic (one tool for AWS, Azure, GCP, and everything else), has a larger module ecosystem, and many find its HCL and plan output friendlier. Teams all-in on AWS sometimes prefer CloudFormation (or the CDK, which generates it from real code); teams valuing one workflow across clouds prefer Terraform. Both are declarative with the same core ideas.
Crossplane: infrastructure through Kubernetes
Crossplane is a newer, distinctly different approach: it provisions cloud infrastructure using Kubernetes itself as the control plane. You declare cloud resources as Kubernetes custom resources (a "database" or "bucket" as a K8s object), and Crossplane’s controllers continuously reconcile the real cloud resources to match — bringing Kubernetes’ desired-state reconciliation and GitOps model to cloud provisioning. It appeals to platform teams already living in Kubernetes who want to offer self-service infrastructure through the same API, and it is inherently continuous (always reconciling) rather than run-on-demand like Terraform.