こんにちは!SRE兼クラウドアーキテクトの私です。
インフラやネットワークの世界に一歩足を踏み入れたとき、目の前に広がる無数の用語や横文字の仕様書に、思わず「うっ……」と身構えてしまった経験はありませんか? 特にAWSなどのクラウドを触り始めると、ロードバランサーという言葉や、その中でもレイヤー7で動くALB(Application Load Balancer)の複雑な設定画面に圧倒されてしまいますよね。
でも、安心してください!難解に思えるクラウドの仕組みも、私たちが普段何気なく暮らしている現実世界のルールに置き換えてみると、驚くほどすんなりと頭に入ってくるものです。
今回は、ALBが誇る強力な武器である「ホスト・パスベースのルーティング」と「重み付け分散」について、郵便配達のストーリーを交えながら、一緒に楽しく紐解いていきましょう!
—
1. 郵便配達員に例えるALBの「お仕事」
まずは、ALBが現実世界でどんな役割を果たしているのかをイメージしてみましょう。
皆さんのもとに日々届く手紙や荷物を思い浮かべてみてください。大きな郵便局の本局(これがALBです)には、日本中、あるいは世界中から膨大な数の荷物が毎秒のように届きますよね。
郵便局のベテラン配達員さんは、一つひとつの荷物を見て、次のようにテキパキと仕分けをしていきます。
1. 宛先の住所(ホスト名)を見る: 「おや、この手紙の宛先は shop.example.com だな。それなら『ショッピングモール宛』のコンテナに放り込もう」
2. 中の詳細な行き先(パス)を見る: 「お、宛先は同じショッピングモールだけど、封筒の裏に『/images/』って書いてあるぞ。これは画像専用の倉庫へ直行させよう」
3. アルバイトとベテランへの振り分け(重み付け): 「このエリア宛の荷物は今とても混み合っているから、新人のアルバイト班に3割、熟練のベテラン班に7割の割合で荷物をパスしよう」
この仕分け作業を、インターネットの世界で超高速かつ自動で行ってくれるのが、AWSの ALB(Application Load Balancer) なんです。HTTP/HTTPSという「Webの言葉(レイヤー7)」を理解し、リクエストの宛先や中身をチラッと覗き見して、適切な宛先(ターゲットグループ)へ優しくエスコートしてくれます。
—
2. ホストベースとパスベースのルーティングをマスターする
それでは、ALBの頭脳であるルーティングの仕組みをもう少し具体的に見ていきましょう。一歩ずつ理解していけば全然難しくありませんよ!
ホストベースルーティングとは?
ホストベースルーティングとは、リクエストが飛んできたときの「ドメイン名(例: api.example.com や blog.example.com)」を見て、行き先をガラリと変える仕組みです。
例えば、ひとつの巨大なマンション(ALB)の入口に受付係が立っているとします。
- 「お隣の
blog.example.comに用事がある方ですね? それでは3階の『ブログ用サーバー群』へどうぞ」 - 「『api.example.com』宛のシステム開発の方ですね? それでは地下の『API用サーバー群』へお回りください」
このように、ドメインの看板(ホストヘッダー)をパッと見て、全く異なる部署へ案内するのがホストベースルーティングです。
パスベースルーティングとは?
一方のパスベースルーティングは、同じドメイン名であっても、URLの「/(スラッシュ)」以降のフォルダ名(パス)を見て案内係を変える仕組みです。
現実世界で言うなら、同じデパートの総合受付で、次のように案内されるイメージです。
https://example.com/videos/*→ 「動画配信用の強力なサーバーたちへご案内します!」https://example.com/images/*→ 「画像専用の保存庫(ストレージサーバー)へどうぞ!」
これらを組み合わせることで、「shop.example.com というお店の、/cart/(買い物かご)という特定の通路を通る人だけを、決済専用の超厳重なサーバーへ誘導する」といった、非常にきめ細やかな交通整理ができるようになります。
—
3. ターゲットグループ間の「重み付け分散」でスマートな移行
次に、もう一つの重要機能である「重み付け分散(Weighted Target Groups)」についてお話しします。
皆さんは、今動いているシステムを新しいバージョンにリプレイス(入れ替え)するとき、こんな不安を感じたことはありませんか?
「新しいサーバーがいきなり大量のアクセスに耐えられるかな……? 失敗したら怖いな……」
そんなときに大活躍するのが重み付け分散です。これは、郵便配達の割合をコントロールする機能に似ています。
- 古いサーバー(v1): 90% の重みを設定
- 新しいサーバー(v2): 10% の重みを設定
ALBは、新しくやってきた100件のリクエストのうち、90件を安定と信頼の旧サーバーへ、そして残り10件をぴかぴかの新サーバーへそっと流してくれます。新サーバーの様子(エラーが出ていないか、CPUが悲鳴を上げていないか)をハラハラしながら見守りつつ、問題なさそうなら新サーバーの重みを 20%、50%、そして最終的に 100% に引き上げていく……。
これが、現場のSREが夜も安心して眠れるようになる「カナリアリリース」や「段階的移行」の裏側にある仕組みなんです。
—
4. 実務で役立つ!設定のイメージとコード例
言葉だけだとフワッとしてしまうので、実際にインフラエンジニアがAWS環境(Terraformなど)でどのようにこの設定を行っているのか、雰囲気を覗いてみましょう。
以下は、ホストベースとパスベース、そして重み付けを組み合わせたルーティングルールの設定イメージです。
# AWS ALBのリスナールール(HTTPの80番ポートで待ち受ける設定)のイメージ
resource "aws_lb_listener_rule" "example_routing" {
listener_arn = aws_lb_listener.front_end.arn
priority = 10
# 1. ホストベースの条件: shop.example.com 宛てのリクエストか?
condition {
host_header {
values = ["shop.example.com"]
}
}
# 2. パスベースの条件: かつ、パスが /images/ から始まっているか?
condition {
path_pattern {
values = ["/images/*"]
}
}
# 3. 案内先の指定: 条件に一致した場合の振り分け先と「重み付け」
action {
type = "forward"
# 複数のターゲットグループへ重みを分けてリクエストを流す設定
target_group {
arn = aws_lb_target_group.image_servers_v1.arn
weight = 80 # 旧サーバーへ80%のトラフィックを流す
}
target_group {
arn = aws_lb_target_group.image_servers_v2.arn
weight = 20 # 新サーバーへ20%のトラフィックを流す(カナリア検証中!)
}
}
}
コードの中に日本語でコメントを添えてみましたが、どうでしょう?
「shop.example.com に来て、かつ /images/* を通る人たちを、古いサーバーに8割、新しいサーバーに2割の割合で案内する」という私たちのやりたいことが、そのまま綺麗に表現されているのが分かりますよね。
—
5. まとめ
今回は、ALBの高度なルーティング(ホスト・パスベース)と、ターゲットグループ間の重み付け分散について、郵便配達のストーリーを交えて解説しました。
- ホストベースルーティング: ドメイン名(看板)を見て、行き先の部署を大きく分ける
- パスベースルーティング: URLのパス(通路)を見て、さらに細かい部屋へ案内する
- 重み付け分散: 新旧サーバーの切り替えなどを安全に行うために、トラフィックの割合を自由に調整する
クラウドのネットワークやロードバランサーは、最初は少し冷たくて複雑な機械に見えるかもしれませんが、その中身を紐解いていくと、人間社会の「思いやり」や「合理的な工夫」がギュッと詰まった温かい仕組みで作られていることが分かります。
日々のインフラ運用の現場で、今回の知識が皆さんの「あ、そういうことか!」というひらめきや、トラブルシューティングの糸口になれば、これほど嬉しいことはありません。
それではまた、次の技術の深掘りでお会いしましょう!一歩ずつ、一緒にエンジニアリングを楽しんでいきましょうね。
コメント