ELB入門 ELBのスティッキーセッションを試してみる


ELBネタを少し追加でやってみます。
ELBのスティッキーセッションを有効にしてみましょう。

###0.スティッキーセッション
ELBはデフォルトでは配下のinstanceに均等に負荷分散するため、一定のinstanceにずっと繋ぎに行くといったことはできません。
しかし、Cookie情報を保持させ、一定のinstanceと通信を続けさせることができます。
スティッキーセッションを確立させる方法は2種類あります。

####- 時間ベースのセッション維持（ELBデフォルトのセッション維持機能）
####- アプリケーション制御によるセッション維持

今回はELBの標準機能を使った時間ベースのスティッキーセッションの設定方法を見ていきましょう。

###1.準備
ELBの準備をします。
ELBの設定方法は[AWS入門 ELB〜マネジメントコンソールとCLI〜[2015年10月版]](http://qiita.com/Yuki_BB3/items/7481292bd31f8516ae0f)を参考にしてください。

使用するWEBサーバは[AWS入門 EC2〜マネジメントコンソールとUserData〜[2015年10月版]](http://qiita.com/Yuki_BB3/items/367f050d5c5963c48e14)で作ったものを流用します。

ただし、その構成だとWEBサーバが１台しかないので複数台に増やしたいと思います。
また作っても良いのですが、面倒なので複製することにします。

![スクリーンショット_2015-10-12_0_01_12.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/829ae651-4fd2-43b7-e696-8b2f91d6ff07.jpeg "スクリーンショット_2015-10-12_0_01_12.jpg")
こんな感じで複製できます。
***現在起動しているインスタンスと異なったAZに配置するようにしましょう！耐障害性の考慮です。***
さて、ページもどっちに振られてるのかわかるようにしてみましょう。
現在は`http://<インスタンスのパブリックIP>/phpinfo.php`でPHPのサンプルが出るようになっていますが、HTMLページを作って設定します。

`/var/www/html`配下に現在`phpinfo.php`が配置してあると思うので以下のファイルに置き換えてください。

```html:index.html
<html>
    <head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        
        <title>ELBのステッキーセッションを試す</title>

        
    </head>
    <body>
        <p>
            instance-001
        </p>
    </body>
</html>
```
インスタンスを２台使うので＜body＞内の記述をどっちのインスタンスかわかるようにしておきましょう。
さて、設定が終わったら複製したインスタンスをELBに追加してみてください。
２台のインスタンスのヘルスチェックがOKならELBのエンドポイントにブラウザからつなぎに行ってください。
***何回かF5を押すと両方のインスタンスに通信が振り分けられていることがわかるかと思います。***

###2.スティッキーセッションの有効化
ELB設定画面を開きます

![スクリーンショット_2015-10-12_0_14_25.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/72c9b5dd-f9a2-9b59-910d-3d3d883e7e4b.jpeg "スクリーンショット_2015-10-12_0_14_25.jpg")
画面中央の「維持設定」を編集します
![スクリーンショット_2015-10-12_0_14_43.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/17f318db-2ccf-3d4d-bb81-99275f0be95c.jpeg "スクリーンショット_2015-10-12_0_14_43.jpg")
ロードバランサによってい生成されたCookieによる維持を有効化を選択し、有効期間を60秒に設定します。

![スクリーンショット_2015-10-12_0_15_04.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/0e9ae159-9eb7-96c2-7dd4-9e2f1440c6f3.jpeg "スクリーンショット_2015-10-12_0_15_04.jpg")
ポート構成のところで有効化されているのがわかるかと思います。
これで指定時間内に何回更新しても同じインスタンスにしか行けないと思います。
セッションの確立ができましたね！

###3.CLIでやってみる
ではこの操作をCLIでやってみましょう。

```bash:変数
ELB_NAME='my-sample-elb'
POLICY_NAME='my-duration-cookie-policy'
COOKIE_TIME=60
ELB_PORT=80
```

```bash:create-lb-cookie-stickiness-policy
aws elb create-lb-cookie-stickiness-policy --load-balancer-name ${ELB_NAME} --policy-name ${POLICY_NAME} --cookie-expiration-period ${COOKIE_TIME}
```


ロードバランサーが生成する Cookie の維持ポリシーを作成します。

```bash:set-load-balancer-policies-of-listener
aws elb set-load-balancer-policies-of-listener --load-balancer-name ${ELB_NAME} --load-balancer-port ${ELB_PORT} --policy-names ${POLICY_NAME}
```

ロードバランサーのセッション維持を有効にします。

---

以上でELBによるセッション維持の方法を終わります。
実際に使う際にはアプリケーションからセッションを設定する方が使うかとは思いますが、ELB単体の機能を使っても可能だということを見てい行きました。

---

###番外（クロスゾーン負荷分散）
SSの中にクロスゾーン負荷分散という項目があったと思います。
なんだかわかりますか？

ELBははデフォルトで複数のAZにまたいで作ると両方の中に存在するインスタンスの数は気にせず、トラフィックを2つのAZに均等に流します。
そう、両方のインスタンスの数が同じならいいのですが、数に偏りがあると均等に負荷分散されません。
その辺を考慮して、ゾーンをまたいで全インスタンスに均等にトラフィックを振り分けるってことをしてくれるのがこの機能です。[ロードバランサーのクロスゾーン負荷分散を設定する](https://docs.aws.amazon.com/ja_jp/ElasticLoadBalancing/latest/DeveloperGuide/enable-disable-crosszone-lb.html?console_help=true)


---

###参考
- [ロードバランサーのスティッキーセッションを設定する](http://docs.aws.amazon.com/ja_jp/ElasticLoadBalancing/latest/DeveloperGuide/elb-sticky-sessions.html)
- [ELBのスティッキーセッションについて調べてみた](http://dev.classmethod.jp/cloud/aws/elb-sticky-session/)
- [ロードバランサーのクロスゾーン負荷分散を設定する](https://docs.aws.amazon.com/ja_jp/ElasticLoadBalancing/latest/DeveloperGuide/enable-disable-crosszone-lb.html?console_help=true)