pulumi-terraform-to-pulumi について
pulumi-terraform-to-pulumi は、Terraform のプロジェクトと状態を Pulumi へ移行するスキルです。計画、状態変換、Provider の設定、コード調整、プレビュー検証を経て、Pull Request の準備を支援します。
主な機能
- 01移行範囲と対象言語の計画
- 02terraform-migrate による Terraform 状態の変換
- 03必要な Pulumi Provider の導入
- 04変換後の状態に合わせたコード調整
- 05Pulumi preview による変更検証
活用シーン
- 01Terraform 管理のインフラを 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
プラグインは必要に応じて自動インストールされるため、インストールしないでください。
tofu refresh が許可されていないために、terraform-migrate プラグインが失敗することがあります。この手順を省略しないでください。コマンドを実行できるよう、必要な認証情報を提供する Pulumi ESC 環境をユーザーと一緒に探すか、作成してください。ESC 環境を設定できない場合は、移行を自動で進められないことをユーザーに伝えてください。
生成された /tmp/required-providers.json を読み取り、記載されているすべての Pulumi プロバイダーを新しいプロジェクトにインストールします。すでにインストールされているプロバイダーをダウングレードする場合でも、推奨バージョンを使用してください。このファイルには、[{"name":"aws","version":"7.12.0"}] のようなレコードが含まれます。
言語固有のパッケージマネージャーを使って、プロバイダーをプロジェクトの依存関係としてインストールします(プラグインをダウンロードするだけで依存関係に追加しない 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 のソースと変換後の状態の両方に合うようにソースコードを変換します。完全に一致させることを目指してください。使用する Pulumi のリソース型と名前は、状態のドラフト /tmp/pulumi-state.json を参照できます。
pulumi_preview ツールで変更がなく、差分が空またはほぼ空であることが確認されるまで、ソースコードを修正し続けます。プロバイダーの差分やタグの差分は許容される場合があります。
各 Pulumi スタックが必要なプロバイダー認証情報にシームレスにアクセスできるよう、スタックに ESC 環境をリンクすることをユーザーに提案します。
すべて問題がなければ、移行後のソースコードを含むプルリクエストを作成します。