Pulumi と Terraform の移行は 1 日で終わる - AI 時代の IaC ツール選定は可逆的な意思決定になった
Pulumi と Terraform のどちらを採用するか。インフラチームにとって、この選択は長らく「一度決めたら簡単には変えられない」重い意思決定でした。
数百のリソース定義、モジュール構成、状態ファイルの管理。移行には数週間から数ヶ月かかると見積もられ、「今のツールで我慢する」という判断が多くの現場で繰り返されてきました。
しかし、2026 年現在、この前提は崩れています。Claude Code、Codex、Cursor といった AI コーディングアシスタントを使えば、Pulumi から Terraform、Terraform から Pulumi への移行は 1 日で完了します。
なぜ IaC の移行は AI と相性が良いのか
IaC コードの移行が AI に向いている理由は明確です。
- 宣言的な構造の対応関係が明確: Terraform の
resourceブロックと Pulumi のリソースクラスは、ほぼ 1 対 1 で対応する - パターンが規則的: リソース定義は構造が統一されており、1 つのリソースの変換パターンを理解すれば残りに適用できる
- プロバイダの API が共通: どちらも AWS、GCP、Azure の同じ API を抽象化しているため、リソースの属性名やパラメータが類似している
- 型情報が豊富: Pulumi は TypeScript や Python の型システムを活用し、Terraform は HCL のスキーマを持つため、AI が構造を正確に理解できる
つまり、IaC コードの変換は「創造的な設計判断」ではなく「規則的な構造変換」であり、AI が最も得意とする領域です。
Terraform から Pulumi への移行
Terraform から Pulumi への移行は、Pulumi 公式が提供するツールと AI の組み合わせで効率的に進められます。
ステップ 1: 既存の状態をインポートする
Pulumi は Terraform の状態ファイルを直接インポートする機能を提供しています。
# Terraform の状態を Pulumi にインポート
pulumi import --from terraform ./terraform.tfstateこのコマンドで、既存のインフラリソースを Pulumi の状態管理に取り込めます。実インフラへの変更は発生しません。
ステップ 2: HCL を Pulumi コードに変換する
pulumi convert --from terraform コマンドで、HCL ファイルを Pulumi のコードに自動変換できます。
# HCL を TypeScript の Pulumi コードに変換
pulumi convert --from terraform --language typescriptただし、自動変換の出力はそのまま使えないケースがあります。複雑なモジュール構成、for_each や dynamic ブロック、カスタムプロバイダの設定などは手動調整が必要です。
ステップ 3: AI で残りを仕上げる
ここが AI の出番です。自動変換で対応しきれなかった部分を、AI コーディングアシスタントに変換させます。
infrastructure/terraform/ 配下の HCL コードを Pulumi の TypeScript コードに変換してください。
既存の変換済みコードのスタイルに合わせてください。AI は HCL の構造を正確に理解し、対応する Pulumi のリソースクラス、プロパティ名、型定義を生成します。数百行の HCL であっても、数分で変換が完了します。
ステップ 4: diff がないことを確認する
変換後は pulumi preview で実インフラとの差分がないことを確認します。
pulumi preview差分が出た場合は、プロパティの対応関係を修正します。この修正も AI に任せられます。
Pulumi から Terraform への移行
逆方向の移行は公式ツールが少ないぶん、AI の貢献度がさらに高くなります。
ステップ 1: 既存リソースを棚卸しする
まず、Pulumi の状態からリソース一覧をエクスポートします。
# Pulumi の状態をエクスポート
pulumi stack export > stack.jsonこの JSON から管理対象のリソース一覧を把握できます。
ステップ 2: AI でコードを変換する
Pulumi のコードを AI に渡し、Terraform の HCL に変換させます。
infrastructure/pulumi/ 配下の TypeScript コードを Terraform の HCL に変換してください。Pulumi の TypeScript コードは型情報が豊富なため、AI は各リソースのプロパティを正確に HCL のアトリビュートにマッピングできます。
ステップ 3: 状態をインポートする
変換した HCL に対して、既存リソースを Terraform の状態にインポートします。
# 各リソースを Terraform の状態にインポート
terraform import aws_s3_bucket.example my-bucket-name
terraform import aws_iam_role.app_role my-app-roleリソース数が多い場合は、import ブロックを使うと効率的です。
import {
to = aws_s3_bucket.example
id = "my-bucket-name"
}
import {
to = aws_iam_role.app_role
id = "my-app-role"
}このインポート定義の生成も AI に任せられます。Pulumi の状態エクスポート(stack.json)を渡せば、リソース ID とリソースタイプの対応を自動で生成してくれます。
ステップ 4: plan で差分がないことを確認する
terraform plan差分が出た場合のプロパティ修正も、Terraform の plan 出力を AI に渡せば修正案を得られます。
実際のタイムライン
実際に Pulumi から Terraform への移行を行った際のタイムラインです。VPC、RDS、ElastiCache、ECS、CloudFront など複数コンポーネントにまたがる環境を、Issue 起票から PR の Ready for Review まで約 5 時間で完了しました。
| フェーズ | 所要時間 | 内容 |
|---|---|---|
| 準備・棚卸し | 約 3 時間 | 既存リソースの整理、Terraform 定義の設計 |
| コード変換・import | 約 1.5 時間 | AI による変換 + terraform import で全コンポーネントの状態を移行 |
| 動作確認 | 約 0.5 時間 | CI ワークフローの実行テスト、差分ゼロの確認 |
| 合計 | 約 5 時間 | 半日で完了 |
ポイントは、terraform import 後に全コンポーネントで create / destroy がゼロであることを確認できた点です。タグの変更(ManagedBy: pulumi → terraform)程度の差分しか発生せず、実インフラへの影響なく移行が完了しました。
リソース数や構成の複雑さによって前後しますが、AI コーディングアシスタントを活用すれば 1 営業日以内に収まるケースがほとんどです。
移行コストが下がったことで変わる選定基準
移行が 1 日で終わるなら、IaC ツールの選定は「不可逆な意思決定」ではなく「可逆的な意思決定」になります。これは選定基準そのものを変えます。
従来の選定基準(移行コストが高い前提)
- 長期的にメンテナンスできるか
- コミュニティの規模は十分か
- 採用市場で経験者を確保できるか
- エコシステム(モジュール、プロバイダ)が成熟しているか
新しい選定基準(移行コストが低い前提)
- 今のチームに合っているか: TypeScript に強いチームなら Pulumi、HCL に慣れたチームなら Terraform
- 今のプロジェクトに合っているか: 複雑な条件分岐やループが必要なら汎用言語の Pulumi、シンプルな宣言が中心なら Terraform
- 今の課題を解決できるか: テスト容易性が課題なら Pulumi、既存モジュールの再利用が課題なら Terraform
「5 年後も使い続けられるか」より「今、最も生産性が高いか」で選べるようになります。合わなければ移行すればよいのです。
移行時の注意点
AI による移行が簡単とはいえ、注意すべき点はあります。
状態ファイルの取り扱い
移行中は Pulumi と Terraform の両方が同じインフラリソースを参照する状態が発生します。誤って両方からリソースを変更しないよう、移行中は片方を読み取り専用にしてください。
プロバイダバージョンの差異
Pulumi と Terraform では、同じクラウドプロバイダでもサポートされるリソースやプロパティのバージョンが異なる場合があります。移行前にプロバイダのバージョンを確認し、非対応のプロパティがないか確認してください。
シークレット管理
Pulumi は独自のシークレット管理を持ち、状態ファイル内のシークレットを暗号化します。Terraform に移行する場合は、シークレットの管理方法を HashiCorp Vault や AWS Secrets Manager などの外部ストアに移す検討が必要です。
AI に渡すコードのセキュリティ
IaC コードにはアカウント ID、VPC CIDR、内部ドメイン名などのインフラ情報が含まれます。AI コーディングアシスタントに渡す際は、エンタープライズプランでデータが学習に使用されない設定を確認してください。
まとめ
Pulumi と Terraform の移行は、AI コーディングアシスタントの活用により 1 日で完了する作業になりました。
- Terraform → Pulumi: 公式の
pulumi convert+ AI で変換、pulumi importで状態を移行 - Pulumi → Terraform: AI でコード変換、
terraform importで状態を移行 - 双方向とも: preview / plan で差分ゼロを確認して完了
IaC ツールの移行コストが劇的に下がったことで、ツール選定は「一生添い遂げる相手を選ぶ」判断から「今のチームとプロジェクトに最適なものを選ぶ」判断に変わりました。合わなければ 1 日で乗り換えればよい。その気軽さが、より良い技術選定を可能にします。
以上、IaC の移行を AI でガッとやった現場からお送りしました。