以上を踏まえ、AutoScalingグループ設定を行ったwebサーバをELBでロードバランスする構成を作成する。
これまでは「EC2を作成後、手動でwebサーバの設定やコンテンツの配置」をしていたが、AutoScalingによる起動・終了の自動化を行うため、起動設定とユーザーデータへの設定でEC2起動の時点で必要なパッケージインストールや各設定が済んでいる状態にする。
webコンテンツは、とりあえずphpもインストールしてphpinfo()
で…(IPアドレス表示が確認にも便利なので)
ここでの完成イメージ
起動設定
作成するec2のwebサーバをAutoScalingグループに加えるため、[起動設定]を作成する。
高度な詳細
cloud-initを使って以下の設定をEC2起動時に行うよう設定する。
- タイムゾーン設定
- パッケージインストール
- httpd
- php
- ドキュメントルートに
phpinfo()
を表示するphpコンテンツ作成 - httpdプロセスの起動
詳細は AWS勉強会(補足1) / ユーザーデータでEC2作成時の初期設定を行う を参照。
# 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サーバ参照)
セキュリティグループの設定
次は、AutoScalingグループではなくロードバランサの作成を行う。
(AutoScalingグループの作成中に、作成済みロードバランサの設定があるため)
ロードバランサの作成
作成の流れはAWS勉強会(2) / ELB + プライベートサブネットのwebサーバの「ELBの作成」の手順通り。
ただし、まだEC2が稼働していない(起動設定を作成しただけ)なので、「ステップ5: ターゲットの登録」は何も設定しない。(AutoScalingグループの作成の中で行う)
Auto Scalingグループの作成
詳細設定
VPCとサブネットを選択
高度な詳細では「ロードバランシング」を有効にし、ターゲットグループに、ELBの作成で登録したターゲットグループを指定する。
スケーリングポリシー、通知についてはひとまず未入力。
タグの設定
「AutoScalingで自動で起動したEC2であること」がわかるようにしておけばひとまずOK
この設定でAutoScalingグループを作成すると、登録した定義に従ってEC2が1個作成される
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
しながら、ブラウザでアクセス
1個しかEC2を稼働させてないのでいわゆる片肺運用中だが、動作している。
phpinfo()
で表示されるIPアドレスも、そのEC2のプライベートIPのものと一致している。
この時点での構成図
インスタンス数を2個に増やす
Auto Scalingグループの設定でインスタンス数を2に変更する(最大値が1の場合は、そこも2に変更する)
Auto Scalingグループの設定でAZを複数設定していたので、起動したEC2は1つ目と異なるAZに割り振られる
ちなみに、ELBでロードバランスしている各EC2の状態は、設定しているターゲットグループの「ターゲット」からステータスを確認できる。
ここがinitial
からhealthy
に遷移すればOK
EC2が起動したら、webアクセスで何度かリロードしてみると、起動している複数のEC2のwebサーバへアクセスが振り分けられているのが確認できる。
この時点でこういう構成になっている。
あとは、AutoScalingグループの設定で起動するインスタンスを増減させることで、負荷分散するwebサーバの数を簡単に変更することができる。
EC2の停止・削除
AutoScalingグループでインスタンス数を0い設定すればOK。
ELBとの切断に少し時間がかかるが、しばらく待てば通常のEC2の削除と同様に停止・削除される。