← Back to The Print Dispatches
TF
DEVOPSIntermediateMarch 5, 20248 min read
TerraformPulumiOpenTofuDevOpsInfrastructure as CodeAWS

Terraform vs Pulumi: The Battle for Infrastructure as Code in 2024

HashiCorp's BSL license change, the OpenTofu fork, and the rise of general-purpose language IaC.

TL;DR

HashiCorp's license change has fractured the Terraform ecosystem, accelerating enterprise migration toward Pulumi's general-purpose language approach and Kubernetes-native tools like Crossplane.

TFU
Cloud Native Desk
Verified Technical Dispatch

Executive Takeaways

Key Insights

HashiCorp's shift to the BSL license triggered the creation of OpenTofu, fracturing the Terraform ecosystem.

Pulumi allows developers to write IaC using familiar languages (TypeScript, Python, Go) instead of proprietary HCL.

CDK for Terraform (CDKTF) is HashiCorp's attempt to bridge the gap, but suffers from complex abstraction layers.

State management remains the hardest problem; Pulumi's Cloud offering competes directly with Terraform Cloud.

Crossplane presents a third paradigm, moving IaC into the Kubernetes control plane.

The BSL Earthquake and OpenTofu

For nearly a decade, Terraform was the undisputed king of Infrastructure as Code (IaC). Its domain-specific language, HCL, was the lingua franca of DevOps. However, in late 2023, HashiCorp changed Terraform's license from the open-source Mozilla Public License (MPL) to the Business Source License (BSL).

This change prohibited companies from offering competitive services built on Terraform. In response, the open-source community, backed by the Linux Foundation, forked Terraform 1.5.5 to create OpenTofu. This fork guarantees an open-source future but has fundamentally fractured the ecosystem.

Enterprises now face a difficult choice: stick with HashiCorp (and potentially pay exorbitant Terraform Cloud fees), migrate to OpenTofu (and hope the community maintains provider parity), or rethink their IaC strategy entirely.

HCL vs General Purpose Languages

The core architectural debate in IaC is declarative configuration versus imperative programming. Terraform uses HCL (HashiCorp Configuration Language), a declarative language designed specifically for infrastructure. It is highly readable but struggles with complex logic (loops, conditionals) and testing.

Pulumi takes the opposite approach. It allows developers to define infrastructure using general-purpose languages like TypeScript, Python, Go, and C#. This means developers can use standard `if/else` statements, `for` loops, and standard testing frameworks (like Jest or PyTest) to validate their infrastructure logic.

By using real programming languages, Pulumi drastically lowers the barrier to entry for application developers to write their own infrastructure, aligning perfectly with the "shift-left" DevOps philosophy.

📊

A recent developer survey showed that 68% of application developers prefer Pulumi's multi-language approach over learning HCL, citing better IDE integration and testing capabilities.

typescript snippet
// Pulumi: Creating AWS S3 buckets using standard TypeScript loops
import * as aws from "@pulumi/aws";

const environments = ["dev", "staging", "prod"];
const buckets = [];

for (const env of environments) {
    // Standard programming logic applied to infrastructure
    const bucket = new aws.s3.Bucket(`app-assets-${env}`, {
        acl: env === "prod" ? "private" : "public-read",
        tags: {
            Environment: env,
            ManagedBy: "Pulumi"
        }
    });
    buckets.push(bucket.id);
}

export const bucketNames = buckets;

The CDKTF Compromise

Recognizing the demand for general-purpose languages, HashiCorp released the Cloud Development Kit for Terraform (CDKTF). Similar to AWS CDK, it allows you to write TypeScript or Python, which is then synthesized into standard Terraform JSON before execution.

While conceptually sound, CDKTF adds a massive layer of abstraction. Debugging requires tracing errors from the synthesized JSON back to the original TypeScript code. It lacks the native execution elegance of Pulumi, which communicates directly with the cloud APIs via its language hosts.

Consequently, CDKTF is often viewed as a stopgap measure rather than a foundational architecture shift.

State Management and Ecosystem

Both Terraform and Pulumi require "state"—a mapping between the code you wrote and the actual resources in the cloud. Terraform state files are notoriously fragile. A corrupted state file or manual intervention in the AWS console can require hours of painful `terraform import` surgery.

Pulumi's state management is generally considered more robust. Pulumi Cloud offers superior secrets management natively, whereas Terraform often requires complex integrations with Vault or AWS Secrets Manager.

However, Terraform still holds a massive advantage in the provider ecosystem. If an obscure SaaS platform has an API, someone has written a Terraform provider for it. Pulumi combats this by bridging Terraform providers (allowing Pulumi to use TF providers under the hood), but native Pulumi providers offer a better experience.

FeatureTerraform (HCL)OpenTofuPulumi
LanguageHCLHCLTS, Python, Go, C#, Java
LicenseBSL (Proprietary)MPL (Open Source)Apache 2.0 (Open Source)
State ManagementS3/GCS or Terraform CloudS3/GCS or 3rd PartyPulumi Cloud or S3/GCS
TestingLimited (terratest)LimitedNative (Jest, PyTest)

Criticisms & Limitations: The Kubernetes Alternative

Both Terraform and Pulumi share a fundamental flaw: they operate via CLI pipelines. They run, update the cloud, and exit. If a developer manually changes a security group in the AWS console, the infrastructure drifts from the code until the next pipeline run.

This has led to the rise of Kubernetes-native IaC tools like Crossplane. Crossplane runs inside a Kubernetes cluster, constantly monitoring cloud resources and enforcing the desired state defined in YAML. It provides continuous reconciliation, completely eliminating configuration drift.

For organizations already deeply invested in Kubernetes, using Terraform or Pulumi to manage AWS resources feels archaic compared to managing everything through the Kubernetes API.

What This Means For Your Stack

If you have a massive existing Terraform codebase, do not rewrite it in Pulumi. The ROI isn't there. Instead, evaluate OpenTofu as a drop-in open-source replacement to avoid future HashiCorp licensing traps.

If you are starting a new greenfield project and want your application developers to own their infrastructure, adopt Pulumi. The ability to write infrastructure in the same language as your backend APIs (e.g., full-stack TypeScript) drastically accelerates development velocity.

For advanced Cloud Native organizations, look past both tools and investigate Crossplane to unify your application and infrastructure deployment pipelines within the Kubernetes control plane.

Sources & References

  1. [1]HashiCorp License Change Announcement
  2. [2]OpenTofu Manifesto

Related Dispatches

DEVOPS
Kubernetes 1.30 "Uwubernetes": Gateway API GA, Native Sidecars, and the Complexity Tax
DEVOPS
Docker in 2024: Pivoting from Runtime to the Developer Inner Loop
← Browse All Technical DispatchesExplore Vetted Courses ↗
Featured on Product Hunt100k+ Lifetime Visits

High-Signal Tech Education.
Zero Tuition. No Hidden Paywalls.

Browse editorially vetted certifications from Harvard, Google, freeCodeCamp, and top institutions — scored on our 4-point TFU Rubric.

Browse Directory ›Partner With TFU ›
• No Account Required• 100% Free Certifications• Authoritative 4-Part Rubric