研发协作
编写或审查 Pulumi 程序时避免资源依赖…
在编写、审查或调试 Pulumi TypeScript/Python 程序时,确保资源依赖正确、密钥加密、重构不破坏资源。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
编写或审查 Pulumi 程序时避免资源特定
解决思路
- 不要在 apply() 内创建资源:资源构造器(如 new aws.xxx)必须放在 apply() 回调之外,直接把 Output 作为输入传给依赖资源,让 Pulumi 自动处理依赖;apply 只用于转换输出值(标签、名称、拼接字符串)、日志调试或影响资源属性的条件逻辑,不用于决定资源是否存在。
- 直接把 Output 作为输入传递:不要用 apply 提取值再赋给变量后作为输入,也不要在 apply 外 await Output;字符串插值用 pulumi.interpolate`prefix-${bucket.id}-suffix`,简单拼接用 pulumi.concat("prefix-", bucket.id, "-suffix"),以保持依赖链完整。
- 用 ComponentResource 封装相关资源:把多个相关资源组合成可复用的 ComponentResource 类,类型 URN 采用 organization:module:ComponentName 格式,构造函数末尾调用 registerOutputs(),把输出暴露为类属性,并接受 ComponentResourceOptions 以便调用方设置 provider、alias 等。
- 在组件内始终设置 parent: this:为组件内创建的每个子资源传入 { parent: this },使资源在 Pulumi 控制台中嵌套显示、删除组件时级联删除子资源、组件上的 alias 自动应用到子资源,并保持状态文件中的归属清晰。
- 从第一天起加密密钥:用 pulumi config set --secret 设置密码、API key、token、私钥、证书、含凭据的连接串、OAuth client secret、加密密钥;代码中用 config.requireSecret() 读取,用 pulumi.interpolate 构造的连接串仍是 secret Output,必要时用 pulumi.secret() 显式标记;可用 Pulumi ESC 集中管理(在 Pulumi.yaml 中 environment 引用,用 esc env set ... --secret 设置)。
- 重构时使用 aliases 保留资源身份:重命名资源、移入/移出组件、改变 parent 时,在资源选项中加 aliases,如 aliases: [{ name: "old-name" }]、aliases: [{ name: "resource-name", parent: oldParent }] 或完整 URN;流程为:重构时加 alias → 在所有 stack 上运行 pulumi up → 所有 stack 更新后再移除 alias。
- 每次部署前先 preview:先运行 pulumi preview 并审查输出,再运行 pulumi up;关注 + create、~ update、- delete、+-replace、~+-replace 等符号,警惕意外的 replace 或删除;CI/CD 中在 PR 上运行 preview 并把输出作为评论,合并到 main 后才部署,例如 GitHub Actions 中 preview job 与 deploy job 分离、deploy 依赖 preview。
适用边界 · 注意事项
- 不使用 Pulumi 管理基础设施(如使用 Terraform、CloudFormation 等其他 IaC 工具)时不适用。
- 不涉及 TypeScript/Python 编写的 Pulumi 程序(如仅使用其他语言或仅做概念咨询)时,部分实践不直接适用。
- 没有 Pulumi Cloud 或 ESC 账号时,ESC 集中密钥管理相关做法无法使用。