Pulumi:用 TypeScript 编写基础设施即代码
Raj Kumar | 2026-09-01T08:57:24 | DevOps, Cloud
对比 Terraform HCL 与 Pulumi TypeScript,演示 AWS 资源编排、状态管理、Stack 环境切换及 Policy as Code。
# Pulumi:用 TypeScript 编写基础设施即代码 ## 为什么选择 Pulumi Terraform 使用 HCL 声明式语言,而 Pulumi 支持 TypeScript/Python/Go 等通用编程语言,可以利用条件判断、循环、函数抽象等编程能力。 ## 快速上手 ```typescript import * as pulumi from "@pulumi/pulumi" import * as aws from "@pulumi/aws" const config = new pulumi.Config() const env = pulumi.getStack() // dev / staging / prod // VPC const vpc = new aws.ec2.Vpc("main-vpc", { cidrBlock: "10.0.0.0/16", enableDnsHostnames: true, tags: { Name: "main-vpc-" + env, Environment: env } }) // 自动创建多个子网 const azs = ["us-east-1a", "us-east-1b", "us-east-1c"] const subnets = azs.map((az, index) => { return new aws.ec2.Subnet("subnet-" + index, { vpcId: vpc.id, cidrBlock: "10.0." + index + ".0/24", availabilityZone: az, mapPublicIpOnLaunch: true, tags: { Name: "subnet-" + az } }) }) ``` ## RDS 数据库 ```typescript const dbPassword = config.requireSecret("dbPassword") const dbSubnetGroup = new aws.rds.SubnetGroup("db-subnets", { subnetIds: subnets.map(s => s.id) }) const database = new aws.rds.Instance("app-db", { engine: "mysql", engineVersion: "8.0", instanceClass: "db.t3.medium", allocatedStorage: 50, dbName: "appdb", username: "admin", password: dbPassword, dbSubnetGroupName: dbSubnetGroup.name, skipFinalSnapshot: env !== "prod", multiAz: env === "prod", tags: { Environment: env } }) export const dbEndpoint = database.endpoint export const dbPort = database.port ``` ## Stack 环境管理 ```bash # 创建不同环境的 Stack pulumi stack init dev pulumi stack init staging pulumi stack init prod # 切换环境 pulumi stack select prod # 设置环境变量 pulumi config set aws:region us-east-1 pulumi config set --secret dbPassword "MyS3cur3P@ss" # 部署 pulumi up --yes ``` ## 可复用组件 ```typescript class AppCluster extends pulumi.ComponentResource { public readonly endpoint: pulumi.Output constructor(name: string, args: AppClusterArgs, opts?: pulumi.ComponentResourceOptions) { super("custom:app:Cluster", name, {}, opts) const cluster = new aws.ecs.Cluster(name, {}, { parent: this }) // ... more resources this.endpoint = cluster.id this.registerOutputs({ endpoint: this.endpoint }) } } ``` Pulumi 对已有 Terraform 状态提供导入工具 `pulumi import`,迁移成本较低。推荐在需要复杂逻辑编排的场景中使用。