【入門編】PulumiでマルチテナントSaaS基盤を構築する設計アンチパターンとベストプラクティス:Stack分割の限界と突破口 – インフラ構成管理(IaC)活用バイブル

こんにちは!インフラの世界へようこそ。今日は、これから最新のインフラ構成管理(IaC)ツールである「Pulumi」を学ぼうとしているあなたに向けて、実務の現場で本当に役立つ知識をお伝えしますね。

「TerraformでのJSON地獄やHclの記述に疲れた…」「もっと使い慣れたプログラミング言語でインフラを書きたい!」そんな悩みを抱えていませんか?Pulumiを使えば、TypeScript、Python、Goといった普段のプログラミング言語で、美しく、そして強力なインフラを構築できるようになります。

今回は、数千社もの企業が利用する「マルチテナントSaaS基盤」をテーマに、Pulumiの基本的なセットアップから、現場で即戦力となる知識まで、優しく丁寧にガイドしていきます。これをマスターすれば、毎日のインフラ作業が劇的に楽になりますよ!

—

1. Pulumiってなに?(ツールの役割とHclからの卒業)

従来のインフラ構築では、専用の独自言語(TerraformのHCLなど)を覚える必要がありました。「もしもここでループ処理ができたら…」「複雑な文字列操作ができたら…」そんな歯痒い思いをしたことはありませんか?

Pulumi(プルミ)は、本物のプログラミング言語(TypeScript, Python, C#, Goなど)を使ってインフラを定義・プロビジョニングできる次世代のIaCツールです。

最大のメリットは「慣れ親しんだ言語のパワーをそのまま使えること」です。

  • `map`や`filter`を使った洗練されたリソースの生成
  • ユニットテストやモックの簡単な導入
  • 既存のライブラリやエコシステムの活用

インフラを「コード」ではなく「ソフトウェア」として扱う。これがPulumiの本質であり、大規模なSaaS基盤を支える強力な武器になります。

—

2. 3分で完了!Pulumiのインストールと基礎セットアップ

それでは、実際に手を動かして環境を整えていきましょう。今回は最も汎用性が高く、エコシステムが充実している TypeScript を選択します。

ステップ1: ツールのインストール

まずはPulumi CLIをインストールします。MacならHomebrewが一番簡単です。

macOSの場合
brew install pulumi

Windows(PowerShell)やLinuxをお使いの場合は、公式のワンライナーコマンドを使用してください。

curl -fsSL https://get.pulumi.com | sh

インストールができたら、バージョンを確認してみましょう。

pulumi version

ステップ2: 認証とバックエンドの設定

Pulumiは、インフラの状態(State)を保存するバックエンドが必要です。チーム開発ではPulumi Service(SaaS)が最も便利ですが、個人の学習やローカル完結させたい場合は、ローカルのファイルシステムをバックエンドにすることも可能です。

ローカルファイルシステムを状態の保存先にする場合
pulumi login –local

ステップ3: プロジェクトの初期化(HelloWorld)

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

mkdir my-pulumi-saas
cd my-pulumi-saas
pulumi new aws-typescript

いくつか質問(プロジェクト名、説明、AWSのリージョンなど)を聞かれますので、基本的にはEnterキーでデフォルトのまま進めて構いません。

完了すると、ディレクトリ内に以下のようなファイルが生成されます。

  • `package.json`: 依存関係の定義
  • `tsconfig.json`: TypeScriptの設定
  • `index.ts`: ここにインフラを記述します!

—

3. 精度高い「HelloWorld」:SaaS基盤の第一歩

それでは、`index.ts`を開いて、AWS上にSaaSの各テナントを収容する基本となる「S3バケット」をプログラムとして定義してみましょう。

TypeScriptを使うことで、ただの静的な設定ファイルではなく、動的な処理が可能になります。

// index.ts
import as pulumi from “@pulumi/pulumi”;
import as aws from “@pulumi/aws”;

// 1. 設定値(Config)の取得
const config = new pulumi.Config();
const environment = config.require(“environment”); // 例: “dev”, “prod”

// 2. テナント共通のプレフィックスを生成するヘルパー関数
const createResourceName = (name: string) => `saas-${environment}-${name}`;

// 3. テナント用データ保存バケットの定義
// プログラミング言語の変数や関数がそのまま使えます!
const tenantStorageBucket = new aws.s3.Bucket(createResourceName(“tenant-storage”), {
bucket: createResourceName(“tenant-storage-data-bucket”),
acl: “private”,
tags: {
Environment: environment,
ManagedBy: “Pulumi”,
Purpose: “Multi-tenant SaaS Storage”,
},
});

// 4. エクスポート(デプロイ結果として出力される値)
export const bucketName = tenantStorageBucket.bucket;
export const bucketArn = tenantStorageBucket.arn;

デプロイしてみよう!

以下のコマンドを実行するだけで、PulumiがAWS上のリソースを計算し、安全にデプロイしてくれます。

pulumi up

画面に実行計画が表示され、「Yes」を選択するとデプロイが走ります。TypeScriptの強力な型補完やシンタックスチェックの恩恵を受けながらインフラが作られていく感覚は、一度味わうと病みつきになりますよ。

—

4. 【現場の知見】数千社を支えるマルチテナントSaaS基盤設計の極意

さて、ここからが本題です。
「テスト用の小さなS3バケットが作れた!めでたしめでたし」…とはいきません。実際の現場で数千社に及ぶテナント(顧客)をPulumiで管理しようとすると、必ず「スタック肥大化の壁」にぶつかります。

🚨 アンチパターン:1つのStackに全テナントのコードを書く

初心者がやりがちな最大の罠がこれです。すべてのテナント(Tenant A, Tenant B, Tenant C…)のリソースを1つのPulumi Stack(状態管理単位)に詰め込んでしまうこと。

  • 何が起きるか?
  • テナントが1,000社を超えたあたりで、`pulumi up` の実行時間が数時間に及びます。
  • 1社の設定を変更しただけで、他の関係ない999社のリソースの差分計算(Refresh)が走ります。
  • 万が一ステートファイルが破損したときの影響範囲が全社に及び、ビジネスとして致命傷になります。

✨ ベストプラクティス:テナント群の動的分割(Sharding)とプログラミングによる抽象化

数千社のテナントを管理するためには、「テナントをグループ(シャード)単位でStackに分割する」、または「データ駆動型の動的プロビジョニング」を採用する必要があります。

TypeScriptの配列や外部設定ファイル(JSON/YAMLやデータベース)からテナントのリストを読み込み、ループ処理でリソースを安全に生成する設計がベストです。

// 概念コード例:テナントリストを元に動的にリソースを生成する
interface TenantConfig {
tenantId: string;
tier: “standard” | “enterprise”;
}

// 外部から読み込んだと仮定するテナント群
const tenants: TenantConfig[] = [
{ tenantId: “tenant-001”, tier: “standard” },
{ tenantId: “tenant-002”, tier: “enterprise” },
// …数千社
];

// ループ処理で各テナントのリソースを綺麗に構築
tenants.forEach((tenant) => {
// Enterpriseプランなら専用の暗号化キーを紐付けるなど、条件分岐も自由自在
const isEnterprise = tenant.tier === “enterprise”;

new aws.s3.Bucket(`tenant-bucket-${tenant.tenantId}`, {
bucket: `saas-storage-${tenant.tenantId}`,
// プランに応じたタグや設定を動的に切り替える
tags: {
TenantId: tenant.tenantId,
Tier: tenant.tier,
Encrypted: isEnterprise ? “true” : “false”,
},
});
});

このように、プログラミング言語のループと条件分岐を活用することで、重複コードを排除しつつ、数千社のリソースを美しくかつ効率的に制御できるようになります。

—

おわりに

今回は、Pulumiの基本的なセットアップから、数千社を支えるマルチテナントSaaS基盤を見据えた実践的な設計思想までをご紹介しました。

Pulumiは単なる「コードでインフラを書くツール」ではありません。あなたの使い慣れた言語の知見をそのままインフラの世界に持ち込み、複雑なクラウドアーキテクチャをエレガントに自動化するための最高の相棒です。

これをマスターすれば、毎日のインフラ管理やスケールの恐怖から解放され、より本質的なプロダクト開発に集中できるようになりますよ。ぜひ、今日のハンズオンからあなたのPulumiライフをスタートさせてみてください!

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