ALBの加重ルーティングでカナリアリリースを設計する方法|ターゲットグループ重み付けでAWS本番環境のトラフィックを段階移行する実践パターン

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)AWS(Amazon Linux) > ALBの加重ルーティングでカナリアリリースを設計する方法|ターゲットグループ重み付けでAWS本番環境のトラフィックを段階移行する実践パターン
「本番サービスを止めずに新バージョンをリリースしたい。でも、いきなり全トラフィックを切り替えるのは怖い」——Linuxサーバーからクラウドに移行したエンジニアほど、こうした不安を抱えています。

AWS Application Load Balancer(ALB)には、複数のターゲットグループへのトラフィックを「重み(Weight)」で分配できる加重ルーティング機能があります。この機能を使えば、新バージョンに10%だけトラフィックを流し、問題がなければ50%、100%と段階的に移行するカナリアリリースをALBだけで実現できます。再デプロイ不要、変更は数十秒で反映されます。

この記事では、ALBの加重ルーティングを使ったカナリアリリースの設計パターンをAWS CLIの実行例を交えて解説します。段階的なトラフィック移行、ロールバック手順、マルチAZ環境での設計注意点まで実践的にカバーします。

この記事のポイント

・ALBの加重ルーティングはターゲットグループに0~999の重みを付けて実現する
・aws elbv2 modify-ruleで重みをリアルタイムに変更できるため再デプロイ不要
・マルチAZ環境ではCross-Zone Load Balancingの動作確認と各AZへの均等登録が重要
・問題発生時は重みを0/100に戻すだけで即座にロールバックが完了する


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

カナリアリリースとALB加重ルーティングの関係

カナリアリリースとは、新バージョンのアプリケーションに対して全体の一部だけトラフィックを流し、問題がないことを確認しながら段階的に本番切り替えを進めるデプロイ手法です。名前の由来は炭鉱で有毒ガスの検知に使われたカナリアです。新バージョンが「金鉱のカナリア」として少数のユーザーで安全性を確かめます。

ALBでカナリアリリースが実現できる理由は、リスナールールのアクション設定に ForwardConfig という仕組みがあるからです。通常の「forward先はこのターゲットグループ1つ」という設定に対し、ForwardConfigでは複数のターゲットグループに対して重み(0~999の整数)を付けて設定できます。

トラフィック分散の計算式は次の通りです。

・BlueのWeight=90、GreenのWeight=10 の場合 → Blue:90/(90+10)=90%、Green:10/(90+10)=10%
・BlueのWeight=0、GreenのWeight=100 の場合 → Blue:0%、Green:100%(完全移行)

この仕組みを使えば、CodeDeployやCI/CDパイプラインなしにALBのルール変更だけで段階的な移行が完結します。

事前準備——2つのターゲットグループを用意する

加重ルーティングには最低2つのターゲットグループが必要です。現行バージョンを「Blue」、新バージョンを「Green」として作成します。

1. Blue(現行バージョン)ターゲットグループを作成する

# create the Blue target group (current version) $ aws elbv2 create-target-group \ --name app-blue \ --protocol HTTP \ --port 8080 \ --vpc-id vpc-0a1b2c3d4e5f6a7b8 \ --health-check-path /health \ --health-check-interval-seconds 15 \ --healthy-threshold-count 2 \ --region ap-northeast-1 { "TargetGroups": [ { "TargetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/app-blue/1234567890abcdef", "TargetGroupName": "app-blue", "Protocol": "HTTP", "Port": 8080, "VpcId": "vpc-0a1b2c3d4e5f6a7b8", "HealthCheckProtocol": "HTTP", "HealthCheckPath": "/health", "HealthCheckIntervalSeconds": 15, "HealthyThresholdCount": 2 } ] }

作成後、現行バージョンのEC2インスタンスをBlueに登録します。マルチAZ設計のため、ap-northeast-1aap-northeast-1c の両方にインスタンスを用意してください。

# BlueターゲットグループにEC2インスタンスを登録する $ aws elbv2 register-targets \ --target-group-arn arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/app-blue/1234567890abcdef \ --targets Id=i-0a1b2c3d4e5f6a7b8 Id=i-0b2c3d4e5f6a7b8c9 \ --region ap-northeast-1

2. Green(新バージョン)ターゲットグループを作成する

同じ手順でGreenターゲットグループを作成し、新バージョンのインスタンスを登録します。

# GreenターゲットグループをAWS CLIで作成する $ aws elbv2 create-target-group \ --name app-green \ --protocol HTTP \ --port 8080 \ --vpc-id vpc-0a1b2c3d4e5f6a7b8 \ --health-check-path /health \ --health-check-interval-seconds 15 \ --healthy-threshold-count 2 \ --region ap-northeast-1 { "TargetGroups": [ { "TargetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/app-green/fedcba0987654321", "TargetGroupName": "app-green", "Protocol": "HTTP", "Port": 8080, "VpcId": "vpc-0a1b2c3d4e5f6a7b8", "HealthCheckProtocol": "HTTP", "HealthCheckPath": "/health", "HealthCheckIntervalSeconds": 15, "HealthyThresholdCount": 2 } ] }

リスナールールに加重ルーティングを設定する

1. 既存のリスナールールを確認する

まず、対象のALBリスナーARNとデフォルトルールのARNを確認します。

# ALBのリスナー一覧を確認する $ aws elbv2 describe-listeners \ --load-balancer-arn arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:loadbalancer/app/prod-alb/a1b2c3d4e5f6a7b8 \ --region ap-northeast-1 \ --query 'Listeners[*].[ListenerArn,Protocol,Port]' \ --output table ----------------------------------------------------------------------------------------------------------- | DescribeListeners | +---------------------------------------------------------------------------------------------+----------+-----+ | arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:listener/app/prod-alb/a1b2c.../a | HTTPS | 443 | +---------------------------------------------------------------------------------------------+----------+-----+

2. 加重ルーティングを有効化する(10%を新バージョンへ)

既存のデフォルトルールを修正して加重ルーティングを設定します。ここではまずGreenに10%だけ流します。

# デフォルトルールのARNを確認する $ aws elbv2 describe-rules \ --listener-arn arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:listener/app/prod-alb/a1b2c3d4e5f6a7b8/f0a1b2c3d4e5f6a7 \ --query 'Rules[?IsDefault==`true`].RuleArn' \ --output text \ --region ap-northeast-1 arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:listener-rule/app/prod-alb/a1b2c3d4e5f6a7b8/f0a1b2c3d4e5f6a7/1234abcd5678efgh # デフォルトルールに加重ルーティングを設定する(Blue:90、Green:10) $ aws elbv2 modify-rule \ --rule-arn arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:listener-rule/app/prod-alb/a1b2c3d4e5f6a7b8/f0a1b2c3d4e5f6a7/1234abcd5678efgh \ --actions '[ { "Type": "forward", "ForwardConfig": { "TargetGroups": [ { "TargetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/app-blue/1234567890abcdef", "Weight": 90 }, { "TargetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/app-green/fedcba0987654321", "Weight": 10 } ] } } ]' \ --region ap-northeast-1

コマンドが成功すると、即座にトラフィックの10%がGreenターゲットグループ(新バージョン)に流れ始めます。ALBの変更反映は通常30秒以内です。

段階的なトラフィック移行の手順

1. 10%から50%に引き上げる

CloudWatchのメトリクスやアプリケーションのエラーレートを確認し、Greenが正常に動作していれば50%に引き上げます。

# Blue:50、Green:50 に変更する $ aws elbv2 modify-rule \ --rule-arn arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:listener-rule/app/prod-alb/a1b2c3d4e5f6a7b8/f0a1b2c3d4e5f6a7/1234abcd5678efgh \ --actions '[ { "Type": "forward", "ForwardConfig": { "TargetGroups": [ { "TargetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/app-blue/1234567890abcdef", "Weight": 50 }, { "TargetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/app-green/fedcba0987654321", "Weight": 50 } ] } } ]' \ --region ap-northeast-1

2. 100%に完全移行する

すべての確認が取れたら、BlueのWeightを0にして完全移行します。Blueを残しておくとすぐにロールバックできるため、1~2日はGreenを100%にした状態で様子を見るのが現場での定石です。

# Blue:0、Green:100 で完全移行する $ aws elbv2 modify-rule \ --rule-arn arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:listener-rule/app/prod-alb/a1b2c3d4e5f6a7b8/f0a1b2c3d4e5f6a7/1234abcd5678efgh \ --actions '[ { "Type": "forward", "ForwardConfig": { "TargetGroups": [ { "TargetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/app-blue/1234567890abcdef", "Weight": 0 }, { "TargetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/app-green/fedcba0987654321", "Weight": 100 } ] } } ]' \ --region ap-northeast-1

3. 問題発生時のロールバック

Greenでエラーが検出されたらすぐに重みを逆転させます。変更から30秒以内にBlueへのフルトラフィックが回復します。

# 緊急ロールバック:Blue:100、Green:0 に戻す $ aws elbv2 modify-rule \ --rule-arn arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:listener-rule/app/prod-alb/a1b2c3d4e5f6a7b8/f0a1b2c3d4e5f6a7/1234abcd5678efgh \ --actions '[ { "Type": "forward", "ForwardConfig": { "TargetGroups": [ { "TargetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/app-blue/1234567890abcdef", "Weight": 100 }, { "TargetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/app-green/fedcba0987654321", "Weight": 0 } ] } } ]' \ --region ap-northeast-1

AWSのLinuxサーバー環境構築を体系的に学びたい方は、AWSでAmazon Linuxサーバーを構築する実践ガイドもあわせてご確認ください。カナリアリリースを含む高可用性設計の全体像については、AWSマスターセミナー上級編でハンズオン形式で解説しています。

現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、Amazon LinuxとAWSを実務レベルで学べる無料マニュアルをご用意しています。

>> 無料マニュアルを受け取る

マルチAZ環境での設計注意点

加重ルーティングをマルチAZ環境で使う際に見落としやすいポイントが3つあります。

1. Cross-Zone Load Balancing の確認
ALBはデフォルトでCross-Zone Load Balancingが有効になっています。これにより、AZ-Aに向いたリクエストであっても、重みに従ってAZ-BのインスタンスにもトラフィックLBされます。ALBでは追加料金なしで利用できるため、必ず有効のままにしておくことを推奨します。

確認コマンドは以下の通りです。

# ALBのCross-Zone Load Balancing設定を確認する $ aws elbv2 describe-load-balancer-attributes \ --load-balancer-arn arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:loadbalancer/app/prod-alb/a1b2c3d4e5f6a7b8 \ --query 'Attributes[?Key==`load_balancing.cross_zone.enabled`]' \ --output table \ --region ap-northeast-1 ----------------------------------- | DescribeLoadBalancerAttributes | +-------------------------------------+-------+ | Key | Value | +-------------------------------------+-------+ | load_balancing.cross_zone.enabled | true | +-------------------------------------+-------+

2. 各ターゲットグループへのAZ均等登録
BlueターゲットグループのインスタンスがAZ-Aだけ、GreenターゲットグループのインスタンスがAZ-Cだけという構成は避けてください。片方のAZで障害が起きたとき、そのターゲットグループがゼロになるためです。BlueもGreenも複数のAZにまたがってインスタンスを登録するのが原則です。

3. ヘルスチェック失敗時の挙動
Greenターゲットグループ内の一部インスタンスがヘルスチェックに失敗しても、重み10%分のトラフィックはGreenの残りの正常インスタンスに振り分けられます。全インスタンスが失敗した場合はALBがBlueだけに自動的にフォールバックします(Greenの重みが0でなくても)。このフェイルセーフは意図した動作ですが、「GreenはWeight=0にしていないのに流れない」という誤解の原因になりますので注意してください。

Blue/Greenデプロイ(CodeDeploy)との違いと使い分け

AWS CodeDeployもBlue/Greenデプロイをサポートしていますが、ALB加重ルーティングとは仕組みが異なります。
観点 ALB加重ルーティング CodeDeploy Blue/Green
トラフィック移行の粒度 1%単位で任意に設定可能 一定の割合を一括切り替え
変更の即時性 modify-rule後30秒以内に反映 デプロイ開始~終了まで数分
CI/CD連携 CLIを呼ぶシェルで手動実行も可 CodePipelineとの統合が前提
ロールバック速度 modify-rule 1コマンドで即時 ロールバック指示後数分
スティッキーセッション 新規セッションのみ分散される ターゲットグループ単位で切り替わる
向いているケース 手動でゆっくり確認しながら移行したい場合 CI/CDで自動化し一定手順で確実に移行したい場合
「本番でじっくり様子を見ながら段階移行したい」場合はALB加重ルーティングが向いており、「自動化パイプラインで毎回同じ手順を踏みたい」場合はCodeDeployが向いています。

よくあるエラーと対処法

「GreenのWeight=10にしたのにアクセスが増えない」
ブラウザキャッシュやDNSキャッシュではなく、スティッキーセッションが原因のことがほとんどです。既存のユーザーセッションはセッションIDに基づいて同じターゲットグループに固定されるため、新規セッションでのみ重みが効きます。10%の効果を確認するには、curlやpostman等で新規セッションを作ってテストしてください。

「Blue:0にしてもまだBlueへのトラフィックがある」
Weight=0はそのターゲットグループへの新規振り分けを停止するだけです。既にBlueのインスタンスにKeep-Aliveで接続中のリクエストは引き続き処理されます。Blue:0設定後、60秒程度待てば既存接続が切れてGreenのみになります。

「modify-ruleがエラーになる」
デフォルトルール(IsDefault: true)は modify-rule で変更できません。デフォルトルールを加重ルーティングにするには、まず set-rule-priorities で明示的に優先度付きのルールを作成し、そのルールに対して modify-rule を使ってください。

「ヘルスチェックが急に失敗する」
新バージョン(Green)のヘルスチェックパスを変えた場合、ターゲットグループの health-check-path もあわせて更新が必要です。Greenをデプロイする前にヘルスチェック設定を確認しておくことを推奨します。

本記事のまとめ

ALBの加重ルーティングを使ったカナリアリリースの設計ポイントをまとめます。
やりたいこと 操作・設定
加重ルーティングを初期設定する(10%カナリア) aws elbv2 modify-rule --actions '[{"Type":"forward","ForwardConfig":{"TargetGroups":[{"Weight":90,...},{"Weight":10,...}]}}]'
トラフィックを50%に引き上げる modify-ruleで同コマンドをWeight 50/50に変更して再実行
完全移行する BlueのWeightを0にしてGreenを100にする
緊急ロールバックする BlueのWeightを100にしてGreenを0にする
Cross-Zone Load Balancingを確認する aws elbv2 describe-load-balancer-attributes --query 'Attributes[?Key==`load_balancing.cross_zone.enabled`]'
現在の重み設定を確認する aws elbv2 describe-rules --listener-arn <リスナーARN>
ALBの加重ルーティングは「再デプロイ不要・即時反映・1コマンドでロールバック」という3つの特性から、本番サービスを止められない環境のカナリアリリースに特に向いています。CodeDeployやECS Deployment Circuitと組み合わせることでさらに自動化の幅が広がりますが、まずはこの記事のAWS CLIベースの手順を試し、動作を体感することをおすすめします。

現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、Amazon LinuxとAWSを実務レベルで学べる無料マニュアルをご用意しています。AWSの設計を現場で自在に扱えるエンジニアになるために、まずは無料マニュアルをお受け取りください。

>> 無料マニュアルを受け取る

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。