mcpField
P
pulumi-terraform-to-pulumi

pulumi-terraform-to-pulumi

github.com/pulumi云与 DevOps78963 次安装3 周前更新
代码仓库

关于 pulumi-terraform-to-pulumi

pulumi-terraform-to-pulumi 是将 Terraform 项目及状态迁移到 Pulumi 的技能。它协助规划迁移、转换状态、配置 Provider、调整代码,并在准备 Pull Request 前验证预览结果。

主要功能

  1. 01规划迁移范围和目标语言
  2. 02使用 terraform-migrate 转换 Terraform 状态
  3. 03安装所需 Pulumi Provider
  4. 04使源代码与转换后的状态一致
  5. 05使用 Pulumi preview 验证变更

适用场景

  1. 01将由 Terraform 管理的基础设施迁移到 Pulumi 项目
  2. 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。

评论

支持 Markdown