こんにちは!クラウドインフラ・SREの世界へようこそ。
日々、AWSやGCPのコンソールをポチポチしたり、複雑なJSON/YAMLの海に溺れていませんか?
「AWSのS3バケットに保存したデータを、GCPのBigQueryで分析したい」
「インフラをコード化(IaC)したいけど、AWSはTerraform、GCPは別のツール……なんてバラバラな管理はもう嫌だ!」
そんなあなたにこそ知ってほしいのが、次世代のIaCツール「Pulumi(プルミ)」です。
今回は、Pulumiを使ってAWSとGCPをひとつのプログラムで優しく、かつ強固に統合管理する実践アーキテクチャを一緒に見ていきましょう。これをマスターすれば、あなたのインフラ管理は劇的に楽になりますよ。
—
1. マルチクラウド運用の課題とPulumiの優位性
これまで、マルチクラウドをやろうとすると大きな壁にぶつかっていました。
- ツールのサイロ化: AWSにはCloudFormationやTerraform、GCPにはDeployment Manager……と覚えることが倍増する。
- 言語の壁: 独自のDSL(ドメイン特化言語:HCLなど)を覚える必要があり、複雑な条件分岐やループを書こうとすると発狂しそうになる。
ここでPulumiの登場です。Pulumiの最大の武器は、「TypeScript、Python、Go、C#といった、私たちが普段使う慣れ親しんだプログラミング言語でインフラを書ける」という点にあります。
[Pulumiプログラム(TypeScript等)]
│
├─> AWS API ──> S3, Lambda, etc.
└─> GCP API ──> GCS, BigQuery, etc.
同じプログラム内でAWSとGCPのモジュールを同時にインポートし、「AWSで作ったリソースの設定値を、そのままGCPのリソースに渡す」といった連携が、普通のプログラミング変数として直感的に行えるのです。これがどれほど強力か、次のコード例で体感してください。
—
2. 基礎セットアップと「HelloWorld」:AWS & GCP 同時プロビジョニング
まずは、環境構築から進めましょう。手元にNode.js(TypeScript環境)がある前提で進めます。
ステップ1: インストールとプロジェクト初期化
ターミナルを開き、PulumiのCLIをインストールしてプロジェクトを作ります。
Pulumi CLIのインストール(Macの場合)
brew install pulumi
作業用ディレクトリを作成
mkdir pulumi-multi-cloud && cd pulumi-multi-cloud
新規プロジェクトの作成(対話式で TypeScript を選択)
pulumi new typescript
途中でプロジェクト名やパスワード(秘密情報の暗号化用)を聞かれますが、デフォルトのままで進めて大丈夫です。
ステップ2: 必要なプロバイダーのインストール
AWSとGCPを操作するため、それぞれのPulumiパッケージをnpmでインストールします。
npm install @pulumi/aws @pulumi/gcp
ステップ3: 統合コードの実装 (`index.ts`)
それでは、「AWSのS3バケット」を作り、そのバケット通知を受け取るための「GCPのPub/Subトピック」を一つのファイルで同時に作成してみましょう。
`index.ts` を以下のように書き換えてください。
import as pulumi from “@pulumi/pulumi”;
import as aws from “@pulumi/aws”;
import as gcp from “@pulumi/gcp”;
// ==========================================
// 1. AWS リソースの定義 (S3バケット)
// ==========================================
const myBucket = new aws.s3.Bucket(“my-multicloud-bucket”, {
bucket: `my-unique-bucket-name-${pulumi.getStack()}`, // スタック名を含めて一意に
forceDestroy: true, // 練習用なのでスタック削除時に中身も消す
});
// ==========================================
// 2. GCP リソースの定義 (Pub/Subトピック)
// ==========================================
const myTopic = new gcp.pubsub.Topic(“my-multicloud-topic”, {
name: `multicloud-event-topic-${pulumi.getStack()}`,
});
// ==========================================
// 3. クラウドを跨いだリソースの連携出力
// ==========================================
// AWSのS3バケット名と、GCPのPub/Subトピック名をPulumiの出力としてエクスポート
export const awsBucketName = myBucket.id;
export const gcpTopicName = myTopic.name;
ステップ4: デプロイ!
実行には、事前に各クラウドの認証(AWSなら `aws configure`、GCPなら `gcloud auth application-default login`)を済ませておいてください。
pulumi up
画面に「これを作りますよ」というプレビューが表示されるので、`yes` を選ぶだけ。
たったこれだけで、AWSとGCPの両方にインフラが同時に構築されます。感動的ですよね!
—
3. 共通設定と環境ごとのパラメータ管理(Stackの活用)
実務では、「開発環境(dev)」「ステージング(stg)」「本番環境(prd)」といった複数の環境を綺麗に管理する必要があります。Pulumiには Stack(スタック) という強力な環境分離機能が標準備わっています。
設定ファイルによる環境パラメータの分離
Pulumiでは、環境ごとに `Pulumi.<スタック名>.yaml` という設定ファイルを自動生成できます。
例えば、開発環境用と本番環境用で、GCPのリージョンやAWSのインスタンスサイズを変えたい場合:
1. スタックの作成:
pulumi stack init dev
pulumi stack init prd
2. 設定値の保存(`Pulumi.dev.yaml` が作成される):
pulumi config set aws:region us-east-1
pulumi config set gcp:region us-central1
3. コード側からの呼び出し:
const config = new pulumi.Config();
const awsRegion = config.require(“aws:region”); // 設定値の取得
環境変数を無理やりシェルスクリプトで切り替える必要はもうありません。`pulumi stack select dev` と打つだけで、安全にターゲット環境を切り替えられます。
—
4. 障害に強いインフラ構成のコード設計(SREの極意)
最後に、現場で本当に役立つ「障害に強い」コード設計の勘所を伝授します。
① 密結合を避ける(Outputsの非同期解決を理解する)
マルチクラウド環境において最も恐ろしいのは、「片方のクラウドがダウンしたときに、もう片方のプロビジョニングが巻き込まれて全体がデプロイできなくなる」という事態です。
Pulumiのオブジェクトは非同期の `Output
// 例:AWSのS3作成完了を待ってから、その情報をGCP側のロギング設定に安全に渡す
const gcpLogSink = new gcp.logging.ProjectSink(“cross-cloud-sink”, {
destination: pulumi.interpolate`storage.googleapis.com/${myBucket.id}`, // 安全な文字列補間
filter: ‘resource.type = “gce_instance”‘,
});
`pulumi.interpolate` を使うことで、AWSの非同期なリソースIDが確定するのを待ってからGCP側のパラメータに組み込むことができます。この「非同期を意識させないエレガントな設計」こそがPulumiの真骨頂です。
② 冪等性(Idempotency)とステート管理
Pulumiは、インフラの現在の状態(State)をバックエンド(デフォルトではPulumi Cloud、またはS3/GCSバケット)で安全に管理します。
誰が何回 `pulumi up` を叩いても、コードと実際のインフラストラクチャの差分(Diff)だけを検知して安全に修復・維持してくれます。この「何度実行しても結果が同じになる」という安心感こそが、夜間呼出しに怯えないSREライフの基盤となるのです。
—
まとめ
いかがでしたでしょうか?
- マルチクラウドの壁をコードの力(TypeScriptなど使い慣れた言語)で軽々と超える
- Stack機能で、環境ごとのパラメータ管理をクリーンに保つ
- `Output` と `interpolate` を駆使して、クラウド間の安全なデータ連携を実現する
Pulumiを使いこなせるようになると、インフラ構築は「苦行」から「クリエイティブなプログラミング」へと変わります。
まずは手元のローカル環境で、今回の「HelloWorld」をぜひ試してみてください。あなたのクラウドライフが、今日から劇的に楽になりますように!