【入門編】PulumiでTerraformモジュールを直接読み込んで再利用する方法:tf2pulumiの限界を超えるPulumi Terraform Bridgeの高度な応用テクニック – インフラ構成管理(IaC)活用バイブル

こんにちは!インフラエンジニアの皆さん、日々のインフラ管理にお疲れ様です。

Terraformで長年築き上げてきたモジュール資産、山のようにありますよね。「これ、全部書き直すの…?」と絶望した経験はありませんか?あるいは、「Pulumiの強力なプログラミング言語による表現力(TypeScriptやPython、Goなど)を使いたいけれど、既存のTerraform資産を捨てられない」と悩んでいませんか?

かつては `tf2pulumi` というコード変換ツールがありましたが、あれは一度きりの変換であり、元モジュールがアップデートされたときの追従(ドリフト)地獄を生む諸悪の根源でした。

しかし、安心してください。Pulumi Terraform Bridgeを使えば、既存のTerraformモジュール資産を「そのまま」Pulumiの世界に召喚し、完全に型安全なネイティブコンポーネントとしてシームレスに再利用できるのです。

これをマスターすれば、移行期におけるTerraformとPulumiの並行運用なんて怖くありません。毎日のインフラ作業が劇的に楽になりますよ。さあ、一緒にその深淵を覗いてみましょう!

—

1. なぜ「tf2pulumiの限界」を超えてTerraformモジュールを再利用すべきなのか?

まず、私たちが直面する現実を確認しましょう。

  • `tf2pulumi` の限界:

コードを一度きりしか変換しないため、元となったTerraformモジュール(例えば社内の共通VPCモジュールなど)が改修されたとき、手動で再度変換するか、生成された汚いコードを直接メンテナンスする羽目になります。これは「DRY原則(Don’t Repeat Yourself)」の完全な破壊です。

  • Pulumi Terraform Bridgeの思想:

「Terraformエコシステムの膨大なアセット(数千のプロバイダやモジュール)を捨てずに、Pulumiの強靭なステート管理とプログラム制御言語の力で包み込む」。
つまり、コードを変換するのではなく、「動的にブリッジ(架け橋)して実行する」というアプローチです。

これにより、使い慣れたTerraformのHCLモジュールをラップし、TypeScriptやPythonから「まるで最初からPulumi製だったかのように」呼び出すことが可能になります。

—

2. 環境構築と基礎セットアップ

それでは、実際に手を動かしてその威力を体験していきましょう。今回は、最もモダンかつ型安全の恩恵を受けやすい TypeScript を用いて解説します。

前提条件

  • Node.js (v18以上推奨)
  • Pulumi CLI インストール済み
  • Terraform CLI インストール済み(モジュールのローカル検証やスキーマ解決に利用します)

プロジェクトの初期化

まずは適当なディレクトリを作成し、Pulumiプロジェクトを初期化します。

mkdir pulumi-tf-bridge-demo
cd pulumi-tf-bridge-demo
pulumi new aws-typescript –dir . –force –yes

これで、TypeScriptベースのPulumiプロジェクトの雛形が生成されました。

—

3. 既存のTerraformモジュールをPulumiから呼び出す実装手順

今回は分かりやすく、ローカルにあるシンプルな「AWS S3バケットを作成するTerraformモジュール」をPulumiから呼び出してみましょう。

Step 1: ラップ対象のTerraformモジュールを用意する

プロジェクト内に `modules/s3-bucket` ディレクトリを作成し、その中にTerraformのコードを配置します。

`modules/s3-bucket/main.tf`

variable “bucket_name” {
type = string
description = “作成するS3バケットの名称”
}

resource “aws_s3_bucket” “this” {
bucket = var.bucket_name
}

output “bucket_arn” {
value = aws_s3_bucket.this.arn
description = “作成されたバケットのARN”
}

Step 2: PulumiでTerraformモジュールを読み込む

Pulumiには、Terraformのモジュールやローカルリソースを直接扱うための `@pulumi/terraform` パッケージが用意されています。

インストールしましょう。

npm install @pulumi/terraform

次に、エントリポイントである `index.ts` を書き換えます。ここに、Terraformモジュールを呼び出すマジックを記述します。

`index.ts`

import as pulumi from “@pulumi/pulumi”;
import as terraform from “@pulumi/terraform”;

// 1. 既存のTerraformモジュールを呼び出すためのコンポーネントを作成
// ローカルパス(./modules/s3-bucket)を指定するだけで、Pulumiが自動でterraform init等を実行してくれます。
const s3Module = new terraform.module.Mod(“my-s3-module”, {
// ラップしたいTerraformモジュールのパス
source: “./modules/s3-bucket”,

// Terraformモジュールが必要とする入力変数(型安全に渡せます)
variables: {
bucket_name: `pulumi-tf-bridge-demo-${pulumi.getStack()}`,
},
});

// 2. Terraformモジュールからの出力(Outputs)をPulumi側で受け取る
// 型安全に次のリソースへ渡したり、エクスポートしたりできます。
export const bucketArn = s3Module.outputs[“bucket_arn”];

どうですか?これだけで、Terraformで書いたモジュールがPulumiの世界にシームレスにインポートされました。

—

4. 精度高い動作確認(HelloWorld)

それでは、実際にこのコードをデプロイしてみましょう。裏側でPulumiがTerraformのバイナリを隠蔽しつつ、きれいにステートを管理してくれる感動の瞬間です。

プレビューの実行(Terraformのplanに相当しますが、圧倒的にリッチな出力です)
pulumi preview

実行すると、Pulumiは裏側でTerraformのローカルプロバイダを起動し、モジュールの依存関係を解決した上で「何が作成されるか」を正確にプレビューしてくれます。

問題なければ、デプロイを実行します。

デプロイの実行(Terraformのapplyに相当)
pulumi up –yes

数秒後、見事にAWS上にS3バケットが作成され、出力値(`bucketArn`)がターミナルに表示されます。
後片付けも簡単です。

リソースの削除(Terraformのdestroyに相当)
pulumi destroy –yes

—

5. 移行期におけるハイブリッド運用のベストプラクティス

「全部一気にPulumiに書き換える」というのは、現場のエンジニアにとってリスクが高すぎます。だからこそ、このブリッジ手法が活きるのです。

現場で実践する際の3つの極意(ベストプラクティス)を授けましょう。

1. モジュールはTerraformのまま、オーケストレーションはPulumiに寄せる
チームのメンバーがHCL(Terraform)の記述に慣れているなら、モジュール自体を慌ててTypeScriptやPythonに書き直す必要はありません。モジュールはそのまま維持し、それらを組み合わせる上位のパイプラインや条件分岐(ループ、非同期処理など)をPulumiのプログラミング言語のパワーで制御するのです。
2. Stateの共有に惑わされない
Pulumiは独自のState Backendを持ちます。TerraformのStateとは完全に分離されるため、「TerraformのstateをPulumiにインポートし直す地獄の作業(`pulumi import` や state mv)」をしなくても、「Terraformモジュールをただのブラックボックス関数として呼び出す」形にすることで、徐々に移行を進められます。
3. CI/CDパイプラインの統一
Pulumiの実行にはTerraformのランタイム(環境変数や認証情報含む)が裏で必要になるため、CI/CD環境(GitHub ActionsやGitLab CIなど)には、両方のCLIを同居させておくとスムーズです。

—

おわりに

いかがでしたでしょうか?
「Terraformの資産を捨てなければいけない」という恐怖感から解放され、Pulumiのモダンな開発体験を手に入れるための強力な武器、それが Pulumi Terraform Bridge です。

これを使いこなせば、レガシーなインフラコードの遺産を活かしつつ、次世代のクラウドインフラ自動化へと一歩を踏み出すことができます。

あなたのインフラ管理が、明日からもっとエレガントで楽しいものになりますように。
それではまた、次回の深淵でお会いしましょう!

タイトルとURLをコピーしました