以前紹介した記事「ELBの挙動確認(Disable Stikiness)」にて、Cookieによるセッション維持を無効にした場合のELBの挙動を試しました。
そこで今回は、ELBが生成したCookieを元に、セッション維持する方法を有効にして確認してみました。
(テスト環境とテスト方法は前述の記事に同じです)
まずは、二つのIPアドレスの一方に対して確認してみます。
# cat /etc/hosts xxx.xxx.xxx.xxx session-test.suz-lab.com #yyy.yyy.yyy.yyy session-test.suz-lab.com
普通にアクセスすると、前回同様に一方のAZのEC2に対して交互にアクセスされることがわかります。
# curl http://session-test.suz-lab.com/elb.php ELB_IPADDRESS : 10.0.1.194 COOKIE_AWSELB : COOKIE_SUZLAB : EC2_IPADDRESS : 10.0.1.135 X_FOWARDED_FOR: zzz.zzz.zzz.zzz # curl http://session-test.suz-lab.com/elb.php ELB_IPADDRESS : 10.0.1.194 COOKIE_AWSELB : COOKIE_SUZLAB : EC2_IPADDRESS : 10.0.1.193 X_FOWARDED_FOR: zzz.zzz.zzz.zzz
つまり、セッション維持が行われていないことがわかります。
それでは、ELBが生成したCookieを利用してアクセスしてみます。
まずはELBが生成したCookieを下記のように取得します。
# curl -c cookie.txt http://session-test.suz-lab.com/elb.php ELB_IPADDRESS : 10.0.1.194 COOKIE_AWSELB : COOKIE_SUZLAB : EC2_IPADDRESS : 10.0.1.135 X_FOWARDED_FOR: zzz.zzz.zzz.zzz
そうすると、下記のようなCookie(AWSELB)が生成されていることがわかります。
# cat cookie.txt session-test.suz-lab.com FALSE / FALSE 1350074674 SUZLAB TEST session-test.suz-lab.com FALSE / FALSE 1350071373 AWSELB 55FD...
このCookieに振り分け先のEC2の情報が書かれているようです。
そして、次のようにCookieを利用してアクセスしてみます。
# curl -b cookie.txt http://session-test.suz-lab.com/elb.php ELB_IPADDRESS : 10.0.1.194 COOKIE_AWSELB : 55FD... COOKIE_SUZLAB : TEST EC2_IPADDRESS : 10.0.1.135 X_FOWARDED_FOR: zzz.zzz.zzz.zzz # curl -b cookie.txt http://session-test.suz-lab.com/elb.php ELB_IPADDRESS : 10.0.1.194 COOKIE_AWSELB : 55FD... COOKIE_SUZLAB : TEST EC2_IPADDRESS : 10.0.1.135 X_FOWARDED_FOR: zzz.zzz.zzz.zzz
常に同じEC2(10.0.1.135)に振り分けられていることがわかります。
次に、ELBのもう一方のIPアドレスでも確認してみます。
# cat /etc/hosts #xxx.xxx.xxx.xxx session-test.suz-lab.com yyy.yyy.yyy.yyy session-test.suz-lab.com
先程と同じCookieでアクセスしてみます。
# curl -b cookie.txt http://session-test.suz-lab.com/elb.php ELB_IPADDRESS : 10.0.1.194 COOKIE_AWSELB : 55FD... COOKIE_SUZLAB : TEST EC2_IPADDRESS : 10.0.1.135 X_FOWARDED_FOR: zzz.zzz.zzz.zzz # curl -b cookie.txt http://session-test.suz-lab.com/elb.php ELB_IPADDRESS : 10.0.1.194 COOKIE_AWSELB : 55FD... COOKIE_SUZLAB : TEST EC2_IPADDRESS : 10.0.1.135 X_FOWARDED_FOR: zzz.zzz.zzz.zzz
やはり先程と同じEC2(10.0.1.135)に振り分けられていることがわかります。
また、今度はアクセスしているELB(10.0.1.194)も同様になっています。
尚、ELBが生成したCookieを元にセッション維持する方法は下記のように動作しています。
○期間ベースのセッション維持の有効化
(1)ロードバランサーがリクエストを受け取ると、まずこの Cookie がリクエスト内にあるかどうかを調べます。
(2)ある場合は、Cookie で指定されたアプリケーションインスタンスにリクエストが送信されます。
(3)Cookie がない場合、ロードバランサーは既存の負荷分散アルゴリズムに基いてアプリケーションインスタンスを選択します。
(4)同じユーザーからの以降のリクエストをそのアプリケーションインスタンスにバインドする為、応答に Cookie が挿入されます。
これらを図にすると下記のようになるかと思います。
実際にTelnetを使ってアクセスしてみると、Cookieがない場合はELBがHTTPレスポンスでCookieをセットするように振舞っていることがわかります。
# telnet session-test.suz-lab.com 80 Trying zzz.zzz.zzz.zzz... Connected to session-test.suz-lab.com. Escape character is '^]'. GET /elb.php HTTP/1.0 HTTP/1.1 200 OK Cache-control: no-cache="set-cookie" Content-Type: text/plain; charset=UTF-8 Date: Fri, 12 Oct 2012 20:31:53 GMT Server: Apache/2.2.15 (CentOS) Set-Cookie: SUZLAB=TEST; expires=Fri, 12-Oct-2012 21:31:53 GMT Set-Cookie: AWSELB=55FD...;PATH=/;MAX-AGE=300 X-Powered-By: PHP/5.3.17 Content-Length: 118 Connection: Close ELB_IPADDRESS : 10.0.1.194 COOKIE_AWSELB : COOKIE_SUZLAB : EC2_IPADDRESS : 10.0.1.135 X_FOWARDED_FOR: zzz.zzz.zzz.zzz Connection closed by foreign host.