Quick Takeaways
What you'll learn in this article
- 1
A comprehensive guide to Pulumi and the evolution of Infrastructure as Code in 2026, covering programming language-driven IaC, Pulumi AI, ESC, Deployments, CrossGuard policy-as-code, multi-cloud patterns, and enterprise adoption strategies
Keep reading for detailed implementation, code examples, and real-world results
Infrastructure as Code has undergone a quiet revolution. What started as declarative configuration files describing cloud resources has matured into a full-fledged software engineering discipline, complete with type systems, testing frameworks, package managers, and IDE support. At the center of this transformation sits Pulumi, the platform that bet everything on a simple but radical idea: infrastructure should be written in real programming languages, not domain-specific ones.
That bet has paid off. By early 2026, Pulumi has grown from an ambitious open-source project into an enterprise platform managing billions of cloud resources across thousands of organizations. The company has expanded its surface area far beyond the core IaC engine, building out an integrated ecosystem that includes AI-assisted infrastructure generation, secrets management, GitOps-native deployments, and policy-as-code enforcement. Meanwhile, the broader IaC landscape has shifted dramatically, with every major player borrowing ideas from Pulumi's programming-language-first approach.
This article is a comprehensive examination of where Infrastructure as Code stands in 2026, with Pulumi as the lens through which we explore the entire discipline. We will cover the IaC landscape and how the major tools compare, Pulumi's core programming model and its advantages, the newer platform capabilities like Pulumi AI and ESC, testing and policy enforcement patterns, multi-cloud and Kubernetes strategies, migration paths from Terraform, and enterprise adoption patterns drawn from real-world deployments.
IaC Market Size (2026)
$3.8B
Global Infrastructure as Code market, growing at 24% CAGR
The IaC Landscape in 2026: A Comparative Analysis
The Infrastructure as Code ecosystem has never been more diverse or more competitive. Understanding the landscape requires examining each major tool's philosophy, strengths, and where it falls short.
Terraform: The Incumbent Under Pressure
HashiCorp's Terraform remains the most widely deployed IaC tool in the world. Its provider ecosystem is unmatched, with thousands of providers covering virtually every cloud service and SaaS platform. HCL (HashiCorp Configuration Language) is familiar to hundreds of thousands of practitioners. The state management model, while sometimes frustrating, is well-understood and battle-tested.
However, Terraform faces significant headwinds in 2026. The license change from MPL to BSL (Business Source License) in August 2023 fractured the community and spawned OpenTofu, a Linux Foundation fork that has gained meaningful traction. Enterprise teams evaluating new IaC investments now must consider licensing risk as a first-class concern. HCL's limitations as a configuration language become more painful as infrastructure complexity grows. Loops, conditionals, and dynamic blocks in HCL remain awkward compared to native language constructs. Terraform modules, while powerful for encapsulation, lack the composability and type safety of real software libraries.
The OpenTofu fork has stabilized and attracted genuine enterprise adoption, but it has also fragmented the ecosystem. Provider authors now must decide whether to support both Terraform and OpenTofu, and subtle incompatibilities have emerged. This fragmentation benefits tools like Pulumi that sit outside the HCL ecosystem entirely.
AWS CDK: Programming Languages, Platform Lock-in
The AWS Cloud Development Kit (CDK) validated Pulumi's core thesis: developers want to write infrastructure in real programming languages. CDK supports TypeScript, Python, Java, C#, and Go, and its construct library provides high-level abstractions that dramatically reduce boilerplate. The L1/L2/L3 construct hierarchy is elegant, and the Construct Hub ecosystem has grown substantially.
CDK's fatal limitation is its AWS exclusivity. While CDK for Terraform (cdktf) extends the programming model to other providers, it adds complexity and indirection. Organizations running multi-cloud or hybrid environments find CDK's single-provider focus increasingly constraining. CDK also generates CloudFormation templates under the hood, inheriting all of CloudFormation's limitations around stack size, resource counts, and error messages.
Crossplane: Kubernetes-Native IaC
Crossplane takes a fundamentally different approach, treating infrastructure management as a Kubernetes-native problem. Resources are defined as Custom Resource Definitions (CRDs) and managed through the Kubernetes control plane. This is philosophically compelling for organizations that have standardized on Kubernetes as their platform layer.
Crossplane's strength is its composition model, which allows platform teams to build custom APIs for their organization's infrastructure patterns. Its weakness is that it requires Kubernetes expertise and a running cluster to manage infrastructure, creating a chicken-and-egg problem for bootstrapping. The YAML-based configuration, while consistent with the Kubernetes ecosystem, lacks the expressiveness that complex infrastructure definitions demand.
Where Pulumi Fits
Pulumi occupies a unique position in this landscape. It shares CDK's programming-language-first philosophy but applies it universally across all cloud providers. It matches Terraform's provider breadth through its own ecosystem plus the Pulumi-Terraform bridge, which automatically wraps Terraform providers for use with Pulumi. It can deploy Kubernetes resources natively without requiring a running cluster as a management plane.
IaC Tool Philosophy Comparison
Domain-Specific (Terraform/HCL)
General-Purpose (Pulumi)
Pulumi's Programming Language Approach: Why It Matters
The decision to use general-purpose programming languages for infrastructure is not merely a convenience feature. It fundamentally changes how teams design, build, test, and maintain their infrastructure. Understanding why this matters requires looking beyond syntax preferences at the engineering practices it enables.
Type Safety and Compile-Time Validation
When you define an AWS S3 bucket in Pulumi using TypeScript, the compiler knows the exact shape of every configuration option. Misspell a property name and your code will not compile. Pass a string where a number is expected and the type checker catches it before you run anything. Attempt to reference an output from a resource that does not produce that output and the IDE highlights the error immediately.
This might seem like a minor improvement over running terraform validate, but the difference in practice is enormous. Type safety catches entire categories of errors that HCL's validation cannot. It prevents you from passing an EC2 instance ID where a VPC ID is expected. It ensures that when you reference a resource's output, that output actually exists. It catches mismatches between resource configurations and the IAM policies that govern them.
In TypeScript, a Pulumi program defining a VPC with subnets and security groups benefits from full autocomplete. Every property of every resource is documented inline. When AWS adds a new feature to a service, the updated Pulumi AWS provider includes type definitions that immediately surface the new capabilities in your IDE. This tight feedback loop between cloud provider updates and developer experience is something that DSL-based tools cannot match.
Abstraction and Composition with Component Resources
Pulumi's component resource model allows teams to build reusable infrastructure abstractions using the same patterns they use in application code. A component resource is a class that encapsulates a set of related resources behind a clean interface. Unlike Terraform modules, which are constrained by HCL's limited type system, Pulumi components are real classes with constructors, methods, properties, and inheritance.
Consider a common pattern: a "web application" component that provisions a load balancer, auto-scaling group, security groups, DNS records, and SSL certificates. In Terraform, this would be a module with dozens of input variables, many of which have complex types that are difficult to express in HCL. In Pulumi, it is a TypeScript class with a strongly-typed constructor that accepts an interface defining exactly what configuration is required. The class can include validation logic, default values computed from other inputs, and helper methods for common operations.
Component resources also compose naturally. A "microservice platform" component can contain multiple "web application" components, each configured differently. A "staging environment" component can contain a "microservice platform" with specific overrides for lower resource allocation. This hierarchical composition, enforced by the type system and expressed through familiar object-oriented patterns, scales to enormous infrastructure codebases without the maintenance burden that large Terraform module hierarchies accumulate.
The Language Ecosystem Advantage
Using general-purpose languages means Pulumi programs have access to the entire ecosystem of libraries available in that language. Need to compute CIDR blocks for subnet allocation? Use an IP address library. Need to generate deterministic resource names from a hash of their configuration? Use a crypto library. Need to read configuration from a YAML file, merge it with environment-specific overrides, and validate the result against a JSON schema? Use the libraries that already exist for exactly these tasks.
This access extends to package management. Pulumi components can be published as npm packages, Python packages on PyPI, Go modules, or NuGet packages. Teams can version, distribute, and consume infrastructure abstractions through the same package managers they already use for application dependencies. This eliminates the friction of Terraform's registry-based module distribution and enables private package repositories for internal infrastructure components.
Language Choice by Use Case
Pulumi supports TypeScript, Python, Go, C#, Java, and YAML. Each language has characteristics that make it a better fit for different scenarios.
TypeScript is the most popular choice and for good reason. Its type system is expressive enough to capture complex infrastructure configurations while remaining approachable. The npm ecosystem provides access to thousands of utility libraries. Most web-focused engineering organizations already have TypeScript expertise.
Python appeals to data engineering and machine learning teams that already work in Python daily. Defining infrastructure in the same language as data pipelines and ML training scripts eliminates context switching and enables shared abstractions between application and infrastructure code.
Go is the natural choice for teams building Kubernetes operators, CLI tools, or other Go-based infrastructure. Go's compilation speed and binary distribution model are advantages for CI/CD pipelines where startup time matters.
C# and Java serve enterprise organizations with deep .NET or JVM investments. These teams can leverage existing internal libraries, coding standards, and developer tooling for infrastructure code.
YAML mode serves teams that want Pulumi's state management, secrets handling, and deployment features without adopting a programming language. It bridges the gap for organizations migrating from Terraform where some team members are not yet comfortable with general-purpose languages.
Pulumi AI: Natural Language Infrastructure Generation
Pulumi AI represents one of the most ambitious applications of large language models to infrastructure engineering. Launched initially as an experimental feature and now integrated deeply into the Pulumi platform, Pulumi AI allows engineers to describe infrastructure in natural language and receive working Pulumi code in return.
How Pulumi AI Works
Pulumi AI is backed by a fine-tuned model trained on Pulumi's documentation, provider schemas, example programs, and community contributions. When you describe infrastructure in plain English, Pulumi AI generates syntactically correct, type-safe Pulumi code in your chosen language. The system understands cloud provider semantics, so a request like "create a VPC with three public subnets and three private subnets across all availability zones in us-east-1, with NAT gateways for private subnet internet access" produces code that correctly configures route tables, internet gateways, NAT gateways, elastic IPs, and subnet associations.
The integration points are where Pulumi AI becomes genuinely useful in production workflows. Within Pulumi Cloud's web console, you can generate infrastructure from natural language and deploy it directly. Within the CLI, pulumi ai commands generate code that you can review, modify, and commit. Within supported IDEs, Pulumi AI acts as a context-aware copilot that understands not just the language syntax but the semantic meaning of infrastructure resources and their relationships.
Where Pulumi AI Excels and Where It Falls Short
Pulumi AI is remarkably good at generating boilerplate infrastructure. The "80% of the code" that every experienced cloud engineer can write from memory but would rather not type out manually is exactly where AI generation provides the most value. Creating a standard three-tier application infrastructure, setting up a Kubernetes cluster with common add-ons, configuring monitoring and alerting stacks, or provisioning CI/CD pipeline infrastructure are all tasks where Pulumi AI produces high-quality first drafts.
Where Pulumi AI struggles is with organization-specific patterns and constraints. It does not know your company's naming conventions, tagging requirements, network topology standards, or compliance controls. It cannot generate code that references your existing custom component resources unless explicitly prompted with their interfaces. For these reasons, Pulumi AI works best as an accelerator for experienced engineers rather than a replacement for infrastructure expertise.
The most effective workflow combines Pulumi AI generation with human review and enhancement. Generate the scaffolding, then customize it with your organization's patterns. Use Pulumi AI to explore unfamiliar providers or services, then refine the generated code with domain-specific knowledge. This hybrid approach consistently yields the fastest path from concept to production-ready infrastructure code.
Pulumi ESC: Unified Environments, Secrets, and Configuration
Pulumi ESC (Environments, Secrets, Configuration) addresses one of the most persistent pain points in infrastructure management: the sprawl of configuration and secrets across multiple systems. Before ESC, a typical organization might store secrets in HashiCorp Vault, cloud provider secrets managers, environment variables in CI/CD systems, and encrypted files in Git repositories. Configuration values would be scattered across Terraform tfvars files, Kubernetes ConfigMaps, Helm values files, and application-specific configuration stores.
The ESC Model
ESC introduces a unified abstraction: the environment. An environment is a named collection of configuration values and secrets that can be composed, inherited, and versioned. Environments can import other environments, creating a hierarchy that mirrors organizational structure. A base environment might define organization-wide defaults. A cloud-provider environment imports the base and adds AWS or Azure-specific configuration. A team environment imports the cloud-provider environment and adds team-specific values. A stack-specific environment imports the team environment and adds deployment-specific overrides.
Secrets in ESC are encrypted at rest and can be sourced from external providers. ESC supports dynamic credential generation from AWS, Azure, GCP, and other identity providers using OIDC federation. This means short-lived credentials can be generated on demand rather than stored as long-lived secrets, dramatically reducing the blast radius of credential compromise.
ESC Beyond Pulumi
One of ESC's most important design decisions is that it is not limited to Pulumi infrastructure programs. ESC environments can be consumed by any application or tool through the ESC CLI, SDK, or API. A Docker container can pull its environment variables from ESC at startup. A CI/CD pipeline can source its configuration from ESC. A local development environment can be configured with esc run to inject the correct credentials and configuration values for the developer's current context.
This universality is what distinguishes ESC from Pulumi-specific configuration management. It positions ESC as a replacement for or complement to tools like dotenv files, AWS Parameter Store, Azure App Configuration, and even parts of HashiCorp Vault's key-value engine. For organizations already using Pulumi for infrastructure, ESC provides a natural extension that consolidates configuration management under a single platform.
Pulumi Deployments: GitOps-Native Infrastructure CI/CD
Pulumi Deployments is Pulumi's answer to the question every IaC team eventually faces: how should infrastructure changes be reviewed, approved, and applied? While many organizations bolt together GitHub Actions or GitLab CI pipelines with Pulumi CLI commands, Pulumi Deployments provides a purpose-built system that understands the unique requirements of infrastructure deployment.
How Deployments Work
Pulumi Deployments integrates directly with Git repositories and responds to events like pull requests, merges, and tag pushes. When a pull request modifies infrastructure code, Deployments automatically runs pulumi preview and posts the results as a comment on the PR. Reviewers can see exactly which resources will be created, updated, or destroyed before approving the change. When the PR is merged, Deployments automatically runs pulumi up to apply the changes.
This GitOps workflow is not new in concept, but the details matter. Pulumi Deployments manages its own compute environment for running infrastructure operations, eliminating the need to configure and secure CI/CD runners with cloud provider credentials. It supports deployment policies that require manual approval for changes above a certain risk threshold. It provides drift detection that periodically compares actual cloud state against desired state and alerts on divergence. It handles concurrency control to prevent conflicting infrastructure changes from being applied simultaneously.
Deployment Triggers and Automation
Beyond Git-driven workflows, Deployments supports programmatic triggers through the Pulumi Automation API. This enables sophisticated patterns like deploying infrastructure in response to application events. When a new microservice is registered in a service catalog, Deployments can automatically provision its infrastructure. When a team is onboarded, Deployments can create their cloud accounts, networking, and baseline resources. When a load threshold is crossed, Deployments can scale infrastructure components that are not managed by auto-scaling groups.
The Automation API is a library (available in all Pulumi-supported languages) that provides programmatic control over the entire Pulumi lifecycle. You can create stacks, set configuration, run previews, apply updates, and destroy resources all from within application code. This is the foundation for building internal developer platforms where infrastructure provisioning is exposed through custom APIs, web portals, or ChatOps interfaces.
Pulumi 1.0
Initial stable release with TypeScript, Python, Go support. Core IaC engine with multi-cloud provider model.
Automation API
Programmatic infrastructure management without CLI, enabling embedded IaC in applications and platforms.
Pulumi 3.0 and Java Support
Major version with improved performance, native providers, and Java/JVM language support.
Pulumi Deployments Preview
GitOps-native deployment platform with automatic previews, drift detection, and deployment policies.
Pulumi ESC Launch
Environments, Secrets, and Configuration management platform extending beyond IaC into application config.
Pulumi AI General Availability
Natural language to infrastructure code generation integrated into CLI, console, and IDE extensions.
Enterprise Platform Maturity
Advanced RBAC, audit logging, SOC 2 Type II, FedRAMP authorization, and organization-scale management features.
State Management: Pulumi Cloud vs Self-Managed Backends
Every IaC tool that tracks resource state must store that state somewhere. Pulumi's approach to state management offers flexibility that accommodates both cloud-native and air-gapped deployment scenarios.
Pulumi Cloud as the Default Backend
Pulumi Cloud (formerly Pulumi Service) is the managed backend that handles state storage, concurrency control, secret encryption, and audit logging. For most teams, it is the right choice. It eliminates the operational burden of managing state infrastructure, provides built-in state locking to prevent concurrent modifications, encrypts secrets using per-stack encryption keys, and maintains a complete history of every infrastructure change.
The free tier of Pulumi Cloud supports individual developers and small teams with up to 200 resources. The Team and Enterprise tiers add RBAC, SAML/SSO, audit logs, and advanced policy enforcement. For organizations concerned about data residency, Pulumi Cloud offers self-hosted deployment options that run within the customer's own cloud account.
Self-Managed Backends
Pulumi also supports self-managed backends using cloud object storage. You can store state in AWS S3, Azure Blob Storage, Google Cloud Storage, or even a local filesystem. Self-managed backends are essential for air-gapped environments, organizations with strict data sovereignty requirements, or teams that want to avoid any external service dependencies.
The trade-off with self-managed backends is that you lose the managed features: concurrent state locking must be implemented separately (using DynamoDB for S3 backends, for example), secret encryption requires configuring your own KMS integration, and there is no built-in web console for viewing state or deployment history. For organizations with the operational maturity to manage these concerns, self-managed backends provide maximum control.
State Management Best Practices
Regardless of backend choice, several state management practices have emerged as standards across mature Pulumi deployments. Stack-per-environment isolation ensures that development, staging, and production infrastructure states are completely independent. State import and export commands enable migrating between backends without redeploying resources. State auditing through Pulumi Cloud's audit log or custom logging for self-managed backends provides the compliance trail that regulated industries require.
Testing Infrastructure Code with Pulumi
One of the most transformative capabilities that general-purpose languages bring to infrastructure is testability. Pulumi programs can be tested using the same testing frameworks, patterns, and CI/CD pipelines that teams already use for application code.
Unit Testing
Unit tests verify the logic of your Pulumi program without provisioning any real resources. Pulumi's mocking framework allows you to intercept resource creation calls and verify that your program produces the expected resource graph with the correct configuration. In TypeScript, you write unit tests with Jest or Mocha. In Python, you use pytest. In Go, you use the standard testing package.
A unit test for a VPC component might verify that the correct number of subnets is created for the specified number of availability zones, that CIDR blocks are allocated without overlap, that route tables are correctly associated, and that tags conform to organizational standards. These tests run in milliseconds because no cloud resources are involved. They catch logic errors in your infrastructure code the same way application unit tests catch logic errors in business logic.
Property Testing
Property tests (also called policy tests or stack validation tests) run after pulumi preview or pulumi up and verify properties of the resulting resource graph. Unlike unit tests, which mock the Pulumi engine, property tests inspect the actual resources that Pulumi plans to create. They can verify that no S3 buckets are publicly accessible, that all EC2 instances use approved AMIs, that all resources are tagged according to organizational standards, or that no security groups allow unrestricted ingress.
Property tests bridge the gap between unit tests and policy-as-code. They are written as part of the infrastructure project and run as part of the normal testing workflow, but they enforce the same kinds of constraints that CrossGuard policies enforce at the organizational level.
Integration Testing
Integration tests deploy real infrastructure, verify that it behaves correctly, and then destroy it. Pulumi's Automation API makes this straightforward: a test function creates a temporary stack, deploys the infrastructure, runs assertions against the live resources (checking that an endpoint is reachable, a database accepts connections, or a queue processes messages), and then destroys the stack in a cleanup phase.
Integration tests are expensive in both time and cloud costs, so they are typically run less frequently than unit tests. A common pattern is to run unit and property tests on every commit, and integration tests nightly or before releases. The key insight is that Pulumi makes all three levels of testing natural because the infrastructure code is written in a language with mature testing ecosystem support.
| testType | executionTime |
|---|---|
| Unit Tests | 3 |
| Property Tests | 30 |
| Integration Tests | 900 |
Policy-as-Code with Pulumi CrossGuard
CrossGuard is Pulumi's policy-as-code framework. It allows organizations to define and enforce rules about what infrastructure can and cannot do, providing guardrails that prevent misconfigurations, security vulnerabilities, and cost overruns before resources are provisioned.
How CrossGuard Works
CrossGuard policies are written as code (in TypeScript, Python, Go, or using OPA's Rego language) and evaluated against the resource graph during pulumi preview and pulumi up. Policies can be advisory (warning but not blocking), mandatory (blocking deployment if violated), or remediation-capable (automatically fixing violations when possible).
A policy pack is a collection of related policies distributed as a package. An organization might have a "security baseline" policy pack that enforces encryption at rest, restricts public network access, and requires MFA on IAM roles. A "cost management" policy pack might limit instance sizes in non-production environments, require resource tagging for cost allocation, and prevent the provisioning of expensive services without explicit approval.
Policy Enforcement Levels
CrossGuard policies can be enforced at multiple levels. Local enforcement runs policies within the developer's environment during pulumi preview, providing immediate feedback before code is even committed. Organization enforcement runs policies in Pulumi Cloud for every deployment across all stacks, ensuring compliance regardless of where or how deployments are triggered. CI/CD enforcement runs policies as part of the deployment pipeline, blocking merges that would introduce policy violations.
This layered enforcement model means developers get fast feedback during development, while the organization maintains a central policy authority that cannot be bypassed. Policies can be versioned and deployed independently of the infrastructure code they govern, allowing security and compliance teams to update guardrails without modifying any infrastructure projects.
Common Policy Patterns
Several categories of CrossGuard policies have emerged as near-universal across enterprise deployments.
Security policies prevent the most common cloud misconfigurations: public S3 buckets, unencrypted EBS volumes, overly permissive security groups, IAM policies with wildcard permissions, and resources deployed outside approved regions. These policies encode the knowledge that security teams have accumulated from incident response and audit findings.
Cost control policies limit resource sizes and counts in non-production environments, require cost allocation tags on all resources, prevent the provisioning of reserved instances without finance approval, and alert when estimated monthly costs for a stack exceed a threshold. These policies operationalize FinOps practices at the infrastructure layer.
Compliance policies enforce regulatory requirements specific to the organization's industry. Healthcare organizations implement policies that ensure HIPAA compliance for data storage and access controls. Financial institutions enforce SOX compliance for audit trails and change management. Government contractors implement FedRAMP controls for cloud resource configurations.
Organizational standards policies enforce naming conventions, tagging schemes, resource placement within approved accounts and regions, and architectural patterns like requiring that databases are deployed in private subnets behind network address translation.
Multi-Cloud Patterns with Pulumi
Multi-cloud infrastructure is no longer a theoretical exercise for most enterprises. Whether driven by acquisition integration, best-of-breed service selection, regulatory requirements, or vendor negotiation leverage, organizations increasingly operate across two or more cloud providers. Pulumi's multi-cloud capabilities have matured to address the real-world complexity of these environments.
Abstraction Layers for Multi-Cloud
The most effective multi-cloud pattern with Pulumi is building abstraction layers using component resources. Rather than writing separate infrastructure code for each cloud provider, teams create components that expose a provider-agnostic interface and implement the cloud-specific details internally.
For example, a "managed database" component might accept parameters like engine type, instance size, storage capacity, and backup retention. The component's implementation creates an RDS instance on AWS, a Cloud SQL instance on GCP, or an Azure SQL Database on Azure, depending on a provider parameter. The consuming code does not need to know which cloud provider is being used, only the abstract database interface.
This pattern requires discipline. The abstraction layer must be carefully designed to expose only capabilities that are available across all target providers. Provider-specific features that do not have cross-cloud equivalents should be accessible through escape hatches but not part of the core abstraction. Over-abstraction leads to lowest-common-denominator infrastructure that fails to leverage each provider's strengths. Under-abstraction leads to leaky abstractions that provide little benefit.
Component Resources for Organizational Patterns
Beyond multi-cloud abstraction, component resources are the primary mechanism for encoding organizational infrastructure patterns. A "compliant VPC" component encapsulates your organization's network architecture standards, including CIDR allocation, subnet layout, flow logging, and peering configuration. A "monitored service" component creates the service infrastructure plus the CloudWatch alarms, Datadog monitors, or PagerDuty integrations that your SRE team requires.
These components become the building blocks of an internal developer platform. Application teams consume them through well-documented interfaces without needing to understand the underlying cloud resource details. Platform teams maintain and evolve the components, rolling out improvements and compliance updates to all consuming projects through package version updates.
| Name | Value |
|---|---|
| AWS | 42 |
| Azure | 28 |
| Google Cloud | 18 |
| Multi-Cloud | 12 |
Cross-Provider Resource Dependencies
One of Pulumi's genuine advantages in multi-cloud scenarios is its ability to manage resources across multiple providers within a single program and express dependencies between them. A Pulumi program can create a GKE cluster on Google Cloud, configure DNS records in Cloudflare pointing to the cluster's ingress, provision a database in AWS RDS that the cluster's workloads will access, and set up a VPN tunnel between the GCP VPC and the AWS VPC for private connectivity.
All of these resources exist in a single dependency graph. Pulumi understands the ordering constraints and provisions resources in the correct sequence. If the VPN tunnel depends on both VPCs existing, Pulumi creates both VPCs in parallel, then creates the tunnel. If the DNS record depends on the cluster's ingress IP, Pulumi waits for the cluster to be provisioned and its IP to be available before creating the DNS record. This cross-provider orchestration within a single program is something that Terraform can also achieve but that Crossplane and CDK handle less naturally.
Pulumi Kubernetes Provider and Operator
Kubernetes has become the de facto standard for container orchestration, and Pulumi's Kubernetes integration is among the most sophisticated available. The Pulumi Kubernetes provider supports the full Kubernetes API, including Custom Resource Definitions, and provides both imperative and declarative patterns for managing Kubernetes resources.
Server-Side Apply and Resource Management
Pulumi's Kubernetes provider uses server-side apply by default, which resolves the field ownership conflicts that plague other tools when multiple controllers manage the same resource. Server-side apply tracks which fields are managed by which controller, preventing accidental overwrites and enabling safe coexistence between Pulumi-managed and operator-managed resources.
The provider also supports Helm chart deployment, allowing teams to deploy Helm charts through Pulumi while managing the chart's values and lifecycle alongside other infrastructure. This is particularly useful for deploying third-party software (like cert-manager, ingress controllers, or monitoring stacks) as part of a broader infrastructure program that also provisions the cluster itself and its supporting cloud resources.
The Pulumi Kubernetes Operator
The Pulumi Kubernetes Operator bridges the gap between Pulumi's programming model and Kubernetes-native GitOps workflows. The operator runs inside a Kubernetes cluster and watches for Stack custom resources. When a Stack resource is created or updated, the operator runs the corresponding Pulumi program to reconcile the desired infrastructure state.
This enables a workflow where platform teams define infrastructure as Pulumi programs stored in Git, and application teams request infrastructure by creating Stack resources in their Kubernetes namespaces. The operator handles authentication, state management, and deployment execution. It integrates with Kubernetes RBAC, so access to infrastructure provisioning is controlled through the same mechanisms that control access to other Kubernetes resources.
For organizations that have standardized on Kubernetes as their platform layer, the operator provides a natural interface for infrastructure self-service. Application developers do not need Pulumi CLI access or Pulumi Cloud accounts. They interact with infrastructure through Kubernetes resources, using tools and workflows they already know.
Migration from Terraform to Pulumi
For the many organizations running Terraform today, migrating to Pulumi is a practical concern with real engineering costs. Pulumi provides several tools and strategies that make this migration manageable, but it is important to approach it with realistic expectations.
tf2pulumi: Automated Code Conversion
The tf2pulumi tool converts Terraform HCL files to Pulumi programs in TypeScript, Python, Go, or C#. It handles resource definitions, data sources, variables, outputs, locals, and most expressions. The conversion is not always perfect. Complex HCL expressions, dynamic blocks, and Terraform-specific patterns sometimes produce code that requires manual adjustment. However, tf2pulumi handles the mechanical translation that would otherwise consume most of the migration effort.
The recommended workflow is to run tf2pulumi on your existing Terraform code, review and refine the generated Pulumi code, import the existing cloud resources into Pulumi's state using pulumi import, verify that pulumi preview shows no changes (indicating that Pulumi's desired state matches the actual cloud state), and then decommission the Terraform state.
Coexistence Strategies
Not every migration needs to happen at once. Pulumi and Terraform can coexist within the same organization and even manage related resources. A common pattern is to start using Pulumi for new infrastructure projects while maintaining existing Terraform code for established resources. Over time, as Terraform projects come up for significant modification, they are migrated to Pulumi.
The key to successful coexistence is clear ownership boundaries. Each resource should be managed by exactly one tool. Shared state between Pulumi and Terraform can be achieved through data sources: Pulumi can read Terraform state files to reference resources managed by Terraform, and Terraform can read Pulumi stack outputs through its HTTP data source.
Migration Decision Framework
Not every Terraform project is worth migrating. Projects that are stable, rarely modified, and working correctly may not justify the migration effort. The highest-value migration targets are projects where HCL's limitations are causing pain: those with complex conditional logic, heavy use of dynamic blocks, large module hierarchies that are difficult to maintain, or requirements for sophisticated testing that Terratest cannot easily address.
Organizations should also consider the team dimension. If the engineers who will maintain the infrastructure are more productive in TypeScript or Python than in HCL, the migration pays for itself through ongoing productivity gains. If the team is deeply experienced with Terraform and comfortable with HCL, the migration cost may outweigh the benefit for existing projects.
Enterprise Adoption Patterns
Pulumi's enterprise adoption has accelerated significantly since 2024, and patterns have emerged for how large organizations successfully adopt the platform.
Team Organization and Stack Management
The fundamental organizational unit in Pulumi is the stack, which represents a distinct instance of infrastructure. The most common stack structure maps one stack per environment per service: networking/production, networking/staging, api-service/production, api-service/staging, and so on. This provides isolation between environments and between services while allowing cross-stack references where needed.
Larger organizations adopt a hub-and-spoke model where a platform team maintains shared infrastructure (networking, identity, monitoring) in central stacks, and application teams manage their service-specific infrastructure in their own stacks. Cross-stack references allow application stacks to consume outputs from platform stacks (VPC IDs, subnet IDs, certificate ARNs) without duplicating that infrastructure.
RBAC and Access Control
Pulumi Cloud's RBAC model controls who can view, update, or administer each stack. Teams are the primary grouping mechanism, and permissions are assigned at the team level. A platform engineering team might have admin access to all infrastructure stacks, while an application team has write access only to their service's stacks and read access to the platform stacks they depend on.
For organizations using SAML/SCIM identity providers, Pulumi Cloud supports automatic team membership synchronization. When an engineer joins a team in the identity provider, they automatically receive the corresponding Pulumi Cloud permissions. When they leave, access is revoked. This integration is essential for organizations subject to SOX, HIPAA, or other regulations that require demonstrable access control.
Organizational Governance at Scale
At the enterprise scale, governance extends beyond RBAC to encompass policy enforcement, audit logging, cost management, and change management. Pulumi Cloud's organization features provide a centralized view of all stacks, their current state, recent deployments, and policy compliance status. Audit logs capture every action taken in Pulumi Cloud, providing the compliance trail that security and audit teams require.
The combination of CrossGuard policies, RBAC, audit logs, and deployment approvals creates a governance framework that satisfies even the most demanding compliance requirements. Organizations in regulated industries like healthcare, finance, and government have successfully passed audit reviews using Pulumi's governance features as evidence of infrastructure control.
Enterprise Migration ROI
47%
average reduction in infrastructure deployment cycle time after Pulumi adoption
Real-World Case Studies
The true measure of any infrastructure tool is its impact in production. Several organizations have publicly shared their Pulumi adoption stories, and the results are consistently positive.
Large-Scale SaaS Platform Migration
A major SaaS company managing infrastructure across 14 AWS accounts and 3 Azure subscriptions migrated from a combination of Terraform and CloudFormation to Pulumi over 18 months. The migration involved converting approximately 2,200 Terraform resources and 800 CloudFormation resources to Pulumi TypeScript programs.
The quantified outcomes were significant. Infrastructure deployment time decreased by 58% due to Pulumi's faster state management and parallel resource creation. The number of infrastructure-related production incidents dropped by 41% in the first year, attributed to type-safe resource definitions catching configuration errors before deployment. Developer onboarding time for infrastructure tasks decreased from an average of 3 weeks (learning HCL and Terraform patterns) to 4 days (leveraging existing TypeScript skills). The team consolidated 47 separate Terraform modules into 12 Pulumi component resource packages, reducing maintenance overhead substantially.
Financial Services Compliance Automation
A mid-size financial services firm adopted Pulumi specifically for its CrossGuard policy-as-code capabilities. Operating under SOX and PCI-DSS compliance requirements, the firm needed to demonstrate that infrastructure configurations were automatically validated against regulatory controls before deployment.
Using CrossGuard, the compliance team codified 127 infrastructure policies covering encryption requirements, network segmentation, access controls, logging, and data retention. These policies are evaluated on every deployment across 43 Pulumi stacks. In the first year of operation, CrossGuard prevented 312 policy violations from reaching production. The firm's annual compliance audit, previously a 6-week manual review process, was reduced to 2 weeks with CrossGuard's automated evidence collection providing the majority of the required documentation.
Kubernetes Platform Engineering
A technology company building an internal developer platform adopted Pulumi to manage both the underlying cloud infrastructure and the Kubernetes resources running on it. The platform team used Pulumi component resources to create self-service infrastructure primitives: developers could request a "web service," "background worker," or "data pipeline" through a portal, and the platform automatically provisioned the necessary cloud resources, Kubernetes namespaces, RBAC policies, network policies, and monitoring configurations.
The Pulumi Kubernetes Operator ran inside each cluster, reconciling infrastructure state continuously. When the platform team updated a component resource (for example, adding a new security policy to all web services), the change propagated automatically to every instance across all clusters. This pattern replaced a brittle combination of Helm charts, Kustomize overlays, and ArgoCD applications with a single, testable, type-safe codebase.
The platform serves 23 development teams and manages more than 180 microservices across 6 Kubernetes clusters. Deployment frequency increased from weekly to multiple times daily after the platform's introduction, and the mean time to provision a new microservice's complete infrastructure stack dropped from 3 days of manual setup to 12 minutes of automated provisioning.
The Future of Infrastructure as Code
Looking ahead through the rest of 2026 and beyond, several trends are shaping the next evolution of Infrastructure as Code.
AI-Native Infrastructure Engineering
Pulumi AI is the beginning of a broader trend toward AI-assisted infrastructure engineering. As language models become more capable and are fine-tuned on larger corpora of infrastructure code, the accuracy and sophistication of generated infrastructure will improve. The eventual destination is not AI replacing infrastructure engineers but AI handling the routine aspects of infrastructure provisioning while engineers focus on architecture, optimization, and novel problems.
The integration of AI into infrastructure workflows will also drive improvements in documentation, observability, and debugging. AI assistants that can explain why a deployment failed, suggest optimizations for cost or performance, or generate documentation for infrastructure components will become standard features of IaC platforms.
Platform Engineering Convergence
Infrastructure as Code is converging with the broader platform engineering movement. The tools that provision infrastructure are being integrated with the tools that manage application deployment, developer experience, and operational workflows. Pulumi's Automation API and Kubernetes Operator are early examples of this convergence, enabling infrastructure provisioning to be embedded within platform services rather than existing as a separate workflow.
This convergence will accelerate as organizations invest in internal developer platforms. The distinction between "infrastructure" and "application" will continue to blur as platform teams build abstractions that hide infrastructure complexity behind service-oriented interfaces.
Declarative Meets Imperative
The longstanding debate between declarative (Terraform, CloudFormation) and imperative (scripting, SDKs) infrastructure management is being resolved through synthesis rather than victory. Pulumi's model is declarative in its desired-state semantics (you describe what you want, and the engine figures out how to get there) but imperative in its expression (you use loops, conditionals, and functions to compute the desired state). This hybrid approach is being adopted across the ecosystem, suggesting that the future of IaC is neither purely declarative nor purely imperative but a pragmatic combination.
Security Shifting Further Left
Policy-as-code is evolving from deployment-time enforcement to development-time prevention. IDE integrations that evaluate CrossGuard policies as you write infrastructure code, providing immediate feedback on policy violations, represent the next frontier. Combined with AI-assisted code generation that is policy-aware from the start, this shift-left trend will dramatically reduce the number of policy violations that reach the CI/CD pipeline, let alone production.
Getting Started with Pulumi in 2026
For teams considering Pulumi adoption, the path forward is straightforward. Start with a single, non-critical project. Choose the programming language your team already knows best. Use Pulumi Cloud's free tier for state management. Deploy something simple, like a static website or a containerized application, and experience the development workflow firsthand.
From there, expand incrementally. Build your first component resource to encapsulate a common infrastructure pattern. Write unit tests for it. Set up Pulumi Deployments for automated previews and deployments. Create a CrossGuard policy pack with your organization's most important guardrails. Migrate one Terraform project using tf2pulumi and compare the experience.
The organizations that have achieved the most success with Pulumi are those that treated it as a software engineering practice from the start. They applied the same rigor to their infrastructure code that they apply to their application code: version control, code review, automated testing, continuous deployment, and ongoing refactoring. Pulumi's programming-language-first approach does not merely allow this rigor. It demands it. And that demand, ultimately, is what makes Pulumi-managed infrastructure more reliable, more secure, and more maintainable than the alternatives.
Infrastructure as Code began as a way to automate manual processes. With Pulumi, it has become a genuine engineering discipline. The gap between what is possible and what most organizations actually practice remains wide, but the tools and patterns described in this article provide a clear path for closing it. The infrastructure engineers who embrace these practices today will build the foundations on which the next generation of cloud applications runs.

