Aller au contenu

Pulumi Cheatsheet

Pulumi Cheatsheet

Installation

PlatformCommand
Linux (curl)`curl -fsSL https://get.pulumi.com \
macOS (Homebrew)brew install pulumi
Windows (Chocolatey)choco install pulumi
Windows (PowerShell)iex ((New-Object System.Net.WebClient).DownloadString('https://get.pulumi.com/install.ps1'))
Dockerdocker pull pulumi/pulumi
Python SDKpip install pulumi
Node.js SDKnpm install -g @pulumi/pulumi
Verify Installationpulumi version

Language Runtime Requirements

LanguageMinimum VersionProvider Installation
Python3.7+pip install pulumi-aws pulumi-azure-native
Node.js/TypeScript14.x+npm install @pulumi/aws @pulumi/azure-native
Go1.18+go get github.com/pulumi/pulumi-aws/sdk/v6/go/aws
.NET/C#6.0+dotnet add package Pulumi.Aws

Basic Commands

Project Management

CommandDescription
pulumi newCreate new project interactively
pulumi new aws-typescriptCreate project from specific template
pulumi new --listList all available templates
pulumi new aws-python --name my-infra --yesCreate project with name, skip prompts
pulumi new https://github.com/user/templateCreate from custom template URL

Stack Operations

CommandDescription
pulumi stack lsList all stacks in current project
pulumi stack init devCreate new stack named “dev”
pulumi stack select devSwitch to “dev” stack
pulumi stackShow current stack information
pulumi stack outputDisplay all stack outputs
pulumi stack output bucketNameGet specific output value
pulumi stack output --jsonExport outputs as JSON
pulumi stack rm devDelete “dev” stack
pulumi stack rename new-nameRename current stack
pulumi stack --show-urnsList resources with URNs

Configuration

CommandDescription
pulumi configList all configuration values
pulumi config set aws:region us-west-2Set configuration value
pulumi config set --secret dbPassword pass123Set encrypted secret value
pulumi config get aws:regionGet configuration value
pulumi config rm instanceTypeRemove configuration value
pulumi config set-all --plaintext < config.jsonSet config from file
pulumi config cp dev stagingCopy config between stacks

Deployment

CommandDescription
pulumi previewPreview changes without applying (dry run)
pulumi preview --diffShow detailed resource differences
pulumi upDeploy infrastructure changes
pulumi up --yesDeploy without confirmation prompt
pulumi up --parallel 10Deploy with 10 parallel operations
pulumi destroyDestroy all resources in stack
pulumi destroy --yesDestroy without confirmation
pulumi refreshSync state with actual cloud resources
pulumi refresh --yesRefresh without confirmation
pulumi cancelCancel in-progress update

Authentication

CommandDescription
pulumi loginLogin to Pulumi Service (SaaS)
pulumi login --access-token pul-abc123Login with access token
pulumi login s3://my-bucketUse S3 as state backend
pulumi login azblob://containerUse Azure Blob as state backend
pulumi login file://~/.pulumi/localUse local filesystem backend
pulumi logoutLogout from current backend
pulumi whoamiShow current logged-in user

Advanced Usage

Resource Targeting

CommandDescription
pulumi up --target urn:pulumi:dev::project::aws:s3/bucket:Bucket::my-bucketDeploy only specific resource
pulumi destroy --target urn:pulumi:dev::project::aws:ec2/instance:Instance::webDestroy specific resource
pulumi preview --target-dependentsPreview resource and its dependents
pulumi up --replace urn:pulumi:dev::project::aws:ec2/instance:Instance::webForce replacement of resource

State Management

CommandDescription
pulumi stack export --file backup.jsonExport stack state to file
pulumi stack import --file backup.jsonImport stack state from file
pulumi state deleteClear pending operations
pulumi state unprotect urn:pulumi:dev::project::resourceRemove protection from resource
pulumi stack graph stack.dotGenerate dependency graph (DOT format)
pulumi historyView stack update history

Policy as Code

CommandDescription
pulumi policy new aws-typescriptCreate new policy pack
pulumi policy publish my-org/my-policyPublish policy pack to organization
pulumi policy enable my-policy latestEnable policy pack for organization
pulumi policy disable my-policyDisable policy pack
pulumi policy lsList all policy packs
pulumi up --policy-pack ./policiesRun deployment with local policy pack
pulumi preview --policy-pack ./policiesPreview with policy enforcement

Logging and Debugging

CommandDescription
pulumi logsView logs from all resources
pulumi logs --followStream logs in real-time
pulumi logs --resource my-functionFilter logs by resource name
pulumi logs --since 2hShow logs from last 2 hours
pulumi up --logtostderr -v=9Deploy with verbose debug logging
pulumi up --suppress-outputsHide sensitive output values

Secrets Management

CommandDescription
pulumi config set --secret apiKey sk-123Store encrypted secret
pulumi config get --show-secretsDisplay decrypted secret values
pulumi stack export --show-secretsExport state with decrypted secrets
pulumi config refreshRe-encrypt secrets with new key

Organization Management

CommandDescription
pulumi org lsList all organizations
pulumi org get-defaultShow default organization
pulumi org set-default my-orgSet default organization
pulumi org create my-new-orgCreate new organization

Plugin Management

CommandDescription
pulumi plugin lsList installed plugins
pulumi plugin install resource aws v5.0.0Install specific plugin version
pulumi plugin rm resource aws v4.0.0Remove plugin version

Configuration

Pulumi.yaml (Project Configuration)

name: my-infrastructure
runtime: python
description: Production AWS infrastructure
backend:
  url: s3://my-pulumi-state-bucket

Pulumi.dev.yaml (Stack Configuration)

config:
  aws:region: us-west-2
  myproject:instanceType: t3.micro
  myproject:dbPassword:
    secure: AAABAHVzLXdlc3QtMg==  # Encrypted value
  myproject:environment: development
  myproject:enableMonitoring: "true"

Environment Variables

# Backend configuration
export PULUMI_BACKEND_URL=s3://my-bucket
export PULUMI_CONFIG_PASSPHRASE=mysecretkey

# AWS credentials
export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

# Pulumi Service
export PULUMI_ACCESS_TOKEN=pul-abc123def456

# Debugging
export PULUMI_DEBUG_COMMANDS=true
export PULUMI_DEBUG_PROMISE_LEAKS=true

.pulumi/ Directory Structure

.pulumi/
├── stacks/
│   ├── dev.json          # Stack-specific state
│   └── production.json
├── backups/              # Automatic state backups
└── plugins/              # Downloaded provider plugins

Common Use Cases

Use Case 1: Create AWS S3 Bucket with Python

# Initialize new project
pulumi new aws-python --name my-s3-project --yes

# Configure AWS region
pulumi config set aws:region us-east-1

# Edit __main__.py to add S3 bucket
cat > __main__.py << 'EOF'
import pulumi
import pulumi_aws as aws

bucket = aws.s3.Bucket('my-bucket',
    acl='private',
    versioning=aws.s3.BucketVersioningArgs(enabled=True),
    tags={'Environment': 'dev', 'Project': 'demo'}
)

pulumi.export('bucket_name', bucket.id)
pulumi.export('bucket_arn', bucket.arn)
EOF

# Preview and deploy
pulumi preview
pulumi up --yes

# Get bucket name
pulumi stack output bucket_name

Use Case 2: Multi-Stack Deployment (Dev/Staging/Prod)

# Create project
pulumi new aws-typescript --yes

# Create and configure dev stack
pulumi stack init dev
pulumi config set aws:region us-west-2
pulumi config set instanceType t3.micro
pulumi config set environment dev

# Create and configure staging stack
pulumi stack init staging
pulumi config set aws:region us-west-2
pulumi config set instanceType t3.small
pulumi config set environment staging

# Create and configure production stack
pulumi stack init production
pulumi config set aws:region us-east-1
pulumi config set instanceType t3.large
pulumi config set environment production

# Deploy to each environment
pulumi stack select dev && pulumi up --yes
pulumi stack select staging && pulumi up --yes
pulumi stack select production && pulumi up --yes

Use Case 3: Kubernetes Deployment with TypeScript

# Create Kubernetes project
pulumi new kubernetes-typescript --yes

# Configure kubeconfig
pulumi config set kubernetes:kubeconfig ~/.kube/config

# Create deployment (index.ts)
cat > index.ts << 'EOF'
import * as k8s from "@pulumi/kubernetes";

const appLabels = { app: "nginx" };
const deployment = new k8s.apps.v1.Deployment("nginx", {
    spec: {
        selector: { matchLabels: appLabels },
        replicas: 3,
        template: {
            metadata: { labels: appLabels },
            spec: { containers: [{ name: "nginx", image: "nginx:1.21" }] }
        }
    }
});

const service = new k8s.core.v1.Service("nginx", {
    spec: {
        type: "LoadBalancer",
        selector: appLabels,
        ports: [{ port: 80, targetPort: 80 }]
    }
});

export const serviceName = service.metadata.name;
export const serviceIP = service.status.loadBalancer.ingress[0].ip;
EOF

# Install dependencies and deploy
npm install
pulumi up --yes

Use Case 4: Infrastructure Testing

# Create project with testing
pulumi new aws-python --yes

# Install testing dependencies
pip install pytest pytest-mock

# Create test file (test_infrastructure.py)
cat > test_infrastructure.py << 'EOF'
import pulumi
import pytest

class MyMocks(pulumi.runtime.Mocks):
    def new_resource(self, args: pulumi.runtime.MockResourceArgs):
        return [args.name + '_id', args.inputs]
    def call(self, args: pulumi.runtime.MockCallArgs):
        return {}

pulumi.runtime.set_mocks(MyMocks())

# Import your infrastructure code
import __main__

@pulumi.runtime.test
def test_bucket_created():
    def check_bucket(args):
        assert args is not None
    return __main__.bucket.arn.apply(check_bucket)
EOF

# Run tests
pytest test_infrastructure.py

Use Case 5: State Migration Between Backends

# Export current state
pulumi stack export --file state-backup.json

# Login to new backend
pulumi login s3://new-state-bucket

# Create stack in new backend
pulumi stack init production

# Import state
pulumi stack import --file state-backup.json

# Verify migration
pulumi preview  # Should show no changes

# Update backend URL in Pulumi.yaml
cat > Pulumi.yaml << 'EOF'
name: my-project
runtime: python
backend:
  url: s3://new-state-bucket
EOF

Best Practices

  • Use Stack References: Share outputs between stacks with StackReference to create modular infrastructure. Example: ref = pulumi.StackReference("org/project/stack") then access ref.get_output("vpcId")

  • Leverage Configuration: Store environment-specific values in stack config files rather than hardcoding. Use pulumi config set for all variable values and --secret flag for sensitive data

  • Implement Resource Protection: Protect critical resources from accidental deletion with protect=True option. Use pulumi.ResourceOptions(protect=True) for databases, stateful resources

  • Version Control Everything: Commit Pulumi.yaml, stack config files, and code to git. Add .pulumi/ directory to .gitignore to exclude state and plugins

  • Use Component Resources: Create reusable infrastructure components by extending pulumi.ComponentResource. Package common patterns (VPC setup, EKS cluster) as components

  • Automate with CI/CD: Integrate Pulumi into pipelines using pulumi preview for PRs and pulumi up --yes for deployments. Use PULUMI_ACCESS_TOKEN environment variable for authentication

  • Tag All Resources: Apply consistent tagging strategy using tags parameter. Include environment, project, owner, cost-center for cost tracking and organization

  • Enable Policy as Code: Enforce organizational standards with policy packs. Validate resource configurations, naming conventions, and security requirements before deployment

  • Regular State Backups: Export stack state periodically with pulumi stack export. Store backups in version-controlled or secure storage separate from primary backend

  • Use Explicit Dependencies: When implicit dependencies aren’t detected, use depends_on or pulumi.Output.all() to ensure correct resource ordering

Troubleshooting

IssueSolution
Error: “no stack selected”Run pulumi stack select <stack-name> or pulumi stack init <new-stack> to create/select a stack
Error: “conflict: Another update is currently in progress”Run pulumi cancel to clear stuck update, or wait for other update to complete. Check pulumi history for details
Error: “failed to decrypt”Ensure PULUMI_CONFIG_PASSPHRASE environment variable is set correctly. Run pulumi config refresh to re-encrypt with current passphrase
Provider plugin not foundRun pulumi plugin install resource <provider> <version> or delete .pulumi/plugins/ and run pulumi up to auto-download
State file corruptionRestore from backup: pulumi stack import --file backup.json. Always keep recent backups with pulumi stack export
Resource already exists errorImport existing resource: pulumi import <type> <name> <id> or use import option in resource definition
Out of sync stateRun pulumi refresh --yes to sync state with actual cloud resources. Review changes before confirming
Secrets not decryptingVerify backend access and encryption key. For Pulumi Service, check PULUMI_ACCESS_TOKEN. For self-managed, verify PULUMI_CONFIG_PASSPHRASE
Performance issues with large stacksIncrease parallelism: pulumi up --parallel 20. Split into multiple smaller stacks using stack references
”pulumi” command not foundAdd Pulumi to PATH: export PATH=$PATH:$HOME/.pulumi/bin (Linux/macOS) or reinstall with package manager
TypeScript compilation errorsRun npm install to ensure dependencies are installed. Check tsconfig.json for correct configuration
Python import errorsActivate virtual environment and run pip install -r requirements.txt. Verify Python version is 3.7+

Quick Reference: Resource URNs

Resource URNs uniquely identify resources in format: urn:pulumi:<stack>::<project>::<type>::<name>

# Get URN from stack output
pulumi stack --show-urns

# Use URN for targeted operations
pulumi up --target urn:pulumi:dev::my-project::aws:s3/bucket:Bucket::my-bucket
pulumi state unprotect urn:pulumi:dev::my-project::aws:rds/instance:Instance::db

# Export specific resource details
pulumi stack export | jq '.deployment.resources[] | select(.urn | contains("my-bucket"))'

Quick Reference: Common Providers

ProviderInstallationImport Statement
AWSpip install pulumi-awsimport pulumi_aws as aws (Python)
Azurepip install pulumi-azure-nativeimport pulumi_azure_native as azure
GCPpip install pulumi-gcpimport pulumi_gcp as gcp
Kubernetesnpm install @pulumi/kubernetesimport * as k8s from "@pulumi/kubernetes" (TS)