AWSで ELBを使ったEC2のAuto Scalingを試す(チュートリアル)


Auto Scalingは、AWSでインフラを構築する際に、重要機能なので軽く触れるようになっておきたい。そのためチュートリアル的な構成で実際に構築してみた。

構築する構成

ELB(ALB)で、EC2インスタンス上のWebアプリケーションに振り分ける。
EC2インスタンスは、オートスケーリングにより、増減する。

構築する

ネットワーキングの設定

VPCの作成

  • 今回の指定値(抜粋)
    • VPC名: autoscale-demo-vpc
    • IPv4 CIDRブロック: 10.0.0.0/16

サブネットの作成

2つのAZにまたがる構成を作成するため、サブネット作成時にAZを指定する。

  • 今回の指定値(抜粋)
    • 1つ目
      • 名前: autoscale-demo-subnet-1a
      • AZ: ap-northeast-1a
      • CIDR: 10.0.1.0/24
    • 2つ目
      • 名前: autoscale-demo-subnet-1c
      • AZ: ap-northeast-1c
      • CIDR: 10.0.2.0/24

インターネットゲートウェイの作成

  • 今回の指定値(抜粋)
    • 名前: autoscale-demo-igw

作成後、VPCにアタッチする

ルートテーブルの設定

  • ルート設定の編集(インターネット向けルート設定の追加)
    • 送信先: 0.0.0.0/0
    • ターゲット: インターネットゲートウェイ
  • サブネットの関連付けの編集
    • 今回作成した2つのサブネットを関連付ける

セキュリティグループの作成

  • 今回の指定値(抜粋)
    • 名前: web-server-sg
    • VPC: autoscale-demo-vpc(今回作成したVPC)
    • インバウンドルール: HTTP(tcp/80)とSSH(tcp/22)を許可
    • アウトバウンドルール: すべてのトラフックを許可

ロードバランシングの設定

ターゲットグループの作成

  • 今回の指定値(抜粋)
    • ターゲットグループ名: autoscale-demo-tg
    • ターゲットの種類: インスタンス
    • プロトコル: HTTP
    • ポート: 80
    • VPC: autoscale-demo-vpc

ロードバランサーの作成

  • 今回の指定値(抜粋)
    • ロードバランサーの種類: ALB(Application Load Balancer)
    • 名前: autoscale-demo-elb
    • スキーム: インターネット向け
    • リスナー: HTTP 80
    • アベイラビリティゾーン: 1aと1cにチェックを入れる。
    • セキュリティグループ: web-server-sgを選択
    • ターゲットグループ: autoscale-demo-tg(上記で作成したもの)
    • ターゲットの登録:ここでは特にしない

セキュリティ設定の構成で、セキュアリスナーを使っていないと注意されるが、今回は本番環境ではないので気にしない。

Auto Scalingの設定

起動設定の作成

  • 今回の指定値(抜粋)
    • AMI: Amazon Linux 2 AMI
    • インスタンスタイプ: t2.micro
    • 起動設定の名前: autoscale-demo-launchconfig
    • ユーザデータ: httpdのインストールや表示ページを作るスクリプトを記載(後述)
    • IPアドレスタイプ: パブリックIPアドレスを各インスタンスに割り当てます
    • セキュリティグループ: web-server-sgを選択

セキュリティグループをこの画面で作成すると、デフォルトVPCに紐づいてしまって、以降のAuto Scalingグループの作成時に下記のようなエラーになってはまった。
セキュリティグループは、事前に作成しているものを使うことで回避できる。

One or more security groups in the launch configuration are not linked to the VPCs configured in the Auto Scaling group

ユーザデータでは、今回は、負荷分散先のEC2が特定できるような情報を付与しておく。

#cloud-config

packages: 
  - httpd

timezone: Asia/Tokyo

runcmd: 
  - "echo \"<html>\" > /var/www/html/index.html"
  - "echo \"<h1>hello world</h1>\" >> /var/www/html/index.html"
  - "echo \"created at \" `date` \"</br>\" >> /var/www/html/index.html"
  - "ec2-metadata -i >> /var/www/html/index.html"
  - "echo \"</html>\" >> /var/www/html/index.html"
  - "systemctl start httpd"
  - "systemctl enable httpd"

Auto Scaling グループを作成する

  • 今回の指定値(抜粋)
    • Auto Scaling グループの詳細設定
      • 起動設定: autoscale-demo-launchconfig(上記で作成したもの)
      • グループ名: autoscale-demo-asg
      • グループサイズ: 2
      • ネットワーク: 今回作成したVPCを選択
      • サブネット: 今回作成した2つのサブネットを選択
      • ロードバランシング: ロードバランサーからトラフックを受信するについてチェックを入れる
      • ターゲットグループ: autoscale-demo-tg(今回作成したもの)
      • ヘルスチェックのタイプ: ELBを選択
    • スケーリングポリシーの設定
      • 「スケーリングポリシーを使用して、このグループのキャパシティを調整する」を選択
      • スケーリング範囲:「2」および「4」インスタンス
      • スケールグループサイズ: 「ステップスケーリングポリシーまたは簡易スケーリングポリシーを使用した Auto Scaling グループのスケーリング」を選択すると、グループサイズの増加、グループサイズの減少の設定項目が表示される
      • グループサイズの増加
        • 名前: Increase Group Size
        • ポリシー
          • Average CPC使用率 >= 60 %
          • アラーム名: autoscale-demo-hiCPU-alarm
        • アクション: 追加 2 capacity units
      • グループサイズの減少
        • 名前: Decrease Group Size
        • ポリシー
          • Average CPU使用率 <= 20 %
          • アラーム名: autoscale-demo-rowCPU-alarm
        • アクション: 削除 2 capacity units
    • 通知の設定:今回は設定しない
    • タグ:今回は設定しない

動作確認する

Auto Scaling グループ 作成直後の状態の確認

EC2リソース作成確認

インスタンス一覧を確認。インスタンスが2つ作成されている。

Webサーバへのアクセス確認

ELBのDNS名をコピーして、Webブラウザに張り付けて、Webページ(Hello world)が見れる。
この時、ブラウザでウェブページを更新(F5ボタン押下)すると表示内容が変わることから、ELBによる振り分けが機能していることがわかる。
(index.htmlにEC2インスタンスのinstance-idも表示するようにした)

スケールアウトの確認

試しにCPU使用率をあげる

両方のWebサーバ(EC2インスタンス)にSSHでログインして
CPU使用率を上げるような処理を動かす

$ yes > /dev/null

CloudWatchの画面で、「autoscale-demo-hiCPU-alarm」のアラームを確認すると、平均CPU使用率が急上昇していき、60%のラインを超えると、アラート状態になる

Auto Scalingグループが動作していることを確認

Auto Scalingグループのアクティビティ履歴を確認すると、新しく2つのEC2インスタンスを起動させたメッセージが出ている。
インスタンス一覧の画面では、runningのインスタンスが2つ増えていることが確認できる。

ブラウザでウェブページを更新(F5ボタン押下)すると表示内容が4パターンになっていることから、ELBによる振り分けが機能していることがわかる。

スケールインの確認

CPU負荷を下げる

CPU負荷を上げるために実行していたコマンドを停止する

CloudWatchの画面で、「autoscale-demo-rowCPU-alarm」のアラームを確認すると、平均CPU使用率が下がっていき、20%以下になると、アラーム状態になる。

Auto Scalingグループが動作していることを確認

Auto Scalingグループのアクティビティ履歴を確認すると、新しく2つのEC2インスタンスを停止しているメッセージが出ている。
数分後、インスタンス一覧の画面では、runningのインスタンスが2つに戻っていることが確認できる。(2つ停止されたことが確認できる)

ブラウザでウェブページを更新(F5ボタン押下)すると表示内容が2パターンになっていることから、ELBによる振り分けが機能していることがわかる。