深色模式
Pulumi 用代码定义基础设施
摘要:不喜欢 HCL?Pulumi 让你用通用语言写基础设施,能用 if、for、函数和单元测试。本文跑通一个最小示例并说明它适合什么场景。
适用环境
- Linux / macOS / WSL
- Python 3.8+(示例用 Python,Go/TypeScript 同理)
- 一个云厂商账号与凭证(示例用 AWS)
操作步骤
1. 安装与建栈
bash
curl -fsSL https://get.pulumi.com | sh
pulumi login --local # 本地练习可免账号,state 存 ~/.pulumi
mkdir -p ~/pulumi-demo && cd ~/pulumi-demo
pulumi new aws-python --name pulumi-demo --description "demo" --stack dev1
2
3
4
2
3
4
生成的 __main__.py 是普通 Python 文件,可直接用 import、for、函数组织。
2. 写代码定义资源
python
import pulumi
from pulumi_aws import s3
config = pulumi.Config()
env = config.get("env") or "dev"
bucket = s3.Bucket("demo-bucket", tags={"Env": env})
for i in range(2): # 普通 Python 循环
s3.Bucket(f"batch-bucket-{i}", tags={"Env": env, "Index": str(i)})
pulumi.export("bucket_name", bucket.id)1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
3. 配置变量与凭证
bash
pulumi config set env prod
pulumi config set --secret db_password 'S3cr3t' # 自动加密存入栈配置
export AWS_ACCESS_KEY_ID="你的AK"
export AWS_SECRET_ACCESS_KEY="你的SK"
export AWS_REGION="ap-northeast-1"1
2
3
4
5
2
3
4
5
4. 预览与执行
bash
pulumi preview # 等价 terraform plan
pulumi up # 等价 terraform apply
pulumi stack output bucket_name
pulumi destroy # 销毁资源1
2
3
4
2
3
4
5. 怎么选型
text
选 Pulumi:团队是开发背景,想复用 IDE、单测、类型检查;资源逻辑复杂需大量抽象
选 Terraform / OpenTofu:运维主导,希望声明式低门槛;依赖成熟模块生态1
2
2
危险
pulumi destroy 会真实删除资源且默认不保留快照。操作前先 pulumi preview --diff,有状态资源要开删除保护。
验证
bash
pulumi preview --diff && pulumi stack output bucket_name1
- [ ] preview 显示的资源数量与代码中定义一致
- [ ]
--secret的值在Pulumi.dev.yaml中呈现为密文 - [ ] 连续两次
pulumi up,第二次无变更(幂等)
常见坑
资源逻辑名改动会重建
Pulumi 用逻辑名(如 demo-bucket)标识资源,改名会导致销毁+新建。改名需用 aliases 声明。
代码结构调整被识别为变更
Pulumi 把代码作为真实来源,任何缩进/结构调整都可能被识别为变更。提交前先 preview 确认。
没设 region
Pulumi 不强制 provider region。忘记配置 AWS_REGION 时报错信息不直观。