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に戻すだけで即座にロールバックが完了する
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
カナリアリリースと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 } ] }
ap-northeast-1a と ap-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
段階的なトラフィック移行の手順
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
現場で通用する安全な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 | +-------------------------------------+-------+
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で自動化し一定手順で確実に移行したい場合 |
よくあるエラーと対処法
「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> |
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、Amazon LinuxとAWSを実務レベルで学べる無料マニュアルをご用意しています。AWSの設計を現場で自在に扱えるエンジニアになるために、まずは無料マニュアルをお受け取りください。
>> 無料マニュアルを受け取る3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:AWS VPCのIPv6デュアルスタック設計入門|Egress-Only Internet GatewayとEC2のIPv6有効化手順
- この記事の属するカテゴリ:AWS(Amazon Linux)へ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます