AWS
ALB

AWS ALBのスティッキーセッションについて調べてみた(再接続のたびにセッションの寿命は延びる)

ALBのスティッキーセッションを使うことになったのだが、設定を見るとセッション保持時間しか設定できない。
これだと、例えば24hで設定したとして、24h後のちょっと前にアプリにログインしても、stikky sessionのcookie切れで再ばランシングされて、ログインしていないインスタンスに接続したらログインセッションが切れてしまうことになる。
なんだかなーと思ってマニュアルを読み直すと以下の記述を見つけた。

ターゲットグループレベルでスティッキーセッションを有効にします。
ロードバランサー生成のクッキーの維持期間を秒単位で設定することもできます。
期間はリクエストごとに設定されます。
そのため、各期間の有効期限が切れる前にクライアントがリクエストを送信すると、スティッキセッションが継続されます。
複数のターゲットグループのスティッキーセッションを有効にした場合、すべてのターゲットグループに同じ継続時間を設定することをお勧めします。

若干曖昧だた有効期限内にリクエストを送信するとセッションが延長されるって意味かな?
ということで実際に検証してみることにした。

検証環境

検証環境は以下のとおりとした。
nginxの/stikky.txtにアクセスするとそれぞれnginx01nginx02と返すようにしてある。
スティッキーセッションの期間は3秒とした(実環境ではこんな未時間に設定するわけないけどw)

Client --- ALB --- Nginx01
                └- Nginx02

検証結果

まずは5秒間隔でポーリングしてみる。
コマンド結果をみるとおりNginx01, Nginx02に交互に接続している。
スティッキーセッションが3秒で切れてしまうから、5秒後にアクセスしたときは新規接続とみなされ再振り分け、coocke再発行されるためだ。

[root@localhost ~]# yes "date '+%d-%m %H:%M:%S'|tr '\n ' ' ' ; curl -c ./cookie_elb.txt -b ./cookie_elb.txt http://nginx-1428263045.us-west-2.elb.amazonaws.com/stikky.txt;sleep 5;" | sh
27-01 05:45:03 nginx02
27-01 05:45:08 nginx01
27-01 05:45:14 nginx01
27-01 05:45:20 nginx02
27-01 05:45:25 nginx02
27-01 05:45:31 nginx01
27-01 05:45:36 nginx01

次に1秒間隔でポーリングしてみる。
30秒以上試したが今度はずっとNginx02に接続している。
心配していたセッションの途中切れだが、5秒以上たってもセッションは維持されるようだ。
つまりセッション期間内に再接続すればstikky sessyonの時間も延長される、ということだろう。

[root@localhost ~]# yes "date '+%d-%m %H:%M:%S'|tr '\n ' ' ' ; curl -c ./cookie_elb.txt -b ./cookie_elb.txt http://nginx-1428263045.us-west-2.elb.amazonaws.com/stikky.txt;sleep 1;" | sh
27-01 06:03:12 nginx01
27-01 06:03:14 nginx01
27-01 06:03:15 nginx01
27-01 06:03:17 nginx01
27-01 06:03:18 nginx01
27-01 06:03:20 nginx01
27-01 06:03:21 nginx01
27-01 06:03:23 nginx01
27-01 06:03:24 nginx01
27-01 06:03:26 nginx01
27-01 06:03:27 nginx01
27-01 06:03:29 nginx01
27-01 06:03:30 nginx01
27-01 06:03:32 nginx01
27-01 06:03:33 nginx01
27-01 06:03:35 nginx01
27-01 06:03:36 nginx01
27-01 06:03:38 nginx01
27-01 06:03:39 nginx01
27-01 06:03:41 nginx01
27-01 06:03:42 nginx01
27-01 06:03:44 nginx01
27-01 06:03:45 nginx01
27-01 06:03:47 nginx01
27-01 06:03:48 nginx01
27-01 06:03:50 nginx01

で、スティッキーセッション期間はどれくらいに設定すべきか?

上記検証を踏まえると、バックグランドで頻繁に通信しているようなシステムならスティッキーもそのたびに更新され、ログアウトしない限り維持され続けると思われる。ユーザー操作がないと通信しないシステムの場合、無操作状態が続くとスティッキーセッションの有効期限を迎えてしまうから、システムのセッションタイムアウトと同じに設定するのが良いだろう。そうすれば、システムのセッションが切れて、再ログインが必要になるタイミングでスティッキーセッション有効期限が切れるのでユーザーが意図せず突然セッションが切れてしまう、という事態が防げる。