关于 pulumi-terraform-to-pulumi
pulumi-terraform-to-pulumi 是将 Terraform 项目及状态迁移到 Pulumi 的技能。它协助规划迁移、转换状态、配置 Provider、调整代码,并在准备 Pull Request 前验证预览结果。
主要功能
- 01规划迁移范围和目标语言
- 02使用 terraform-migrate 转换 Terraform 状态
- 03安装所需 Pulumi Provider
- 04使源代码与转换后的状态一致
- 05使用 Pulumi preview 验证变更
适用场景
- 01将由 Terraform 管理的基础设施迁移到 Pulumi 项目
- 02在评审前检查迁移是否产生意外资源变更
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ pulumi/ agent-skills --skill pulumi-terraform-to-pulumi安装后在 Claude Code 中输入/pulumi-terraform-to-pulumi确认已加载。
附带文件agents/openai.yamluse_cases.yaml
详细介绍
从 Terraform 迁移到 Pulumi
重要限制 — 操作前请阅读:
- 不要运行
pulumi convert—— 请改用terraform-migrate插件,该插件可以保留状态映射。- 不要运行
pulumi package add terraform-module—— 这适用于不同的工作流。- 不要在
/workspace下创建 Pulumi 项目 —— 请在已检出的仓库内创建。- 将下方的
${terraform_dir}和${pulumi_dir}替换为与用户确认的实际路径。
首先,与用户确认以下信息,以明确迁移范围并制定计划:
- Terraform 源文件所在位置(
${terraform_dir}) - 迁移后的 Pulumi 项目所在位置(
${pulumi_dir}) - 目标 Pulumi 语言(例如 TypeScript、Python、YAML)
- 迁移是否旨在设置 Pulumi 堆栈状态,还是仅转换源代码
继续操作前,请与用户确认计划。
使用选定的语言,在 ${pulumi_dir} 中创建一个新的 Pulumi 项目。编辑源文件,使其为空且不声明任何资源。确保存在 Pulumi 堆栈。
继续操作前,必须运行 pulumi_up 工具,以确保初始堆栈状态已写入。
如果 ${terraform_dir} 中不存在本地 .tfstate 文件,状态可能位于远程后端(S3、Pulumi Cloud、Terraform Cloud 等)。继续操作前,请先拉取状态:
cd ${terraform_dir} && terraform state pull > terraform.tfstate
此命令适用于所有后端,包括 Pulumi Cloud。如果无法使用 terraform,请改用 tofu state pull。
现在生成 Pulumi 状态转换草稿:
pulumi plugin run terraform-migrate -- stack \
--from ${terraform_dir} \
--to ${pulumi_dir} \
--out /tmp/pulumi-state.json \
--plugins /tmp/required-providers.json
不要安装此插件,因为它会在需要时自动安装。
有时,terraform-migrate 插件会因 tofu refresh 未获授权而失败。不要跳过此步骤。请与用户一起查找或创建可提供所需凭据的 Pulumi ESC 环境,以确保命令能够成功执行。如果无法设置 ESC 环境,请告知用户迁移无法自动继续。
读取生成的 /tmp/required-providers.json,并将其中列出的所有 Pulumi Provider 安装到新项目中,即使建议的版本会降级已安装的 Provider,也要遵循建议版本。文件将包含类似 [{"name":"aws","version":"7.12.0"}] 的记录。
使用对应语言的包管理器将 Provider 安装为项目依赖(不要使用 pulumi plugin install,它只会下载插件,不会添加依赖):
# TypeScript/JavaScript
npm install @pulumi/[email protected]
# Python
pip install pulumi_aws==7.12.0
# Go
go get github.com/pulumi/pulumi-aws/sdk/[email protected]
# C#
dotnet add package Pulumi.Aws --version 7.12.0
将转换后的状态草稿(/tmp/pulumi-state.json)导入 Pulumi 堆栈:
pulumi stack import --file /tmp/pulumi-state.json
转换源代码,使其同时匹配 Terraform 源代码和转换后的状态。尽量做到完全匹配。可以参考状态草稿 /tmp/pulumi-state.json,了解可使用的 Pulumi 资源类型和名称。
反复修正源代码,直到 pulumi_preview 工具确认无需进行任何更改,且差异为空或接近为空。Provider 差异或标签差异可能可以接受。
向用户提议将 ESC 环境关联到堆栈,以便每个 Pulumi 堆栈都能无缝访问所需的 Provider 凭据。
一切就绪后,使用迁移后的源代码创建 Pull Request。