Skip to content

Pulumi — Commands & Recipes

Getting Started

# Install Pulumi
curl -fsSL https://get.pulumi.com | sh

# Create new project (TypeScript)
mkdir myinfra && cd myinfra
pulumi new aws-typescript

# Create new project (Python)
pulumi new aws-python

Core Workflow

# Preview changes
pulumi preview

# Deploy
pulumi up

# Destroy
pulumi destroy

# View stack outputs
pulumi stack output

# View stack resources
pulumi stack --show-urns

TypeScript Example (AWS)

import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";

// VPC
const vpc = new aws.ec2.Vpc("main-vpc", {
    cidrBlock: "10.0.0.0/16",
    enableDnsHostnames: true,
    tags: { Name: "production" },
});

// S3 Bucket with encryption
const bucket = new aws.s3.Bucket("data-bucket", {
    acl: "private",
    serverSideEncryptionConfiguration: {
        rule: {
            applyServerSideEncryptionByDefault: {
                sseAlgorithm: "AES256",
            },
        },
    },
});

// Export outputs
export const vpcId = vpc.id;
export const bucketName = bucket.bucket;

Python Example (K8s)

import pulumi
import pulumi_kubernetes as k8s

app_labels = {"app": "nginx"}

deployment = k8s.apps.v1.Deployment("nginx",
    spec=k8s.apps.v1.DeploymentSpecArgs(
        replicas=3,
        selector=k8s.meta.v1.LabelSelectorArgs(match_labels=app_labels),
        template=k8s.core.v1.PodTemplateSpecArgs(
            metadata=k8s.meta.v1.ObjectMetaArgs(labels=app_labels),
            spec=k8s.core.v1.PodSpecArgs(
                containers=[k8s.core.v1.ContainerArgs(
                    name="nginx",
                    image="nginx:1.27",
                    ports=[k8s.core.v1.ContainerPortArgs(container_port=80)],
                )],
            ),
        ),
    ))

pulumi.export("deployment_name", deployment.metadata.name)

Unit Testing (TypeScript)

import * as pulumi from "@pulumi/pulumi";
import { expect } from "chai";

pulumi.runtime.setMocks({
    newResource: (args) => ({ id: args.name + "_id", state: args.inputs }),
    call: (args) => args.inputs,
});

describe("Infrastructure", () => {
    it("should create a VPC with correct CIDR", async () => {
        const infra = await import("../index");
        const cidr = await new Promise((resolve) =>
            infra.vpc.cidrBlock.apply(resolve)
        );
        expect(cidr).to.equal("10.0.0.0/16");
    });
});

Stacks & Config

# Create environments as stacks
pulumi stack init dev
pulumi stack init staging
pulumi stack init production

# Set stack-specific config
pulumi config set aws:region us-east-1
pulumi config set --secret dbPassword "s3cret"

Sources