AWS勉強会(4) / ELB + AutoScalingグループでwebサーバ

- [AWS勉強会(1) / 踏み台サーバとネットワークの作成](https://qiita.com/zaki-lknr/items/4586cc2f992908068bd2)
- [AWS勉強会(2) / ELB + プライベートサブネットのwebサーバ](https://qiita.com/zaki-lknr/items/46015aa47fd1e7319e6a)
- [AWS勉強会(3) / Auto Scalingチュートリアル](https://qiita.com/zaki-lknr/items/cea4885f04853d3f8878)
    - [AWS勉強会(補足1) / ユーザーデータでEC2作成時の初期設定を行う](https://qiita.com/zaki-lknr/items/197ea366bd4243b78e69)


以上を踏まえ、AutoScalingグループ設定を行ったwebサーバをELBでロードバランスする構成を作成する。

これまでは「EC2を作成後、手動でwebサーバの設定やコンテンツの配置」をしていたが、AutoScalingによる起動・終了の自動化を行うため、起動設定とユーザーデータへの設定でEC2起動の時点で必要なパッケージインストールや各設定が済んでいる状態にする。

webコンテンツは、とりあえずphpもインストールして`phpinfo()`で…(IPアドレス表示が確認にも便利なので)

ここでの完成イメージ

![bastion+web(ASG)+ELB (1).png](https://qiita-image-store.s3.amazonaws.com/0/256859/7c1493f8-c63d-c49c-e3a6-b60dcd220815.png)


# 起動設定

作成するec2のwebサーバをAutoScalingグループに加えるため、[起動設定]を作成する。

## 高度な詳細

cloud-initを使って以下の設定をEC2起動時に行うよう設定する。

- タイムゾーン設定
- パッケージインストール
    - httpd
    - php
- ドキュメントルートに`phpinfo()`を表示するphpコンテンツ作成
- httpdプロセスの起動

詳細は [AWS勉強会(補足1) / ユーザーデータでEC2作成時の初期設定を行う](https://qiita.com/zaki-lknr/items/197ea366bd4243b78e69) を参照。

```
#cloud-config

timezone: "Asia/Tokyo"

packages:
 - httpd
 - php

runcmd:
 - echo "<?php phpinfo(); ?>" > /var/www/html/index.php
 - /etc/init.d/httpd restart
```

パブリックIPアドレスはELB経由でのアクセスとなるので不要 （[AWS勉強会(2) / ELB + プライベートサブネットのwebサーバ](https://qiita.com/zaki-lknr/items/46015aa47fd1e7319e6a)参照）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/d25053cc-e3fa-4441-9620-59029f98ce06.png)


## セキュリティグループの設定

![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/14cdad31-fc8e-0b25-b5c9-4b01a921359f.png)

次は、AutoScalingグループではなくロードバランサの作成を行う。
(AutoScalingグループの作成中に、作成済みロードバランサの設定があるため)

# ロードバランサの作成

作成の流れは[AWS勉強会(2) / ELB + プライベートサブネットのwebサーバ](https://qiita.com/zaki-lknr/items/46015aa47fd1e7319e6a#elb%E3%81%AE%E4%BD%9C%E6%88%90)の「ELBの作成」の手順通り。

ただし、まだEC2が稼働していない(起動設定を作成しただけ)なので、「ステップ5: ターゲットの登録」は何も設定しない。(AutoScalingグループの作成の中で行う)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/9ec8a611-2acd-150f-4fc2-148f240f7dbf.png)

# Auto Scalingグループの作成

![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/cfb36cfa-6ccc-16f9-f511-562f05ef0f94.png)

## 詳細設定

VPCとサブネットを選択

![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/dfc85f15-e001-8a8b-45ff-30b66079e067.png)

高度な詳細では「ロードバランシング」を有効にし、ターゲットグループに、ELBの作成で登録したターゲットグループを指定する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/6181c241-6b18-faa6-4595-cec82639df5f.png)

スケーリングポリシー、通知についてはひとまず未入力。

## タグの設定

「AutoScalingで自動で起動したEC2であること」がわかるようにしておけばひとまずOK

![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/805d3f96-f81d-800a-4272-ad9eedaddc54.png)

この設定でAutoScalingグループを作成すると、登録した定義に従ってEC2が1個作成される

![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/8b519594-2eab-76d9-d933-7e9090e9fa5a.png)


# EC2の確認

起動したらsshで(踏み台サーバ経由で)アクセスして確認してみる

```
zaki@wensley% ssh -o ProxyCommand='ssh -i ~/.ssh/aws-practice.pem ec2-user@*.*.*.* -W 172.26.20.100:22' -i ~/.ssh/aws-practice.pem ec2-user@172.26.20.100
The authenticity of host '172.26.20.100 (<no hostip for proxy command>)' can't be established.
ECDSA key fingerprint is SHA256:eo5sF26m3RsVFNI2rkPJcSDEB2lUYJWF5Nx7B2/IjRQ.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.26.20.100' (ECDSA) to the list of known hosts.

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2018.03-release-notes/
8 package(s) needed for security, out of 14 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-172-26-20-100 ~]$ 
[ec2-user@ip-172-26-20-100 ~]$ 
[ec2-user@ip-172-26-20-100 ~]$ 
[ec2-user@ip-172-26-20-100 ~]$ rpm -qa | grep httpd
httpd-2.2.34-1.16.amzn1.x86_64
httpd-tools-2.2.34-1.16.amzn1.x86_64
[ec2-user@ip-172-26-20-100 ~]$ rpm -qa | grep php
php-cli-5.3.29-1.8.amzn1.x86_64
php-5.3.29-1.8.amzn1.x86_64
php-common-5.3.29-1.8.amzn1.x86_64
[ec2-user@ip-172-26-20-100 ~]$ ps aux | grep http
root      2704  0.0  1.6 281004 17136 ?        Ss   14:47   0:00 /usr/sbin/httpd
apache    2706  0.0  1.3 281756 13844 ?        S    14:47   0:00 /usr/sbin/httpd
apache    2707  0.0  1.3 281756 13844 ?        S    14:47   0:00 /usr/sbin/httpd
apache    2708  0.0  1.3 281756 13860 ?        S    14:47   0:00 /usr/sbin/httpd
apache    2710  0.0  1.3 281136 13836 ?        S    14:47   0:00 /usr/sbin/httpd
apache    2711  0.0  1.3 281756 13844 ?        S    14:47   0:00 /usr/sbin/httpd
apache    2712  0.0  1.3 281136 13836 ?        S    14:47   0:00 /usr/sbin/httpd
apache    2713  0.0  1.3 281136 13836 ?        S    14:47   0:00 /usr/sbin/httpd
apache    2714  0.0  1.3 281136 13836 ?        S    14:47   0:00 /usr/sbin/httpd
ec2-user  2790  0.0  0.2 110512  2148 pts/0    S+   14:50   0:00 grep --color=auto http
[ec2-user@ip-172-26-20-100 ~]$ 
```

# ELBのアドレスにhttpアクセス

EC2上で`tail -f /var/log/httpd/access_log `しながら、ブラウザでアクセス

![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/f8a2a5eb-13e7-9d88-4089-9dffd1d4329c.png)

1個しかEC2を稼働させてないのでいわゆる片肺運用中だが、動作している。
`phpinfo()`で表示されるIPアドレスも、そのEC2のプライベートIPのものと一致している。

この時点での構成図

![bastion+web(ASG)+ELB.png](https://qiita-image-store.s3.amazonaws.com/0/256859/13638cb5-4023-d81d-f720-f34b658ae404.png)



# インスタンス数を2個に増やす

Auto Scalingグループの設定でインスタンス数を2に変更する(最大値が1の場合は、そこも2に変更する)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/d95a0ca7-4fca-6723-093b-a00270f4f7a4.png)

Auto Scalingグループの設定でAZを複数設定していたので、起動したEC2は1つ目と異なるAZに割り振られる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/910bea2f-6b94-6e91-7db6-e31c2141938d.png)


ちなみに、ELBでロードバランスしている各EC2の状態は、設定しているターゲットグループの「ターゲット」からステータスを確認できる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/ea318721-0a5d-4da1-d110-c89127a7d4ea.png)

ここが`initial`から`healthy`に遷移すればOK

![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/53b90670-56ea-8446-8a93-4742b2937c5c.png)

EC2が起動したら、webアクセスで何度かリロードしてみると、起動している複数のEC2のwebサーバへアクセスが振り分けられているのが確認できる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/a382c69f-94bf-0ff3-60a8-defa93aec5d6.png)

この時点でこういう構成になっている。

![bastion+web(ASG)+ELB (1).png](https://qiita-image-store.s3.amazonaws.com/0/256859/7c1493f8-c63d-c49c-e3a6-b60dcd220815.png)

あとは、AutoScalingグループの設定で起動するインスタンスを増減させることで、負荷分散するwebサーバの数を簡単に変更することができる。


# EC2の停止・削除

AutoScalingグループでインスタンス数を0い設定すればOK。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/0b98ba8e-9b31-9246-de84-fcb36686ad98.png)

ELBとの切断に少し時間がかかるが、しばらく待てば通常のEC2の削除と同様に停止・削除される。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/2515d40f-92e1-8e66-486a-ec060134cdb6.png)