Skip to main content

AI & assistant-friendly summary

This section provides structured content for AI assistants and search engines. You can cite or summarize it when referencing this page.

Summary

June 2026 benchmark on the same read-only AWS scaffold: OpenTofu 1.12 plan median 5.2s vs Pulumi 3.248 preview median 10.6s—plus when to pick HCL over TypeScript on landing zones.

Key Facts

  • June 2026 benchmark on the same read-only AWS scaffold: OpenTofu 1
  • 12 plan median 5
  • 2s vs Pulumi 3
  • 248 preview median 10
  • 6s—plus when to pick HCL over TypeScript on landing zones

Entity Definitions

S3
S3 is an AWS service discussed in this article.
DynamoDB
DynamoDB is an AWS service discussed in this article.
IAM
IAM is an AWS service discussed in this article.
VPC
VPC is an AWS service discussed in this article.
EKS
EKS is an AWS service discussed in this article.
multi-tenant
multi-tenant is a cloud computing concept discussed in this article.
microservices
microservices is a cloud computing concept discussed in this article.
DevOps
DevOps is a cloud computing concept discussed in this article.

Terraform & OpenTofu vs Pulumi on AWS: 2026 Decision Guide With Benchmarks

DevOps & CI/CDPalaniappan P7 min read

Quick summary: June 2026 benchmark on the same read-only AWS scaffold: OpenTofu 1.12 plan median 5.2s vs Pulumi 3.248 preview median 10.6s—plus when to pick HCL over TypeScript on landing zones.

Key Takeaways

  • June 2026 benchmark on the same read-only AWS scaffold: OpenTofu 1
  • 12 plan median 5
  • 2s vs Pulumi 3
  • 248 preview median 10
  • 6s—plus when to pick HCL over TypeScript on landing zones
Terraform & OpenTofu vs Pulumi on AWS: 2026 Decision Guide With Benchmarks
Table of Contents

As of 26 June 2026, practitioner threads—including r/devops debates on Terraform, OpenTofu, and Pulumi—still treat three tools as one decision. They are two. Decision 1: HashiCorp Terraform (BSL) versus OpenTofu 1.12.x (MPL, Linux Foundation). Decision 2: the HCL lane versus Pulumi 3.x (TypeScript, Python, Go, .NET). On AWS, the second decision changes hiring, CI shape, and migration cost far more than the first.

This guide stays AWS-specific: S3 + DynamoDB state, hashicorp/aws ~> 6.x, Organizations landing zones, Checkov/tfsec gates. We ran a first-party benchmark on the extended examples/aws-iac-decision-demo scaffold—same read-only caller-identity stack, zero creates—and cite median wall-clock numbers below. For Ansible layering and mutable configuration, see the companion Terraform vs OpenTofu vs Ansible guide. For AWS-native TypeScript that synthesizes CloudFormation, see Terraform vs AWS CDK.

Freshness check (June 2026)

Validate pins before production sign-off:

Two decisions, not three badges

Decision 1 — engine inside the HCL lane. Terraform and OpenTofu share HCL, provider graphs, and interchangeable state. OpenTofu adds MPL governance, client-side state encryption (1.11+), ephemeral resources, and early variable evaluation that Terraform OSS has not matched as of mid-2026. HashiCorp Terraform retains Stacks, Sentinel on HCP, and enterprise support bundles. For new HCL roots on AWS, we recommend OpenTofu unless you are already standardized on HashiCorp commercial SKUs. Migration mechanics: Migrate Terraform to OpenTofu.

Decision 2 — HCL versus general-purpose languages. Pulumi evaluates real programs (pulumi preview / pulumi up) with native unit tests and IDE refactors. The HCL lane optimizes for operator reviewability and the Terraform Registry module ecosystem. Pick Pulumi when infrastructure logic looks like application code—dynamic per-tenant stacks, component libraries shared with app repos—not when the problem is a flat VPC module with stable inputs.

flowchart LR
  subgraph d1 [Decision1]
    TF[Terraform BSL]
    OT[OpenTofu MPL]
  end
  subgraph d2 [Decision2]
    HCL[HCL lane]
    PUL[Pulumi TS or Python]
  end
  TF --> OT
  OT --> HCL
  HCL --> PUL

Decision 1: Terraform vs OpenTofu on AWS

DimensionHashiCorp TerraformOpenTofu
LicenseBSL (internal use OK; competing SaaS needs legal review)MPL 2.0
AWS providerhashicorp/awsSame provider, same modules
State formatInterchangeableInterchangeable
State encryption at rest (engine-native)No OSS equivalent mid-2026Client-side encryption (1.11+)
Enterprise policySentinel on HCPOPA/Conftest; no Sentinel
Managed runnersTerraform Cloud/EnterpriseSpacelift, env0, Scalr, Atlantis + tofu

Recommendation with trade-off: Default new AWS platform work to OpenTofu 1.12+ for MPL insurance and state encryption. Keep Terraform when your procurement and runbooks are already tied to HCP and Sentinel—switching engines saves little if policy and VCS integrations are the real lock-in.

Decision 2: HCL lane vs Pulumi on AWS

DimensionOpenTofu / TerraformPulumi
AuthoringHCLTypeScript, Python, Go, .NET, Java
AWS provider pathhashicorp/aws nativeBridged pulumi-aws + AWS Native (pulumi-aws-native)
StateS3 + DynamoDB lock (typical)Pulumi Service, S3 self-hosted, or Pulumi ESC
Drift signaltofu plan / terraform planpulumi preview
Unit testsTerratest (Go), externalNative pulumi test framework in app language
CI dependenciesSingle binaryLanguage runtime + npm/pip + pulumi CLI
Module reuseTerraform Registry (largest)ComponentResource patterns; import TF modules via bridge

Recommendation with trade-off: Choose Pulumi when software engineers own the platform and you will invest in typed abstractions (EKS platform teams, multi-tenant SaaS control planes). Choose OpenTofu when operators review plans in HCL, you consume public Registry modules verbatim, and CI simplicity matters more than IDE refactor speed.

Pulumi provider choice on AWS

  • @pulumi/aws (bridged): Same resource names as Terraform—easiest mental model for converts.
  • @pulumi/aws-native: Cloud Control API—faster new-resource coverage for some services, different property shapes.

Do not mix providers on the same logical resource without explicit imports; pick one primary provider per stack.

First-party benchmark (read-only scaffold)

We extended examples/aws-iac-decision-demo with a Pulumi stack mirroring the Terraform read-only aws_caller_identity + region lookups. Harness: make bench BENCH_RUNS=5 on OpenTofu 1.12.3 and Pulumi 3.248.0, Node 24, us-east-1, macOS arm64, June 26 2026.

MetricOpenTofu (tofu plan)Pulumi (pulumi preview)
Median wall time (5 runs)5,207 ms10,621 ms
Successful runs4 / 5 (first run cold-init)5 / 5
LOC (scaffold only)44 HCL across 4 files12 TypeScript
Creates at plan/preview00

Pulumi’s median 2.0× slower on this trivial stack is not the reason to avoid it—real platforms amortize language ergonomics across hundreds of resources. It does matter for tight inner-loop CI on small roots: HCL plans stay lighter when the problem is declarative and small.

Raw CSV: examples/aws-iac-decision-demo/out/bench-20260626T032320Z.csv in the repo clone.

Decision matrix for AWS teams

ScenarioHCL lane (prefer OpenTofu)Pulumi
Greenfield landing zone, Registry modulesYesOnly if building a typed platform SDK
Regulated multi-account, state encryption requiredOpenTofu 1.12 state encryptionSelf-hosted backend + strict key RBAC
App team ships microservices, platform publishes componentsOpenTofu outputs → app reposComponentResource libraries in TypeScript
MSP hiring Terraform contractorsYesHarder talent pool
Complex per-tenant isolation logicHCL for_each gets verbosePulumi loops and classes shine
Already on Terraform Cloud + SentinelTerraform (or hybrid OT dev / TF prod during migration)Rarely—policy rewrite cost

State, security, and CI

HCL lane: Standard pattern is encrypted S3 backend, DynamoDB lock table, OIDC role for GitHub Actions—documented in safe Terraform apply workflows and state repair. OpenTofu’s encrypted state reduces reliance on SSE-only S3 when compliance asks for client-side envelopes.

Pulumi: Pulumi Service is the fastest on-ramp; regulated shops often self-host state in S3 or use Pulumi ESC for secrets. Budget time for secrets handling—.env and stack config discipline—not just pulumi up.

CI gates (both): Checkov/tfsec on HCL; pulumi preview in PR comments for Pulumi. Do not skip plan-only on either lane.

When teams pick the wrong tool

Wrong: Choosing Pulumi for a 30-resource VPC because “developers like TypeScript,” then re-implementing terraform-aws-modules/vpc by hand.

Wrong: Staying on HashiCorp Terraform for greenfield HCL while legal already approved OpenTofu—paying BSL scrutiny without using HCP features.

Wrong: Running OpenTofu and Pulumi as dual writers on the same security groups—flapping rules and audit timelines that disagree. Pick one writer per resource class; see drift detection patterns.

For the full Terraform-on-AWS integration reference (including Pulumi in the comparison matrix), see Terraform on AWS.

From a first-party benchmark — FactualMinds platform engineering ran the extended aws-iac-decision-demo harness on a laptop with live AWS STS credentials (single account, us-east-1, read-only data sources). OpenTofu 1.12.3 plan median 5.2 s; Pulumi 3.248 preview median 10.6 s on identical scope. The gap narrows after warm node_modules and provider caches; it widens again in cold CI agents—factor that into PR check budgets.

What broke — A platform team ran pulumi convert on a Terraform root with nested terraform-aws-modules wrappers. Converted TypeScript compiled, but pulumi preview wanted to replace IAM roles because logical names did not match state addresses. They rolled back, scoped Pulumi to a greenfield microservice stack, and left the landing zone on OpenTofu—3 weeks lost to dual-state debugging that a Terraform→OpenTofu swap would have avoided in an afternoon.

Reproduce this — Clone the repo and cd examples/aws-iac-decision-demo. OpenTofu: make plan-tofu (expect Plan: 0 to add, 0 to change, 0 to destroy). Pulumi: make preview-pulumi. Benchmark: make bench → CSV under out/bench-{timestamp}.csv. Documented in the artifact README.

What to Do This Week

  1. Split the decisions — Resolve OpenTofu vs Terraform (license/HCP) before debating Pulumi.
  2. Run the benchmark in your AWS sandbox account; compare medians on your CI image, not ours.
  3. Audit state backends — If compliance asks for encrypted state, trial OpenTofu 1.12 encryption in staging.
  4. Gate CI — Plan-only OpenTofu on every PR; add Checkov. If piloting Pulumi, require pulumi preview artifacts.
  5. Publish RACI — One writer per resource class; link outputs from HCL roots to any Pulumi app stacks.

What This Post Doesn’t Cover

Deep AWS CDK or CloudFormation comparisons (see CDK decision guide), Ansible mutable configuration (Ansible guide), brownfield terraform import backlogs, full Pulumi ESC / CrossGuard policy authoring, or GovCloud partition quirks beyond credential profiles.

Further reading

PP
Palaniappan P

AWS Cloud Architect & AI Expert

AWS-certified cloud architect and AI expert with deep expertise in cloud migrations, cost optimization, and generative AI on AWS.

AWS ArchitectureCloud MigrationGenAI on AWSCost OptimizationDevOps

Recommended Reading

Explore All Articles »