SuperAPI AI 工具集

pulumi-terraform-to-pulumi

部署与运维

查看项目

更新于 10-13 20:09

技能介绍

用途

该技能面向从 Terraform/OpenTofu 迁移到 Pulumi 的场景,可用于翻译 HCL 源代码,或将 Terraform 状态导入 Pulumi 堆栈,或两者同时进行。

主要能力与约束

迁移开始前需与用户确认:Terraform 源码所在目录(${terraform_dir})、迁移后的 Pulumi 项目目录(${pulumi_dir})、目标 Pulumi 语言(如 TypeScript、Python、YAML)、迁移目标是建立 Pulumi 堆栈状态还是仅翻译源码。确认计划后方可继续。

关键限制:不要运行 pulumi convert,应使用 terraform-migrate 插件,因为它会保留状态映射;不要运行 pulumi package add terraform-module,该命令用于不同的工作流;不要在 /workspace 下创建 Pulumi 项目,应在已检出的仓库内创建。

使用方式

  1. 在 ${pulumi_dir} 用所选语言创建新的 Pulumi 项目,将源码编辑为空且不声明任何资源,并确保存在 Pulumi 堆栈。
  2. 继续之前必须先运行 pulumi_up 工具,以确保初始堆栈状态被写入。
  3. 若 ${terraform_dir} 中没有本地 .tfstate 文件,状态可能位于远程后端(S3、Pulumi Cloud、Terraform Cloud 等),需先拉取:

cd ${terraform_dir} && terraform state pull > terraform.tfstate

该方法适用于所有后端。若无 terraform,可尝试 tofu state pull。

  1. 生成状态转换草案:

pulumi plugin run terraform-migrate -- stack
--from ${terraform_dir}
--to ${pulumi_dir}
--out /tmp/pulumi-state.json
--plugins /tmp/required-providers.json

不要手动安装该插件,它会按需自动安装。

  1. 若 terraform-migrate 插件因 tofu refresh 未授权而失败,不要跳过此步骤。需与用户一起找到或构建提供所需凭证的 Pulumi ESC 环境,使命令能够成功。若无法设置 ESC 环境,则告知用户无法自动继续迁移。

  2. 读取生成的 /tmp/required-providers.json,将其中所有 Pulumi 提供者安装到新项目,并遵循建议版本,即使会降低已安装提供者的版本。文件内容形如 [{"name":"aws","version":"7.12.0"}]。应使用语言对应的包管理器安装为项目依赖(而非 pulumi plugin install,后者只下载插件而不添加依赖):

TypeScript/JavaScript:npm install @pulumi/aws@7.12.0 Python:pip install pulumi_aws==7.12.0 Go:go get github.com/pulumi/pulumi-aws/sdk/v7@v7.12.0 C#:dotnet add package Pulumi.Aws --version 7.12.0

  1. 将转换后的状态草案导入 Pulumi 堆栈:

pulumi stack import --file /tmp/pulumi-state.json

  1. 翻译源码,使其同时匹配 Terraform 源和转换后的状态,力求完全一致。可参考状态草案中的 Pulumi 资源类型和名称。

  2. 迭代修复源码,直到 pulumi_preview 工具确认无需更改且差异为空或几乎为空。提供者差异或标签差异可能可以接受。

  3. 可向用户提议将 ESC 环境关联到堆栈,使每个 Pulumi 堆栈都能无缝访问所需的提供者凭证。

  4. 一切就绪后,创建包含迁移后源代码的 Pull Request。

适用场景

适用于将既有 Terraform/OpenTofu 项目迁移至 Pulumi 的用户,尤其是希望保留状态映射、并在迁移后通过预览验证无差异的情况。

限制

迁移依赖 terraform-migrate 插件与 pulumi_up、pulumi_preview 工具;若 tofu refresh 未授权且无法建立 ESC 环境,迁移无法自动进行。使用前需明确路径、目标语言和迁移目标。以上流程与命令均来自资料,未提供的功能、价格或平台信息暂未提供。