以前紹介した記事「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.

こちらの記事はなかの人(suz-lab)監修のもと掲載しています。
元記事は、こちら