[アップデート] NLB でスティッキーセッションが使えるようになりました!

めずらしくサポートされているのはEU圏の3リージョンのみです
2020.02.28

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

まだアップデートリリースは流れておりませんが、NLB でスティッキーセッションが利用可能になったようです。

ソースは以下、公式のドキュメントヒストリーになります。

ただし、残念ながら執筆時点では東京リージョンでは未だ使えないようですね。対応リージョンは下記のとおりです。(いつもとはラインナップが違うので、EU 圏 で要望が強かったのでしょうか…?)

対応リージョン

  • パリ
  • アイルランド
  • ストックホルム

何がうれしいのか

通常、ロードバランサーを経由したリクエストはその都度、ターゲットのインスタンスに振り分けられるのですが、継続的なユーザーエクスペリエンスを提供するために State 情報をローカルに保持したいケースでは、同じクライアントからのリクエストは前回と同じインスタンスに振り分ける必要があります。そのようなときにスティッキーセッションが用いられます。(ALB の例ですが、スティッキーセッションについては以下のブログが参考になります)

これまで ALB/CLB ではスティッキーセッションが利用できましたが、NLB ではサポートされていませんでした。今回のアップデートによって、NLB でもスティッキーセッションが使えるようになったということですね。

従来の ELB(ALB/CLB) では、スティッキーの仕組みに cookie が用いられていましたが、NLB の場合は source_ip に従う仕組みとなっています。

考慮事項

公式ガイドに記載がありますが、スティッキーセッションを利用する場合、以下の点にご注意ください。

  • インスタンスの負荷が不均等になる可能性がある
    • 例えば NAT インスタンスを経由したリクエストの場合、すべて NAT インスタンスの IP アドレスがソース IP になります。この場合、NAT 経由のリクエストがひとつのインスタンスにルーティングされることになります。
  • ターゲットのヘルス状態が変更された、またはターゲットグループの追加、削除が行われた場合、NLB はスティッキーセッションをリセットする場合がある

やってみる

それでは早速やってみましょう

各AZにインスタンスを用意して、クロスゾーン負荷分散を有効にした NLB を配置しました。ターゲットグループのタイプは instance で作成してみました。

スティッキー無効状態

ターゲットグループの属性に以下のとおり Stickiness という項目が追加されています。

まずは無効状態で何度かリクエストしてみます。

1号機 access_log

119.xx.xx.xx - - [28/Feb/2020:11:19:42 +0000] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36"
119.xx.xx.xx - - [28/Feb/2020:11:19:55 +0000] "GET / HTTP/1.1" 200 83 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36"
119.xx.xx.xx - - [28/Feb/2020:11:19:55 +0000] "GET / HTTP/1.1" 200 83 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36"
119.xx.xx.xx - - [28/Feb/2020:11:19:56 +0000] "GET / HTTP/1.1" 200 83 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36"
119.xx.xx.xx - - [28/Feb/2020:11:19:56 +0000] "GET / HTTP/1.1" 200 83 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36"

2号機 access_log

119.xx.xx.xx - - [28/Feb/2020:11:19:52 +0000] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36"
119.xx.xx.xx - - [28/Feb/2020:11:19:53 +0000] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36"
119.xx.xx.xx - - [28/Feb/2020:11:19:55 +0000] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36"
119.xx.xx.xx - - [28/Feb/2020:11:19:55 +0000] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36"
119.xx.xx.xx - - [28/Feb/2020:11:19:56 +0000] "GET / HTTP/1.1" 200 83 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36"

適度に分散されているのが判りますね。

スティッキー有効状態

それでは以下のとおり有効化して試してみましょう。

1号機 access_log

119.xx.xx.xx - - [28/Feb/2020:11:26:06 +0000] "GET / HTTP/1.1" 200 83 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36"
119.xx.xx.xx - - [28/Feb/2020:11:26:07 +0000] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36"
119.xx.xx.xx - - [28/Feb/2020:11:26:08 +0000] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36"
119.xx.xx.xx - - [28/Feb/2020:11:26:08 +0000] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36"
119.xx.xx.xx - - [28/Feb/2020:11:26:09 +0000] "GET / HTTP/1.1" 200 83 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36"
119.xx.xx.xx - - [28/Feb/2020:11:26:09 +0000] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36"
119.xx.xx.xx - - [28/Feb/2020:11:26:09 +0000] "GET / HTTP/1.1" 200 83 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36"
119.xx.xx.xx - - [28/Feb/2020:11:26:09 +0000] "GET / HTTP/1.1" 200 83 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36"
119.xx.xx.xx - - [28/Feb/2020:11:26:10 +0000] "GET / HTTP/1.1" 200 83 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36"
119.xx.xx.xx - - [28/Feb/2020:11:26:10 +0000] "GET / HTTP/1.1" 200 83 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36"
119.xx.xx.xx - - [28/Feb/2020:11:26:10 +0000] "GET / HTTP/1.1" 200 83 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36"

2号機 access_log

(出力なし)

はい!想定したとおり1つのインスタンスにのみトラフィックが流れていることが確認できましたね!

ちなみにターゲットグループのタイプを ip にしても挙動は同じでした。

さいごに

NLB はスティッキーセッション使えないというのが広く知られていたかと思いますが、今回のアップデートで覆りましたね。

まだ EU 圏の 3 リージョンのみで東京リージョンでは使えない点、ご注意ください。なぜ EU 圏からスタートしたのか背景は気になりますね。やっぱり GDPR 対応の何かでしょうか。(こういうのを想像するのも楽しいですね!)

以上!大阪オフィスの丸毛(@marumo1981)でした!