
はじめに
「つねにいまがピーク」
こんにちは、矢田です。
本記事では、Application Load Balancer(以下、ALB)で設定可能な2種類のスティッキーセッション(維持設定)である Target group stickiness と Sticky sessions について、その役割、仕組み、それぞれのユースケースをご紹介します。
用語解説
リスナー
ALBへのアクセスの受け口となるもので、受信したリクエストを設定されたルールに基づいて適切なターゲットグループに転送します。
ターゲットグループ
EC2インスタンスやコンテナなどリクエストを実際に処理するリソースをまとめたグループです。ALBのリスナーには複数のターゲットグループを紐付けることができ、またターゲットグループ内には、複数のターゲット(EC2インスタンスなど)を含めることができる
スティッキーセッション
スティッキーセッションとは、同一ユーザーからのリクエストを常に同じターゲット(Webサーバーなど)に転送する機能です。これにより、セッション情報をローカルに保持するアプリケーションでも、簡単な設定で負荷分散機能を実現することができます。
セッション
セッションとは、Webサイトにおいてユーザーの状態を管理するための仕組みです。Cookie(クッキー)をブラウザとWebサーバーで共有することで、ログイン状態の保持やECサイトのカート機能などを実現することができます。
Cookie(クッキー)
ユーザーを識別するための文字列が含まれた小さなテキストファイルのこと。ユーザがWebサイトに最初にアクセスしたタイミングで作成され、2回目以降のアクセスでは、Webサーバーがこのファイルを読み込みことで、Webサイト上でセッション管理を実現する
Target Group Stickiness とは
Target Group StickinessはALBのリスナーに設定する機能であり、1つのリスナーに複数のターゲットグループが紐付けられているとき、片方のターゲットグループにルーティング先を固定します。
以下の設定では、ユーザがWebサイトにアクセスしてから1時間、同じターゲットグループにルーティングされることになります。

Target Group Stickinessの仕組み
- Webサイトの初回リクエスト時に、ALB がCookie
AWSALBTG
を生成 - Cookie
AWSALBTG
がユーザの使用しているブラウザに保存される(値には識別子が設定される) - 2回目以降のリクエストで、ALBがCookie
AWSALBTG
を読み込み、同一のターゲットグループに転送する

ユースケース
カナリアリリースの実現
既存の本番環境のターゲットグループAと新バージョンをターゲットグループBを用意して、本番環境(重み90%)と新バージョン(重み10%)のように設定することで、段階的にリリースを行うことができます。この際に、ユーザが新旧のアプリケーションを行き来することがないように、Target Group Stickinessを有効にします。
A/Bテストの実施
異なるUIデザインやユーザー体験を持つアプリケーションバージョンを2つのターゲットグループに配置し、ユーザーの行動を比較分析することができます。Target Group Stickinessを有効にすることで、一貫したユーザ体験を提供して正確な分析を行うことができます。
Sticky sessions とは
Sticky sessionsは、ターゲットグループで設定する機能です。ターゲットグループに所属する特定のターゲット(EC2インスタンスなど)にセッションを固定する機能です。
以下の設定では、ユーザがWebサイトにアクセスしてから1時間(3600秒)固定のターゲットにルーティングされることになります。

Sticky sessionsの仕組み
- Webサイトの初回リクエスト時に、ALB がCookie
AWSALB
を生成 - Cookie
AWSALB
がユーザの使用しているブラウザに保存される(値には識別子が設定される) - 2回目以降のリクエストで、ALBがCookie
AWSALB
を読み込み、同一のターゲットグループに転送する

ユースケース
セッション情報をローカルメモリに保持するアプリケーション
Webサーバー内にセッション情報を保存するアプリケーションでは、同一ユーザーを特定のEC2インスタンスに固定する必要があります。ECサイトのカート機能やユーザーのログイン状態の保持などのを行うサービスでは、Sticky sessionsの有効化が必要になります。
注意点
セッション管理が不要ならスティッキーセッションは無効化する
セッション管理の必要のないアプリケーションでは、Target Group StickinessとSticky sessionsを無効にすることで最適な負荷分散を実現できます。不要なスティッキーセッションは特定のサーバーに負荷が集中する原因となるため、アプリケーションの特性に応じて適切に設定することが重要です。
セッション管理の必要なアプリケーションのカナリアリリースには両方の設定が必要
セッション情報をローカルメモリに保持するアプリケーションでカナリアリリースを実施する場合、Target Group StickinessとSticky sessionsの両方を有効化する必要があります。Sticky sessionsのみでは、異なるターゲットグループに振り分けられる可能性があり、セッション情報の不整合が発生する恐れがあります。(実際には両方の設定がされていないとエラーが発生するため、このパターンは回避することができます。)
まとめ
- Target Group Stickinessは振り分けるターゲットグループの維持を担う
- Sticky Sessions はターゲットグループ内のターゲットの維持を担う
- セッション管理の不要なアプリケーションでは、スティッキーセッションを有効化しない
Application Load Balancerのスティッキーセッションは、適切に設定することで、簡単にアプリケーションのセッション機能を維持しながら負荷分散を実現することができます。
それではまたお会いしましょう。