こんにちは。クラウドインフラの世界へようこそ。
今日は、多くのエンジニアが夢見ながらも、実装の複雑さに二の足を踏みがちな「ブルーカナリアデプロイ」を、Terraformを使って「美しく、かつ強固に」実現する方法を伝授しましょう。
単にサーバーを立てるだけなら誰でもできます。しかし、「本番環境でユーザーに影響を与えず、かつ最高速で変更を適用する」というエンジニアの聖杯(Holy Grail)に手を届かせるのが、真のSREの仕事です。
準備はいいですか? 深淵なるIaCの世界へ一緒に飛び込みましょう。
—
1. ブルーカナリアデプロイとは? なぜTerraformでやるのか
「ブルーグリーンデプロイ」は聞いたことがあるかもしれません。旧環境(ブルー)から新環境(グリーン)へ一気に切り替える手法です。しかし、大規模システムでこれをやると、新環境に潜んでいたバグが全ユーザーに直撃するリスクがあります。
そこで「カナリアデプロイ」です。新バージョンを一部のユーザーだけに開放し、様子を見ながら徐々に広げていく。この「一部」という不確実な要素を、Terraformの「コード」として確定させることで、再現性のあるリリース基盤が完成します。
Terraformを使う最大のメリット:
それは、トラフィック比率という「定性的な判断」を、Gitで管理できる「定量的な設定」へと昇華させられることです。
—
2. randomプロバイダとRoute53による「確率的交通整理」
今回の心臓部は、Terraformの `random` プロバイダです。これは「擬似乱数」を生成する魔法のツール。これとAWS Route53の「加重ルーティング(Weighted Routing)」を組み合わせます。
準備:Terraformの初期設定
まず、作業ディレクトリで `terraform init` を実行します。
provider.tf
terraform {
required_providers {
aws = { source = “hashicorp/aws”, version = “~> 5.0” }
random = { source = “hashicorp/random”, version = “~> 3.0” }
}
}
provider “aws” { region = “ap-northeast-1” }
—
3. 実装:トラフィック比率をコードで操る
ここが最も重要なパートです。`random_integer` を使い、カナリア環境へのルーティング重み(Weight)を定義します。
variables.tf
variable “canary_weight” {
description = “カナリア環境へ流すトラフィックの割合 (0-100)”
default = 10 # 最初は10%から
}
main.tf
ブルー環境(本番)の重み計算
locals {
blue_weight = 100 – var.canary_weight
green_weight = var.canary_weight
}
Route53 レコードの設定(加重ルーティング)
resource “aws_route53_record” “app_blue” {
zone_id = “YOUR_ZONE_ID”
name = “app.example.com”
type = “A”
weighted_routing_policy { weight = local.blue_weight }
set_identifier = “blue”
# ここにALBのDNS名などを指定
alias { … }
}
resource “aws_route53_record” “app_green” {
zone_id = “YOUR_ZONE_ID”
name = “app.example.com”
type = “A”
weighted_routing_policy { weight = local.green_weight }
set_identifier = “green”
alias { … }
}
ポイント:
このコードを修正して `terraform apply` するだけで、トラフィックは自動的に新環境へと「吸い込まれて」いきます。手動でコンソールをポチポチする時間はもう終わりです。
—
4. 段階的ロールアウトと「死の回避」戦略
デプロイにおいて最も恐ろしいのは、新環境を公開した瞬間にエラーが急増することです。ここでSREの知見を一つ。
「自動フォールバック」を設計に組み込むこと
Terraform単体では監視まではできませんが、「いつでも元の重みに戻せる状態」をコードで維持しておくことが、最大の防御になります。
- 10% → 25% → 50% → 100% と、リリース計画をプルリクエスト(PR)として作成してください。
- もしカナリア環境で5xxエラーが閾値を超えたら、直前のPRをRevert(ロールバック)する。
これだけで、あなたのデプロイ失敗率は劇的に下がります。Terraformは単なる構成ツールではなく、あなたのシステムの「安全保障」そのものなのです。
—
最後に:あなたへのアドバイス
最初は「なぜこんなに面倒なことを?」と思うかもしれません。しかし、インフラをコードで定義し、トラフィックを制御できるようになると、あなたは「サーバーを管理する人」から「システムの信頼性を設計するエンジニア」へと進化します。
まずは、このコードを自分のサンドボックス環境で動かしてみてください。`canary_weight` を変えて `apply` した瞬間、AWSのコンソールで重みが変わるのを見るのは、何度経験しても鳥肌が立つほどエキサイティングですよ。
さあ、次はあなたの番です。コードを書いて、世界を安定させましょう!