关于 pulumi-debug-failed-operation
用于诊断并修复失败的 Pulumi 更新或预览。它帮助 Pulumi 用户确认目标操作、检查已记录的诊断信息,并将问题定位到代码、状态或环境后进行针对性修复。
主要功能
- 01确认目标操作和堆栈
- 02读取更新或预览诊断记录
- 03追踪错误对应的资源与原因
- 04将修复归类为代码、状态或环境问题
- 05针对根因进行最小修改
适用场景
- 01调查失败的 Pulumi 更新
- 02根据引擎事件诊断失败的预览
- 03区分资源代码错误与状态漂移
- 04定位凭据、权限或配额问题
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ pulumi/ agent-skills --skill pulumi-debug-failed-operation安装后在 Claude Code 中输入/pulumi-debug-failed-operation确认已加载。
附带文件agents/openai.yamluse_cases.yaml
详细介绍
调试失败的 Pulumi 操作
某个 Pulumi 操作失败了。找出失败原因并修复它。用户通常会指出要调试的操作,因此先确定要调试的是哪个操作,并在进行其他操作之前向用户确认。操作失败时,Pulumi 已记录错误;确定操作后,你可以直接从记录中读取错误,无需再次运行任何操作。
以下命令通过 pulumi api 访问 Pulumi Cloud。pulumi api 是 Pulumi CLI 的子命令,可在 shell 中运行。每条命令都会针对你传入的显式 {orgName}/{projectName}/{stackName} 路径指定的堆栈,因此即使本地未选中该堆栈,你也可以读取其记录。稍后应用修复时,才需要选中该堆栈。
从用户提供的操作开始
用户通常会提供一组操作字段:组织、项目、堆栈和更新版本(或预览 ID)——通常会在描述中提及,例如“调试 vvm-dev 的第 161 次更新”。你需要这些信息来调用 API:{orgName}、{projectName}、{stackName},以及版本或预览 ID。
根据上下文补全缺失字段。从当前选中的堆栈(pulumi stack --show-name、pulumi stack ls)或 Pulumi.yaml 中获取组织、项目或堆栈。缺少版本号时,使用该堆栈最近的一次更新。
在继续读取记录之前,简要确认你找到的操作、其版本或预览 ID,以及对应的堆栈。简单确认即可;用户已经告诉过你这些信息。
读取失败信息
失败的更新和失败的预览都会记录引擎事件,错误信息包含在这些事件的诊断消息中。使用上面确定的字段获取事件,并提取其中的消息。
对于失败的更新,使用带版本号的 update 路径:
pulumi api /api/stacks/{orgName}/{projectName}/{stackName}/update/<version>/events \
| jq -r '.events[].diagnosticEvent | select(. != null) | "[\(.severity)] \(.message)"' \
| sed 's/<{%reset%}>//g'
对于失败的预览,使用带预览 ID 的 preview 路径:
pulumi api /api/stacks/{orgName}/{projectName}/{stackName}/preview/<preview-id>/events \
| jq -r '.events[].diagnosticEvent | select(. != null) | "[\(.severity)] \(.message)"' \
| sed 's/<{%reset%}>//g'
读取每条消息,而不只是标记为 severity == "error" 的消息。提供程序错误带有该 error 标签;但程序错误(预览失败的常见原因)会作为标准错误诊断消息出现,标记为 info#err。末尾的 sed 会去掉 Pulumi 嵌入文本中的终端颜色代码,否则这些代码会显示为 <{%reset%}>。
找出原因及应在哪里修复
一次操作可能会因多个资源而失败,因此请先阅读所有诊断信息,再逐一处理每个错误。将每个错误追溯到引发它的资源(其 URN 和类型)、程序中声明该资源的位置,以及传递给它的输入。
错误文本会告诉你问题的类型,并由此指出应在哪里修复。Pulumi 修复分为三种,确定正确的位置可以避免修改根本没有问题的代码。
- 程序。 代码有误:引用错误、类型错误、提供程序拒绝的输入,或在值解析完成前就使用了该值。这通常是失败的预览会报告的问题,因为计划无法构建。编辑代码来修复。
- 状态。 代码正确,但存储的状态与实际云资源不一致。使用
pulumi refresh协调偏差;对于状态之外已存在的资源,使用pulumi import纳入管理,而不是重新创建。请注意,应用操作在中途失败时,可能已经更改了某些资源,因此在决定之前请检查当前状态。 - 环境。 问题出在 Pulumi 之外:凭据、权限、OIDC 或配额。请修复角色、ESC 环境,或提供程序拒绝的容量,而不是修改资源代码。
如果诊断信息为空或过于简略,无法据此采取行动,真正的错误通常不在记录中,而在该资源调用的程序的日志里。请到那里查看。如果你没有访问权限(例如缺少令牌、无法访问某次运行,或遇到 not-found),请停止并告知用户你受阻之处,以及你需要他们提供的唯一信息。
修复原因
做出能解决根本原因的最小更改。如何确认修复,以及如何交付修复(无论是本地修改还是拉取请求),都应遵循当前模式的工作流,而不是本技能的要求。
如果用户没有说明是哪次操作
如果用户没有提供任何线索,请调试该堆栈上最近一次操作。更新列表不会记录每次更新由谁运行,因此请通过 API 查找:
- 运行
pulumi whoami,获取当前用户的登录名。 - 使用
pulumi api /api/stacks/{orgName}/{projectName}/{stackName}/updates/latest读取最新更新及其发起者,并将其requestedBy.githubLogin与第 1 步获取的登录名进行比较。 - 如果匹配,该更新就是要调试的操作。如果不匹配,则每次回退一个版本,运行
pulumi api /api/stacks/{orgName}/{projectName}/{stackName}/updates/<n>,直到requestedBy.githubLogin与用户匹配。
告诉用户你找到的是哪次操作、其版本、类型和结果,并在继续之前确认这就是他们所指的操作。