Pulumi's Node.js SDK for infrastructure-as-code platform that allows you to create, deploy, and manage infrastructure using familiar programming languages and tools.
85
Pulumi's Automation API enables programmatic management of Pulumi stacks and workspaces, allowing you to build custom deployment tools, CI/CD integrations, and infrastructure management applications.
abstract class Workspace {
abstract workDir: string;
abstract pulumiHome?: string;
abstract program?: PulumiFn;
abstract envVars: { [key: string]: string };
abstract secretsProvider?: string;
abstract projectSettings(): Promise<ProjectSettings>;
abstract saveProjectSettings(settings: ProjectSettings): Promise<void>;
abstract stackSettings(stackName: string): Promise<StackSettings>;
abstract saveStackSettings(stackName: string, settings: StackSettings): Promise<void>;
abstract serializeArgsForOp(stackName: string): Promise<string[]>;
abstract postCommandCallback(stackName: string): Promise<void>;
}
class LocalWorkspace extends Workspace {
static create(args?: LocalWorkspaceOptions): Promise<LocalWorkspace>;
static createStack(args: LocalProgramArgs): Promise<Stack>;
static selectStack(args: LocalProgramArgs): Promise<Stack>;
static createOrSelectStack(args: LocalProgramArgs): Promise<Stack>;
workDir: string;
pulumiHome?: string;
program?: PulumiFn;
envVars: { [key: string]: string };
secretsProvider?: string;
constructor(opts?: LocalWorkspaceOptions);
projectSettings(): Promise<ProjectSettings>;
saveProjectSettings(settings: ProjectSettings): Promise<void>;
stackSettings(stackName: string): Promise<StackSettings>;
saveStackSettings(stackName: string, settings: StackSettings): Promise<void>;
installPlugin(name: string, version: string, kind?: string): Promise<void>;
removePlugin(name: string, versionRange?: string, kind?: string): Promise<void>;
listPlugins(): Promise<PluginInfo[]>;
exportStack(stackName: string): Promise<Deployment>;
importStack(stackName: string, state: Deployment): Promise<void>;
whoAmI(): Promise<string>;
pulumiVersion(): Promise<string>;
}class Stack {
readonly name: string;
readonly workspace: Workspace;
constructor(name: string, workspace: Workspace);
// Core operations
up(opts?: UpOptions): Promise<UpResult>;
preview(opts?: PreviewOptions): Promise<PreviewResult>;
refresh(opts?: RefreshOptions): Promise<RefreshResult>;
destroy(opts?: DestroyOptions): Promise<DestroyResult>;
// Import/Export operations
import(opts: ImportOptions): Promise<ImportResult>;
export(): Promise<Deployment>;
// Configuration management
getConfig(key: string): Promise<ConfigValue>;
getAllConfig(): Promise<{ [key: string]: ConfigValue }>;
setConfig(key: string, value: ConfigValue): Promise<void>;
setAllConfig(config: { [key: string]: ConfigValue }): Promise<void>;
removeConfig(key: string): Promise<void>;
removeAllConfig(keys: string[]): Promise<void>;
// Stack information
outputs(): Promise<OutputMap>;
history(pageSize?: number, page?: number): Promise<UpdateSummary[]>;
info(): Promise<StackSummary>;
// Stack lifecycle
rename(newName: string): Promise<void>;
cancel(): Promise<void>;
}interface UpOptions {
parallel?: number;
message?: string;
expectNoChanges?: boolean;
diff?: boolean;
replace?: string[];
target?: string[];
targetDependents?: boolean;
policyPacks?: string[];
policyPackConfigs?: { [key: string]: PolicyPackConfig };
refresh?: boolean;
userAgent?: string;
colorMode?: "always" | "never" | "raw" | "auto";
continueOnError?: boolean;
}
interface UpResult {
stdout: string;
stderr: string;
summary: UpdateSummary;
outputs: OutputMap;
}
interface PreviewOptions {
parallel?: number;
message?: string;
expectNoChanges?: boolean;
diff?: boolean;
replace?: string[];
target?: string[];
targetDependents?: boolean;
policyPacks?: string[];
policyPackConfigs?: { [key: string]: PolicyPackConfig };
refresh?: boolean;
userAgent?: string;
colorMode?: "always" | "never" | "raw" | "auto";
}
interface PreviewResult {
stdout: string;
stderr: string;
summary: UpdateSummary;
changeSummary: { [key: string]: number };
}
interface DestroyOptions {
parallel?: number;
message?: string;
target?: string[];
targetDependents?: boolean;
refresh?: boolean;
userAgent?: string;
colorMode?: "always" | "never" | "raw" | "auto";
continueOnError?: boolean;
}
interface DestroyResult {
stdout: string;
stderr: string;
summary: UpdateSummary;
}interface LocalWorkspaceOptions {
workDir?: string;
pulumiHome?: string;
program?: PulumiFn;
envVars?: { [key: string]: string };
secretsProvider?: string;
kubeconfig?: string;
projectSettings?: ProjectSettings;
stackSettings?: { [key: string]: StackSettings };
repo?: GitRepo;
}
interface LocalProgramArgs {
stackName: string;
workDir?: string;
program?: PulumiFn;
opts?: LocalWorkspaceOptions;
}
interface InlineProgramArgs {
stackName: string;
projectName: string;
program: PulumiFn;
opts?: LocalWorkspaceOptions;
}
type PulumiFn = () => Promise<void> | void;
interface ProjectSettings {
name: string;
runtime: ProjectRuntimeInfo;
main?: string;
description?: string;
author?: string;
website?: string;
license?: string;
config?: { [key: string]: ProjectConfigType };
template?: ProjectTemplate;
backend?: ProjectBackend;
options?: ProjectOptions;
plugins?: PluginOptions;
}
interface StackSettings {
secretsProvider?: string;
encryptedKey?: string;
encryptionSalt?: string;
config?: { [key: string]: ConfigValue };
}
interface ConfigValue {
value: string;
secret?: boolean;
}
type OutputMap = { [key: string]: OutputValue };
interface OutputValue {
value: any;
secret: boolean;
}interface EngineEvent {
sequence: number;
timestamp: number;
}
interface CancelEvent extends EngineEvent {
type: "cancelEvent";
}
interface DiagnosticEvent extends EngineEvent {
type: "diagnosticEvent";
urn?: string;
prefix: string;
message: string;
color: string;
severity: "debug" | "info" | "warning" | "error";
streamId?: number;
ephemeral?: boolean;
}
interface PreludeEvent extends EngineEvent {
type: "preludeEvent";
config: { [key: string]: string };
}
interface SummaryEvent extends EngineEvent {
type: "summaryEvent";
maybeCorrupt: boolean;
durationSeconds: number;
resourceChanges?: { [key: string]: number };
policyPacks?: PolicyPackRunInfo[];
}
interface ResourcePreEvent extends EngineEvent {
type: "resourcePreEvent";
metadata: StepEventMetadata;
}
interface ResOutputsEvent extends EngineEvent {
type: "resOutputsEvent";
metadata: StepEventMetadata;
}
interface ResOpFailedEvent extends EngineEvent {
type: "resOpFailedEvent";
metadata: StepEventMetadata;
}import * as pulumi from "@pulumi/pulumi";
import { LocalWorkspace } from "@pulumi/pulumi/automation";
// Create inline program
const program = async () => {
const bucket = new pulumi.aws.s3.Bucket("my-bucket");
return { bucketName: bucket.id };
};
// Create and deploy stack
const stack = await LocalWorkspace.createStack({
stackName: "dev",
projectName: "my-project",
program,
});
// Configure stack
await stack.setConfig("aws:region", { value: "us-east-1" });
// Deploy
const upResult = await stack.up();
console.log(`Update succeeded. Outputs: ${JSON.stringify(upResult.outputs)}`);import { LocalWorkspace, Stack } from "@pulumi/pulumi/automation";
// Create workspace from existing Pulumi project
const workspace = await LocalWorkspace.create({
workDir: "./my-pulumi-project",
});
// Select existing stack
const stack = await Stack.select("production", workspace);
// Preview changes
const previewResult = await stack.preview();
console.log(`Preview completed: ${previewResult.changeSummary}`);
// Apply if changes look good
if (previewResult.changeSummary.create > 0) {
const upResult = await stack.up();
console.log("Deployment completed");
}import { LocalWorkspace, Stack } from "@pulumi/pulumi/automation";
const workspace = await LocalWorkspace.create({
workDir: "./project",
});
const stack = await Stack.select("staging", workspace);
// Set multiple configuration values
await stack.setAllConfig({
"app:environment": { value: "staging" },
"app:replica-count": { value: "3" },
"app:database-password": { value: "secret123", secret: true },
"aws:region": { value: "us-west-2" },
});
// Get configuration
const config = await stack.getAllConfig();
console.log("Current configuration:", config);
// Remove configuration
await stack.removeConfig("app:old-setting");import { LocalWorkspace, Stack } from "@pulumi/pulumi/automation";
const stack = await Stack.select("production", workspace);
// Monitor deployment events
const upResult = await stack.up({
onOutput: (out: string) => {
console.log(`Output: ${out}`);
},
onEvent: (event) => {
if (event.type === "diagnosticEvent") {
console.log(`${event.severity}: ${event.message}`);
} else if (event.type === "resourcePreEvent") {
console.log(`Starting ${event.metadata.op} on ${event.metadata.type}`);
}
},
});import { LocalWorkspace, Stack } from "@pulumi/pulumi/automation";
const stack = await Stack.select("production", workspace);
// Get deployment history
const history = await stack.history();
console.log(`Found ${history.length} deployments`);
// Find last successful deployment
const lastSuccessful = history.find(h => h.result === "succeeded");
if (lastSuccessful) {
console.log(`Last successful deployment: ${lastSuccessful.version}`);
// Rollback to previous version (manual process)
// This would typically involve:
// 1. Export the target state
// 2. Import it as the current state
// 3. Run refresh to sync
}import { LocalWorkspace, Stack } from "@pulumi/pulumi/automation";
const workspace = await LocalWorkspace.create({
workDir: "./infrastructure",
});
const environments = ["dev", "staging", "production"];
for (const env of environments) {
const stack = await Stack.select(env, workspace);
// Environment-specific configuration
const envConfig = {
"app:environment": { value: env },
"app:replica-count": { value: env === "production" ? "5" : "2" },
"aws:region": { value: env === "production" ? "us-east-1" : "us-west-2" },
};
await stack.setAllConfig(envConfig);
// Deploy with environment-specific options
const upResult = await stack.up({
parallel: env === "production" ? 1 : 10, // More careful in prod
message: `Automated deployment to ${env}`,
});
console.log(`${env} deployment completed`);
}import { LocalWorkspace, Stack } from "@pulumi/pulumi/automation";
class DeploymentManager {
private workspace: LocalWorkspace;
constructor(private projectPath: string) {}
async initialize() {
this.workspace = await LocalWorkspace.create({
workDir: this.projectPath,
});
}
async deployToEnvironment(environment: string, config: Record<string, any>) {
const stack = await Stack.createOrSelect(environment, this.workspace);
// Apply configuration
const configValues = Object.entries(config).reduce((acc, [key, value]) => {
acc[key] = typeof value === "object" && value.secret
? { value: value.value, secret: true }
: { value: String(value) };
return acc;
}, {} as Record<string, any>);
await stack.setAllConfig(configValues);
// Preview first
console.log(`Previewing changes for ${environment}...`);
const previewResult = await stack.preview();
if (previewResult.changeSummary.create === 0 &&
previewResult.changeSummary.update === 0 &&
previewResult.changeSummary.delete === 0) {
console.log("No changes required");
return;
}
// Confirm deployment
console.log("Changes detected:", previewResult.changeSummary);
// Deploy
console.log(`Deploying to ${environment}...`);
const upResult = await stack.up();
console.log("Deployment completed successfully");
console.log("Outputs:", upResult.outputs);
return upResult;
}
async listStacks() {
const stacks = await this.workspace.listStacks();
return stacks.map(s => ({
name: s.name,
current: s.current,
lastUpdate: s.lastUpdate,
resourceCount: s.resourceCount,
}));
}
}
// Usage
const manager = new DeploymentManager("./my-infrastructure");
await manager.initialize();
await manager.deployToEnvironment("staging", {
"app:environment": "staging",
"app:database-password": { value: "secret123", secret: true },
"aws:region": "us-west-2",
});Install with Tessl CLI
npx tessl i tessl/npm-pulumi--pulumidocs
evals
scenario-1
scenario-2
scenario-3
scenario-4
scenario-5
scenario-6
scenario-7
scenario-8
scenario-9
scenario-10