AWS入門 ELB〜マネジメントコンソールとCLI〜[2015年10月版]


しばらく軽いネタが続くので書くのが楽になるかなと期待しています。
実際どうなのかは知りませんが・・・

---

###0.ゴール
今回はAWSのロードバランサElastic Load Balancing（ELB）について見ていきます。
設定自体は非常に簡単ですが、ELBで何ができるのか、ELBがどのような挙動をするのかも含めて見ていこうかと思います。

まずは実際にやってみましょう。

--

###1.ELBの作成（マネジメントコンソール編）
![スクリーンショット_2015-10-11_12_30_55.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/a379429b-9a81-382e-a3f7-604eb182f046.jpeg "スクリーンショット_2015-10-11_12_30_55.jpg")
ELBの設定はEC2の中にあります。

![スクリーンショット_2015-10-11_12_31_17.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/7e2b6406-5f63-6919-e52e-0cf20395a6d4.jpeg "スクリーンショット_2015-10-11_12_31_17.jpg")

左側から「ロードバランサ」を選択
![スクリーンショット_2015-10-11_12_31_26.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/e349e18b-e6e0-cfe7-d130-751275ae43f7.jpeg "スクリーンショット_2015-10-11_12_31_26.jpg")


「ロードバランサ」の作成

![スクリーンショット_2015-10-11_12_31_32.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/33ef5e32-e068-dd44-7fc6-6b8614be8587.jpeg "スクリーンショット_2015-10-11_12_31_32.jpg")
***このロードバランサのプロトコルで「HTTPS」なんかを指定し、ELBに証明書(X.509)をアップロードすることで、使うことができます。***


![スクリーンショット_2015-10-11_12_35_37.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/53e27b16-e781-6b15-3c1b-88fa8dc39d6e.jpeg "スクリーンショット_2015-10-11_12_35_37.jpg")
ロードバランサを設置するサブネットを指定します。
耐障害性、観点から異なるAZに配置されたサブネットを指定する必要があります。
単一のAZにある複数のサブネットを指定するとあとに指定したほうで置換されます。

![スクリーンショット_2015-10-11_12_36_02.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/b5814f51-c994-f7c8-d455-ffaf86875d4d.jpeg "スクリーンショット_2015-10-11_12_36_02.jpg")
SGを割り当てます。
注意としてはHTTPやHTTPSなど使うプロトコルのポートが開いているSGをちゃんと割り当てましょう。
当然ですが通信が不通になります。

![スクリーンショット_2015-10-11_12_37_31.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/d4c5c6ae-e245-3a4e-85e7-cfa0fa87fcef.jpeg "スクリーンショット_2015-10-11_12_37_31.jpg")
####ヘルスチェック
ELBにはヘルスチェック機能（EC2への定期的な正常・異常のチェック）が備わっています。
>　ロードバランサーは、正常なインスタンスのみにトラフィックをルーティングします。インスタンスが異常であると判断した場合、ロードバランサーはそのインスタンスへのトラフィックのルーティングを中止します。

つまり、複数のWEBサーバにトラフィックを振り分けている際にどっかの1台がぶっ壊れた場合、その故障したWEBサーバにはトラフィックを流さなくなります。

ヘルスチェックの設定で設定するものは以下のとおりです。

|項目 | 説明| 
|:-----------|:------------|
|ping プロトコル|使用可能（TCP、HTTP、HTTPS、および SSL）|
|ping ポート|インスタンスに接続するために使用するポート(ポート範囲: 1 ～ 65535)|
|ping パス|HTTP または HTTPS リクエストの送信先。|
|応答タイムアウト|ヘルスチェックからの応答を受け取るまで待つ時間(有効な値: 2 ～ 60)|
|HealthCheck 間隔|個々のインスタンスのヘルスチェックの間隔(有効な値: 5 ～ 300)|
|非正常のしきい値|この回数失敗すると異常判定される(有効な値: 2 ～ 10)|
|正常のしきい値|この回数成功すると正常判定される(有効な値: 2 ～ 10)|

Pingパスでのチェックでは、ロードバランサーが応答タイムアウト時間内に "200 OK" 以外の応答を受信した場合、インスタンスは異常と見なされます。

![スクリーンショット_2015-10-11_12_37_47.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/1487df60-3297-fff5-d1b0-942e14d3b136.jpeg "スクリーンショット_2015-10-11_12_37_47.jpg")
ELBの傘下に配置するインスタンスを選択します

![スクリーンショット_2015-10-11_12_39_08.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/b784a0ed-200c-514a-3f44-edd902aa16cc.jpeg "スクリーンショット_2015-10-11_12_39_08.jpg")

![スクリーンショット_2015-10-11_12_39_12.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/89fd31d0-8e46-1b68-1bd9-33e3df9e7214.jpeg "スクリーンショット_2015-10-11_12_39_12.jpg")
サマリが表示されるので確認しましょう

![スクリーンショット_2015-10-11_12_39_19.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/cf12885e-f82e-5987-f811-dd9069e4cd6d.jpeg "スクリーンショット_2015-10-11_12_39_19.jpg")

![スクリーンショット_2015-10-11_12_39_36.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/15cbe614-b2c8-2235-8083-f24046439592.jpeg "スクリーンショット_2015-10-11_12_39_36.jpg")
DNS名に注目してください。
ELBにはEIPではなくDNSのAレコードが設定されています。
ELBは負荷に応じて自動で増減するため固定のIPを使ったアクセスができません。
この辺がオンプレとは大きな違いになりますかね。


![スクリーンショット_2015-10-11_12_54_00.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/b8362694-7bda-2961-6d37-42468d4a2e9b.jpeg "スクリーンショット_2015-10-11_12_54_00.jpg")

ヘルスチェックの間隔によって異なりますが、少し待つとステータスがInServiceになります。

---

###2.CLI
####ELBの作成
[CLIリファレンス](http://docs.aws.amazon.com/cli/latest/reference/elb/create-load-balancer.html)

```bash:変数
ELB_NAME='my-sample-elb'
ELB_PROTOCOL='HTTP'
ELB_PORT=80
INSTANCE_PROTOCOL='HTTP'
INSTANCE_PORT=80
AZ=("ap-northeast-1a""ap-northeast-1c")
SUBNET_ID=subnet-********
SG_ID=sg-********
INSTANCE_ID=i-********
```

```bash:create-load-balancer
aws elb create-load-balancer --load-balancer-name ${ELB_NAME} --listeners "Protocol=${ELB_PROTOCOL},LoadBalancerPort=${ELB_PORT},InstanceProtocol=${INSTANCE_PROTOCOL},InstancePort=${INSTANCE_PORT}" --subnets ${SUBNET_ID} --security-groups ${SG_ID}
```
```bash:register-instances
aws elb register-instances-with-load-balancer --load-balancer-name ${ELB_NAME} --instances ${INSTANCE_ID}
```

サブネットIDとセキュリティグループIDはマネジメントコンソールで調べて記載してください。
このようにして調べることもできます。

```bash:SubnetIdの取り方
SUBNET_ID=`aws ec2 describe-subnets | jq -r '.Subnets[].SubnetId'`
```
#####_デフォルトVPCのみの場合での取得です_
ちなみに、先日Macをクリーンインストールしたのでこれやるときに’jq’入ってなくて
ああ〜入れるかーと思い
`brew install jq` をやったらそんなサイトねぇよボケ！とか怒られて( ；´Д｀)ふぁっ！？
ってなりましたが普通に `brew update` したらインストールできました。


####ELBの削除

```bash:delete-load-balancer
aws elb delete-load-balancer --load-balancer-name ${ELB_NAME}
```

---

###3.おわり
以上でEC2をELBにぶら下げることができました。
どうだったでしょうか。
今回は片側のAZに1台のインスタンスしかない状態で試しましたが、数台のインスタンスをぶら下げて、その中の1台のApacheを落としたりするとチェックの間隔でちゃんとそのインスタンスへ振り分けをしないでくれます。
また、デフォルトのページの内容を1台づつ変えておくとF5を押した際にちょくちょく違うインスタンスにつなぎに行っていることもわかるかと思います。
今回は説明しませんが、「スティッキーセッション」を有効にするとこで特定のインスタンスとの通信を持続させることもできます。