Next-levelinfrastructure as code for humans and agents.

Ship cloud infrastructure at the speed of AI with languages and tools that stay out of your way.

The complete platform for infrastructure teams

From open source IaC to AI-driven workflows, Pulumi gives platform teams all they need to build and scale cloud infrastructure.

A unified platform built on real programming languages that covers the full infrastructure stack, so your team can focus on shipping.

Real languages

Write infrastructure code in TypeScript, Python, Go, C#, or Java — the same languages your team already uses to build software.

Secure by default

Meet compliance requirements with encrypted secrets, dynamic credentials, and full audit trails. Pulumi is SOC 2 Type II certified.

AI for infrastructure

Generate, debug, and refactor your infrastructure code with built-in best practices and full organizational context.

Take advantage of your language of choice to build reusable components and share them with package managers like npm, PyPI, and NuGet. Get all of the benefits of your IDE, including type checking, code navigation, inline docs, testing, and more.

The first AI agent built for infrastructure. Pulumi Neo understands your code and organizational context, respects your policies, and executes complex tasks end-to-end — with or without a human in the loop.

A single interface across all of your secrets. Pull in Vault, AWS Secrets Manager, Azure Key Vault, and more, plus support for short-lived creds with OIDC.

Use natural language queries to find managed and unmanaged resources — even across clouds. Enforce policies, track compliance in real-time, and find vulnerabilities before they become incidents.

Define golden paths for approved infrastructure with configurable components and customizable templates that enable developers while keeping platform teams in control.

See how engineering teams use Pulumi to ship infrastructure faster, improve security, and reduce cloud complexity.

New Release:Building for the Agentic Era

Get started Contact us

index.ts

TypeScript

  • TypeScript
  • Python
  • Go
  • C#
  • Java
  • YAML
import * as aws from "@pulumi/aws";
import * as awsx from "@pulumi/awsx";

const vpc = new awsx.ec2.Vpc("vpc");
const azs = await aws.getAvailabilityZones({ state: "available" });

const subnets = azs.names.map((az, i) =>
  new aws.ec2.Subnet(`subnet-${i}`, {
    vpcId: vpc.vpcId,
    cidrBlock: `10.0.${i}.0/24`,
    availabilityZone: az,
  })
);

Copy

import pulumi_aws as aws
import pulumi_awsx as awsx

azs = aws.get_availability_zones(state="available")
vpc = awsx.ec2.Vpc("vpc")

for i, az in enumerate(azs.names):
    aws.ec2.Subnet(f"subnet-{i}",
        vpc_id=vpc.vpc_id,
        cidr_block=f"10.0.{i}.0/24",
        availability_zone=az,
    )

Copy

package main

import (
    "fmt"

"github.com/pulumi/pulumi-aws/sdk/v6/go/aws"
    "github.com/pulumi/pulumi-aws/sdk/v6/go/aws/ec2"
    awsx "github.com/pulumi/pulumi-awsx/sdk/v2/go/awsx/ec2"
    "github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

func main() {
    pulumi.Run(func(ctx *pulumi.Context) error {
        vpc, _ := awsx.NewVpc(ctx, "vpc", nil)
        azs, _ := aws.GetAvailabilityZones(ctx, &aws.GetAvailabilityZonesArgs{State: pulumi.StringRef("available")}, nil)

for i, az := range azs.Names {
            ec2.NewSubnet(ctx, fmt.Sprintf("subnet-%d", i), &ec2.SubnetArgs{
                VpcId:            vpc.VpcId,
                CidrBlock:        pulumi.String(fmt.Sprintf("10.0.%d.0/24", i)),
                AvailabilityZone: pulumi.String(az),
            })
        }
        return nil
    })
}

Copy

using System.Linq;
using Pulumi;
using Pulumi.Aws;
using Pulumi.Aws.Ec2;

return await Deployment.RunAsync(() =>
{
    var vpc = new Pulumi.Awsx.Ec2.Vpc("vpc");
    var azs = GetAvailabilityZones.Invoke(new() { State = "available" });

var subnets = azs.Apply(result =>
        result.Names.Select((az, i) =>
            new Subnet($"subnet-{i}", new()
            {
                VpcId = vpc.VpcId,
                CidrBlock = $"10.0.{i}.0/24",
                AvailabilityZone = az,
            })
        ).ToList()
    );
});

Copy

package myproject;

import com.pulumi.Pulumi;
import com.pulumi.aws.ec2.Vpc;
import com.pulumi.aws.ec2.Subnet;
import com.pulumi.aws.ec2.SubnetArgs;
import com.pulumi.aws.AwsFunctions;
import com.pulumi.aws.inputs.GetAvailabilityZonesPlainArgs;

public class App {
    public static void main(String[] args) {
        Pulumi.run(ctx -> {
            var vpc = new Vpc("vpc");

var azs = AwsFunctions.getAvailabilityZonesPlain(
                GetAvailabilityZonesPlainArgs.builder()
                    .state("available")
                    .build()
            ).join();

var names = azs.names();
            for (int i = 0; i < names.size(); i++) {
                new Subnet("subnet-" + i, SubnetArgs.builder()
                    .vpcId(vpc.id())
                    .cidrBlock("10.0." + i + ".0/24")
                    .availabilityZone(names.get(i))
                    .build());
            }
        });
    }
}

Copy

variables:
  azs:
    fn::invoke:
      function: aws:getAvailabilityZones
      arguments:
        state: available

resources:
  vpc:
    type: awsx:ec2:Vpc

subnet-0:
    type: aws:ec2:Subnet
    properties:
      vpcId: ${vpc.vpcId}
      cidrBlock: "10.0.0.0/24"
      availabilityZone: ${azs.names[0]}

subnet-1:
    type: aws:ec2:Subnet
    properties:
      vpcId: ${vpc.vpcId}
      cidrBlock: "10.0.1.0/24"
      availabilityZone: ${azs.names[1]}

Copy

Trusted by over 4,000 innovative companies

Explore the platform

"Pulumi helped our team to ship a new product faster. We needed one tool to set up and manage multi-cloud, multi-region Kubernetes clusters that infrastructure and applications teams could use collaboratively."

Justin Fitzhugh

VP of Cloud Platform Engineering

Don't just write IaC — compose it

Learn more about IaC

Meet Neo, your AI platform engineer

Learn more about Neo

Centralized configuration & secrets

Learn more about Pulumi ESC

Insights & governance

Learn more about insights & governance

Self-service infrastructure

Learn more about IDP

Trusted by 4,000+ innovative companies

Read our customer stories

\ \

“There’s no question that, if we had gone down the traditional infrastructure automation route, it would have taken us a week or a week and a half to do one deployment of the cluster […] When we demonstrated to people that what used to take a week and a half now, with Pulumi, took under a day, they were shocked.”\ \ Raman Hariharan, Director of Cloud Platform Engineering, Snowflake](/content/case-studies/snowflake/index.html)

\ \

“The infrastructure team acts as groundkeepers of our Pulumi practices, not gatekeepers, but promoters for the entire org.”\ \ Paul Cioanca, Platform Engineer at Supabase](/content/case-studies/supabase/index.html)

\ \

“Pulumi supercharged our infrastructure team by helping us create reusable building blocks that developers can leverage to provision new resources and enforce organizational policies for logging, permissions, resource tagging, and security."\ \ Igor Shapiro, Principal Engineer, Lemonade](/content/case-studies/lemonade/index.html)

\ \

“Terraform relies on HCL and lacks support for concepts like classes, objects and inheritance.\ An equivalent deployment would take more lines of code while yielding IaC that is less reusable.”](/content/case-studies/unity/index.html)

Open source. Built by engineers for engineers.

Join the Pulumi community, and let’s build together.

Join us on Slack

I love @PulumiCorp so much because it is like 50% of the reason why we dared to build https://planton.cloud. An equivalent of 50K lines of declarative infra code has been put behind APIs to support the features on the platform with https://www.pulumi.com/docs/using-pulumi/automation-api/

@swarupdonepudi

There is no way around the fact that devops is complicated but @PulumiCorp is a game changer for me. Blows away CloudForamtion, TerraForm, CDK, etc.

@BryanMigliorisi

The developer experience of Pulumi is just sublime. As a prior Terraform user, the grass is substantially greener on this side. I'm so glad I made the switch two years back. Using Terraform for my current use case would be a massive downgrade.

@justedagain

Give Pulumi a shot and you will never look back @PulumiCorp

@hossambarakat_

Deploying cloud resources using @PulumiCorp is just amazing. Why would anybody bother with JSON, YAML or some other DSL?

@ddoomen

Been using Pulumi with Typescript for a IaaC managing k8s and stateful databases. Don't see myself going back to using terraform after this.

@Meliora245

our team at @devseed is now gravitating toward using https://pulumi.com/docs/iac/comparisons/terraform/ instead of terraform because it's all in python so it is easier to onboard new people to the tool and makes it easier to manage the same infra definition in different test, staging, and deploy envs.

@rybavery

It wouldn't have been possible to build Sparky without @PulumiCorp. Shout out to the team and community for helping us get up and running!

@SparkyCodes

New gig uses @PulumiCorp to manage AWS infra. Initially I was skeptical and was tempted to go back to Terraform, but after using pulumi imports and discovering the ability to write tests easily, I'm a convert. (1/4)

@krangarajan

@swarupdonepudi

There is no way around the fact that devops is complicated but @PulumiCorp is a game changer for me. Blows away CloudForamtion, TerraForm, CDK, etc.

@BryanMigliorisi

Give Pulumi a shot and you will never look back @PulumiCorp

@hossambarakat_

Deploying cloud resources using @PulumiCorp is just amazing. Why would anybody bother with JSON, YAML or some other DSL?

@ddoomen

There is no way around the fact that devops is complicated but @PulumiCorp is a game changer for me. Blows away CloudForamtion, TerraForm, CDK, etc.

@BryanMigliorisi

@justedagain

Give Pulumi a shot and you will never look back @PulumiCorp

@hossambarakat_

Deploying cloud resources using @PulumiCorp is just amazing. Why would anybody bother with JSON, YAML or some other DSL?

@ddoomen

There is no way around the fact that devops is complicated but @PulumiCorp is a game changer for me. Blows away CloudForamtion, TerraForm, CDK, etc.

@BryanMigliorisi

@justedagain

@krangarajan

@swarupdonepudi

@rybavery

It wouldn't have been possible to build Sparky without @PulumiCorp. Shout out to the team and community for helping us get up and running!

@SparkyCodes

@krangarajan

@swarupdonepudi

@rybavery

It wouldn't have been possible to build Sparky without @PulumiCorp. Shout out to the team and community for helping us get up and running!

@SparkyCodes

@justedagain

Give Pulumi a shot and you will never look back @PulumiCorp

@hossambarakat_

Deploying cloud resources using @PulumiCorp is just amazing. Why would anybody bother with JSON, YAML or some other DSL?

@ddoomen

There is no way around the fact that devops is complicated but @PulumiCorp is a game changer for me. Blows away CloudForamtion, TerraForm, CDK, etc.

@BryanMigliorisi

@justedagain

Give Pulumi a shot and you will never look back @PulumiCorp

@hossambarakat_

Deploying cloud resources using @PulumiCorp is just amazing. Why would anybody bother with JSON, YAML or some other DSL?

@ddoomen

There is no way around the fact that devops is complicated but @PulumiCorp is a game changer for me. Blows away CloudForamtion, TerraForm, CDK, etc.

@BryanMigliorisi

@justedagain

Give Pulumi a shot and you will never look back @PulumiCorp

@hossambarakat_

It wouldn't have been possible to build Sparky without @PulumiCorp. Shout out to the team and community for helping us get up and running!

@SparkyCodes

@krangarajan

@swarupdonepudi

@rybavery

It wouldn't have been possible to build Sparky without @PulumiCorp. Shout out to the team and community for helping us get up and running!

@SparkyCodes

@krangarajan

@swarupdonepudi

@rybavery

It wouldn't have been possible to build Sparky without @PulumiCorp. Shout out to the team and community for helping us get up and running!

@SparkyCodes

@krangarajan