Short-lived credentials matter more than secret storage alone
Encrypting a secret well is only half the problem. The bigger risk in most estates is long-lived credentials sitting in a CI variable for months: static AWS access keys, Azure client secrets, GCP service-account keys, static CI tokens. If one leaks, it's valid until someone remembers to rotate it.
Both ecosystems support moving away from that model. HCP Terraform and Terraform CLI can authenticate to major clouds via OIDC federation, issuing short-lived, scoped credentials for each run instead of storing a static key. Pulumi supports the same pattern, so the CLI or CI job requests a temporary token rather than holding a standing one.
The strongest IaC security model isn't simply encrypting long-lived credentials better. It's reducing the need for long-lived credentials in the first place.
Policy enforcement follows the hosting model on both sides. HCP Terraform runs policy through Sentinel and, where applicable, through OPA, organized into policy sets that attach at the workspace or organization level with run-level enforcement. Pulumi's CrossGuard evaluates during pulumi preview and pulumi up, with policies written in TypeScript, Python, or Rego via OPA, organized into policy packs with advisory or mandatory enforcement levels. If your governance requirement is "no public S3 buckets, ever, and prove it," both get you there. The real questions are where policy executes, when it blocks a deployment versus just warns, and how exceptions get requested and approved. For related implementation guidance, see DevSecOps practices.
Providers and delivery
Provider maturity used to be the strongest argument against Pulumi. Pulumi's Terraform bridge adapts providers from the Terraform ecosystem, and any Terraform or OpenTofu provider can now be pulled into a Pulumi program with pulumi package add. Pulumi also ships schema-generated native providers for AWS Cloud Control and Azure Native, which track new cloud services faster than hand-maintained providers do.
A bridged provider isn't automatically equivalent to its native Terraform counterpart, though. Feature availability, release timing, documentation quality, and edge-case behavior can differ between the bridged version and the original, and support paths aren't identical. Treat the bridge as a strong starting point, not a guarantee of parity.
Still, verify before you commit. If your estate depends on a niche provider, check that specific one against your specific resources. This is the single most common place where a promising evaluation of infrastructure as code tools falls apart three months in.
IaC as a platform engineering layer
A growing share of IaC decisions aren't really "which tool do our infrastructure engineers prefer" — they're "which engine sits behind the organization's golden paths for developers who never touch Terraform or Pulumi directly." A typical flow looks like:
Developer → Internal Developer Portal → Approved service template → Security + policy checks → Terraform / OpenTofu / Pulumi → Cloud infrastructure
On the Terraform side, that layer is built from modules, HCP Terraform, reusable workflows, Stacks (see below), and API-driven self-service integrations. On the Pulumi side, it's built from components, the Automation API, and Pulumi Deployments. Neither platform hands you a complete internal developer platform out of the box; both give you building blocks that still need a portal, templates, and policy wired around them.
Terraform's reuse model isn't limited to modules and workspaces. Terraform Stacks add orchestration for deploying and managing multiple related infrastructure components together, which is relevant if your comparison assumed Terraform's self-service story stops at the module registry.
Secure the IaC supply chain
Every provider and module you pull in is a dependency, and IaC supply-chain hygiene deserves the same discipline as application dependencies:
-
Pin provider and module versions explicitly; don't float on "latest."
-
Commit dependency lock files (.terraform.lock.hcl, Pulumi's package lock) and review diffs to them like code.
-
Restrict installs to approved registries, and vet third-party modules or components before adoption.
-
Verify provider provenance and checksums/signatures where the ecosystem supports them.
-
Define a process for evaluating and rolling out dependency updates, rather than upgrading ad hoc.
-
Harden CI runners and scope the deployment identity to least privilege, so a compromised pipeline can't do more than the pipeline is supposed to do.
Pulumi's general-purpose programming model somewhat widens the surface: a Pulumi program can pull in any package from npm or PyPI, not just infrastructure providers, but Terraform and OpenTofu depend on the same category of external providers and modules. Neither model is automatically secure; both need the same governance applied to them.
Delivery workflows look similar on paper and feel different in practice. For more on automating these workflows, review delivery pipelines:
-
Pull request previews: both tools post a diff to the PR. Pulumi's GitHub app comments the preview inline. Terraform teams typically wire this through Atlantis or HCP Terraform.
-
Approvals and gates: HCP Terraform has run tasks and policy gates built in. Pulumi Deployments offers review workflows on the hosted service. Self-managed setups on either side push this into the CI system, which means you own it.
Troubleshooting resources tilt toward Terraform on volume. It appeared in the 2025 Stack Overflow Developer Survey as one of the most-used cloud tools, and a decade of Stack Overflow answers and blog posts came with that. When something breaks at 2 a.m., that corpus has value.
Terraform alternatives and licensing
In August 2023, HashiCorp moved Terraform from the Mozilla Public License 2.0 to the Business Source License 1.1, which is source-available rather than open source. Versions through 1.5.7 remain MPL. Everything after is BUSL.
For most organizations, internal use is unaffected. You can run Terraform to provision your own infrastructure without a commercial agreement. The restriction bites when Terraform is embedded in something you sell, or offered as a managed service that overlaps with HashiCorp's paid products. If you run a platform team that offers infrastructure as a service to paying customers, that's a conversation for your counsel.
Then IBM completed its $6.4 billion acquisition of HashiCorp on February 27, 2025. Armon Dadgar, HashiCorp's co-founder and CTO, framed it as expansion: "By joining forces, we gain access to their global scale and increased R&D resources," he wrote at the time. The acquisition left the license in place and changed who controls the roadmap, and for some organizations that's a procurement question.
Pulumi's CLI and SDKs are Apache 2.0. Pulumi Cloud is the commercial layer on top, and you can skip it entirely with a self-managed backend. None of these licensing models is universally "better" because licensing matters when it affects procurement, redistribution, internal platform strategy, commercial packaging, or long-term governance requirements, and it matters differently depending on whether you're running IaC internally or reselling it as part of a managed service.
OpenTofu deserves its own evaluation among Terraform alternatives, not a footnote. It's a Terraform-compatible, open-source IaC project governed independently under the Linux Foundation, and it joined the CNCF as a sandbox project in April 2025. It remains the relevant option for organizations concerned about Terraform's licensing or governance direction. OpenTofu can provide a lower-friction migration path for teams that want to retain the Terraform/HCL operating model, but compatibility should still be validated against the organization's actual configurations, providers, modules, state behavior, and automation.
So the licensing branch produces three paths. If the BUSL is your only objection to Terraform, OpenTofu solves it without retraining anyone. If you want a different authoring model, that's a Pulumi conversation. Evaluating Terraform alternatives on license terms alone will land you on OpenTofu almost every time, which is fine, as long as that's actually the problem you were solving.