Pulumi と Terraform の移行は 1 日で終わる - AI 時代の IaC ツール選定は可逆的な意思決定になった

重岡 正 ·  Wed, March 4, 2026

PulumiTerraform のどちらを採用するか。インフラチームにとって、この選択は長らく「一度決めたら簡単には変えられない」重い意思決定でした。

数百のリソース定義、モジュール構成、状態ファイルの管理。移行には数週間から数ヶ月かかると見積もられ、「今のツールで我慢する」という判断が多くの現場で繰り返されてきました。

しかし、2026 年現在、この前提は崩れています。Claude CodeCodexCursor といった AI コーディングアシスタントを使えば、Pulumi から Terraform、Terraform から Pulumi への移行は 1 日で完了します。

なぜ IaC の移行は AI と相性が良いのか

IaC コードの移行が AI に向いている理由は明確です。

  1. 宣言的な構造の対応関係が明確: Terraform の resource ブロックと Pulumi のリソースクラスは、ほぼ 1 対 1 で対応する
  2. パターンが規則的: リソース定義は構造が統一されており、1 つのリソースの変換パターンを理解すれば残りに適用できる
  3. プロバイダの API が共通: どちらも AWS、GCP、Azure の同じ API を抽象化しているため、リソースの属性名やパラメータが類似している
  4. 型情報が豊富: 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_eachdynamic ブロック、カスタムプロバイダの設定などは手動調整が必要です。

ステップ 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 VaultAWS 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 でガッとやった現場からお送りしました。

参考情報