こんにちは!日々のインフラ運用やデプロイ作業、本当にお疲れ様です。
「新しいインフラ構成に変えたいけれど、デプロイの瞬間にサービスが数秒止まるのが怖い……」
「ロードバランサーの向き先を切り替えるときに、トラフィックがドロップしてエラーが出てしまう……」
そんなプレッシャーに押しつぶされそうになった経験、ありませんか?
今回は、次世代のインフラ構成管理(IaC)ツールである Pulumi を使って、本番環境のダウンタイムを完全にゼロにする「ブルーグリーンデプロイメント」の極意を、優しく、そして徹底的に深掘りして解説していきます。
これをマスターすれば、深夜の緊張感漂うメンテナンス作業から解放され、昼間からコーヒーを飲みながらボタン一つで安全にインフラを更新できるようになりますよ。一緒にその扉を開いてみましょう!
—
1. そもそも Pulumi と「ブルーグリーンデプロイメント」とは何か?
Pulumi とは?
従来のインフラコード(例えばTerraformなど)は独自の専用言語(HCL)を使っていましたが、Pulumiの最大の特徴は、TypeScript、Python、Go、C#といった使い慣れた一般のプログラミング言語でインフラを定義できる点にあります。
これにより、if文やforループ、関数といったプログラミングの強力な概念をそのままインフラ構築に持ち込めるため、複雑な構成管理が劇的に楽になります。
ブルーグリーンデプロイメントとは?
システムを「ブルー(現在稼働中の環境)」と「グリーン(これから切り替える新しい環境)」の2つ用意し、新しいバージョンをグリーン側で完全に構築・テストしてから、ロードバランサーの向き先を「ブルー」から「グリーン」が一瞬で切り替える手法です。
- メリット: 切り戻し(ロールバック)が極めて容易であり、デプロイ中のダウンタイムが理論上「ゼロ」になります。
- 従来の課題: 「インフラの差分管理」と「ロードバランサーの切り替え」を同期させるのが非常に面倒でした。しかし、Pulumiを使えばこれがコードベースで美しく自動化できます。
—
2. 環境構築と基礎セットアップ
まずは、手元のマシンでPulumiを使えるように準備をしましょう。ここでは一番人気の TypeScript をベースに進めていきます。
Step 1: ツールのインストール
お使いのOSに合わせてPulumi CLIをインストールします(MacならHomebrewが一番楽です)。
Homebrewを使ったインストール (macOS / Linux)
brew install pulumi
インストールできたら、バージョンを確認しておきましょう。
pulumi version
Step 2: プロジェクトの初期化
適当なディレクトリを作成し、Pulumiのプロジェクトを対話形式で初期化します。
mkdir pulumi-bg-demo && cd pulumi-bg-demo
pulumi new aws-typescript
途中でプロジェクト名やスタック名(環境名:`dev` や `prod` など)、AWSのリージョンを聞かれますので、適宜設定してください(AWSの認証情報は事前に `aws configure` 等で通しておいてくださいね)。
—
3. 【核心】Pulumiの「エイリアス(Aliases)」機能で実現する無停止移行
ブルーグリーンデプロイメントをコードで行う際の最大の壁は、「新しいリソースを作ってから古いリソースを消す」という順序の制御と、リソースIDの競合回避です。
ここで登場するのが、Pulumiの秘技 `aliases`(エイリアス) です。
これを使うと、「リソースの名前や構成が変わっても、それは置き換えではなく同じものの進化(または別環境からのスライド)ですよ」とPulumiに教えることができ、意図しないリソースの削除や置き換えミスを防げます。
それでは、実際に動くコードを見ていきましょう。今回はイメージしやすいように、AWSのECSまたはシンプルなEC2/コンテナ基盤を想定した構成を例にします。
実際のコード実装 (`index.ts`)
import as pulumi from “@pulumi/pulumi”;
import as aws from “@pulumi/aws”;
// 1. 現在のスタック設定から「アクティブなカラー (blue または green)」を読み込む
// デフォルトは “blue” とします
const config = new pulumi.Config();
const activeColor = config.get(“activeColor”) || “blue”;
// 2. 共通のVPCとセキュリティグループの取得(簡略化のためデフォルトを使用)
const defaultVpc = aws.ec2.getVpc({ default: true });
const defaultSubnets = defaultVpc.then(vpc => aws.ec2.getSubnetIds({ vpcId: vpc.id }));
// 3. ターゲットグループ(ブルー用とグリーン用の2つを常に定義する)
const blueTargetGroup = new aws.lb.TargetGroup(“app-tg-blue”, {
port: 80,
protocol: “HTTP”,
vpcId: defaultVpc.then(vpc => vpc.id),
targetType: “ip”,
});
const greenTargetGroup = new aws.lb.TargetGroup(“app-tg-green”, {
port: 80,
protocol: “HTTP”,
vpcId: defaultVpc.then(vpc => vpc.id),
targetType: “ip”,
});
// 4. ロードバランサーとリスナーの定義
const alb = new aws.lb.LoadBalancer(“app-alb”, {
subnets: defaultSubnets.then(subnets => subnets.ids),
});
// ★ここがキモ!アクティブなカラーに応じて、リスナーの転送先(TargetGroup)を動的に切り替える
const activeTargetGroupArn = activeColor === “blue” ? blueTargetGroup.arn : greenTargetGroup.arn;
const listener = new aws.lb.Listener(“app-listener”, {
loadBalancerArn: alb.arn,
port: 80,
defaultActions: [{
type: “forward”,
targetGroupArn: activeTargetGroupArn, // 現在アクティブな方に向ける
}],
});
// 5. デプロイ確認用のエクスポート
export const url = alb.dnsName;
export const currentActiveColor = activeColor;
—
4. デプロイと切り替えのオペレーション
このコードをデプロイし、ブルーからグリーンへ無停止で切り替える手順は以下の通りです。
1. 初期デプロイ(Blue環境の稼働)
まずはデフォルトの `blue` でインフラを構築します。
pulumi up
これで `blueTargetGroup` にトラフィックが流れる状態で環境が立ち上がります。
2. グリーン環境への切り替え(Greenデプロイ)
アプリケーションのコードやコンテナイメージを新しいバージョンに更新し、環境変数(あるいはPulumiのコンフィグ)でアクティブカラーを `green` に変更します。
pulumi config set activeColor green
そして、再度 `pulumi up` を実行します。
pulumi up
【ここで何が起きているか?】
Pulumiはコードの差分を検知し、リスナーの転送先(TargetGroup ARN)を `blue` から `green` へ一瞬で書き換えます。ロードバランサーのリスナー設定変更はアトミック(不可分)に行われるため、ユーザーのリクエストがドロップする隙(ダウンタイム)を完全に排除できます。
—
5. 失敗時のロールバック処理
もし新しいグリーン環境でエラーが多発していることに気づいたらどうすればいいでしょうか?
慌てる必要はありません。Pulumiなら、コマンド一つで即座に元に戻せます。
pulumi config set activeColor blue
pulumi up
これだけで、ロードバランサーの向き先は安全な `blue` に一瞬で戻ります。
さらに、Pulumiには過去の状態(ステート)を管理する強力なバックエンドがあるため、`pulumi stack history` や `pulumi cancel` を使って、デプロイ前の正確な状態へ完全にロールバックすることが可能です。
—
まとめ
今回は、Pulumiを用いたブルーグリーンデプロイメントの基本設計と実装について解説しました。
- プログラミング言語の力でインフラの動的な切り替えをスマートに記述できる。
- ロードバランサーのリスナー制御をコード化することで、デプロイ時のダウンタイムをゼロにする。
- コンフィグの変更と `pulumi up` だけというシンプルなオペレーションで、確実な切り替えとロールバックを実現できる。
インフラの変更に対する恐怖心が薄れ、「デプロイすることが日常の楽しい作業」に変わっていく感覚を、ぜひあなたのプロジェクトでも味わってみてください。
あなたのインフラ運用が、もっと優しく、もっとエキサイティングになりますように!