EC2 Auto Scaling – CPU使用率に基づいてターゲット追跡スケーリング

EC2 Auto Scaling – CPU使用率に基づいてターゲット追跡スケーリング

以下のページでEC2 Auto Scalingの基本事項を取り上げました。

あわせて読みたい
EC2 Auto Scaling入門 – スケーリングポリシーなし 【EC2 Auto Scaling入門 - スケーリングポリシーなし】 EC2 Auto Scalingを利用することによって、任意の数のEC2インスタンスを起動し、アプリケーションの可用性を高め...

本ページでは、動的スケーリングの挙動を確認します。
EC2 Auto Scalingの動的スケーリングには以下の3種類があります。

  • シンプルスケーリング
  • ステップスケーリング
  • ターゲット追跡スケーリング

今回はターゲット追跡スケーリングの挙動を確認します。
CPU使用率に基づいてインスタンス数をスケーリングします。

なおシンプルスケーリングに関しては、以下のページをご確認ください。

あわせて読みたい
EC2 Auto Scaling – CPU使用率に基づいてシンプルスケーリング 【EC2 Auto Scaling - CPU使用率に基づいてシンプルスケーリング】 以下のページでEC2 Auto Scalingの基本事項を取り上げました。 https://awstut.com/2022/10/08/intro...

ステップスケーリングに関しては、以下のページをご確認ください。

あわせて読みたい
EC2 Auto Scaling – CPU使用率に基づいてステップスケーリング 【EC2 Auto Scaling - CPU使用率に基づいてステップスケーリング】 以下のページでEC2 Auto Scalingの基本事項を取り上げました。 https://awstut.com/2022/10/08/intro...

構築する環境

ALBを作成し、プライベートサブネット内のEC2 Auto Scalingをアタッチします。

Auto Scalingのインスタンス数は以下の通りに設定します。

  • 最小数:2
  • 最大数:5
  • 希望数:2

スケーリングはCPU使用率に応じて実行されるように設定します。
ターゲット追跡スケーリングでCPU使用率が20%程度で維持されるように設定します。

Auto Scalingグループ内で起動するEC2インスタンスですが、最新版のAmazon Linux 2とします。
S3上のyumリポジトリからApacheをインストールし、Webサーバとして動作するように設定します。

起動したインスタンスにアクセスするために、SSM Session Managerを使用します。

CloudFormationテンプレートファイル

上記の構成をCloudFormationで構築します。
以下のURLにCloudFormationテンプレートを配置しています。

https://github.com/awstut-an-r/awstut-fa/tree/main/026

テンプレートファイルのポイント解説

本ページは、EC2 Auto Scalingにおいてステップスケーリングを設定する方法を中心に取り上げます。

プライベートサブネット内のリソースをALBにアタッチする方法については、以下のページをご確認ください。

あわせて読みたい
プライベートサブネット内のインスタンスをALBにアタッチする 【プライベートサブネット内のインスタンスをALBにアタッチする構成】 プライベートサブネット内に設置されたインスタンスを、ALBにアタッチする方法を確認します。 AWS...

プライベートサブネット内のインスタンスでyumを実行する方法については、以下のページをご確認ください。

あわせて読みたい
プライベートサブネットのインスタンスでyum/dnfを実行する 【プライベートサブネット内のインスタンスでyum/dnfを実行する構成】 プライベートサブネット内のインスタンスで、yum/dnfを実行する方法を確認します。 今回は以下の2...

(参考)起動テンプレート

Resources:
  LaunchTemplate:
    Type: AWS::EC2::LaunchTemplate
    Properties:
      LaunchTemplateData:
        IamInstanceProfile:
          Arn: !GetAtt InstanceProfile.Arn
        ImageId: !Ref ImageId
        InstanceType: !Ref InstanceType
        SecurityGroupIds:
          - !Ref InstanceSecurityGroup
        UserData: !Base64 |
          #!/bin/bash -xe
          yum update -y
          yum install -y httpd
          systemctl start httpd
          systemctl enable httpd
          ec2-metadata -i > /var/www/html/index.html
      LaunchTemplateName: !Sub "${Prefix}-LaunchTemplate"
Code language: YAML (yaml)

起動テンプレートはAuto Scalingグループ内で起動するEC2インスタンスの設定情報に関するリソースです。
EC2 Auto Scalingを構成する上で、起動テンプレートまたは起動設定を作成する必要があります。
ただし現在、起動設定を使用してAuto Scalingを構成することは非推奨となっています。

起動設定を使用しないことを強くお勧めします。Amazon EC2 Auto Scaling または Amazon EC2 には完全な機能を提供していません。起動設定に関する情報は、起動設定から起動テンプレートにまだ移行していないお客様向けに提供しています。

起動設定

基本的にはEC2インスタンスと同様の設定項目です。
例えばImageIdやInstanceTypeプロパティで、起動させるインスタンスのAMIやインスタンスタイプを指定します。

UserDataプロパティでユーザデータを設定できます。
今回はApacheをインストールおよび有効化し、HTMLファイルにインスタンスIDを書き込み、Apacheのルートページに設定します。

Auto Scalingグループ

Resources:
  AutoScalingGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties:
      AutoScalingGroupName: !Sub "${Prefix}-AutoScalingGroup"
      DesiredCapacity: !Ref DesiredCapacity
      LaunchTemplate:
        LaunchTemplateId: !Ref LaunchTemplate
        Version: !GetAtt LaunchTemplate.LatestVersionNumber
      MaxSize: !Ref MaxSize
      MinSize: !Ref MinSize
      VPCZoneIdentifier:
        - !Ref PrivateSubnet1
        - !Ref PrivateSubnet2
      TargetGroupARNs:
        - !Ref ALBTargetGroup
Code language: YAML (yaml)

ステップスケーリングを構成する上で、Auto Scalingグループに特別な設定は不要です。

グループ内に作成するインスタンス数を、以下の通り設定します。
DesiredCapacityプロパティで希望数を2に設定します。
MaxSizeプロパティで最大数を5に設定します。
MinSizeプロパティで最小数を2に設定します。

スケーリングポリシー

Resources:
  ScalingPolicy:
    Type: AWS::AutoScaling::ScalingPolicy
    Properties:
      AutoScalingGroupName: !Ref AutoScalingGroup
      PolicyType: TargetTrackingScaling
      TargetTrackingConfiguration:
        PredefinedMetricSpecification:
          PredefinedMetricType: ASGAverageCPUUtilization
        TargetValue: !Ref TargetTrackingConfigurationTargetValue
Code language: YAML (yaml)

ステップスケーリングを構成するためには、ターゲット追跡スケーリング用ポリシーを1つ作成します。

PolicyTypeプロパティにスケーリングポリシーの種類を設定します。
今回はターゲット追跡スケーリングですから、「TargetTrackingScaling」を指定します。

TargetTrackingConfigurationプロパティでターゲット追跡スケーリングの設定を行います。

PredefinedMetricSpecificationプロパティで追跡するターゲットとなるメトリックを指定します。
今回はCPU使用率に基づいてスケーリングを行いますので、本プロパティ内部のPredefinedMetricTypeプロパティに「ASGAverageCPUUtilization」を指定します。

TargetValueプロパティで追跡するメトリックの閾値を設定します。
今回はAuto Scalingグループ全体のCPU使用率が、20%以下を維持するようにスケーリングを行いますので、「20」を指定します。

環境構築

CloudFormationを使用して、本環境を構築し、実際の挙動を確認します。

CloudFormationスタックを作成し、スタック内のリソースを確認する

CloudFormationスタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。

あわせて読みたい
CloudFormationのネストされたスタックで環境を構築する 【CloudFormationのネストされたスタックで環境を構築する方法】 CloudFormationにおけるネストされたスタックを検証します。 CloudFormationでは、スタックをネストす...

各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。

  • ALB:fa-026-ALB
  • ALBのDNS名:fa-026-ALB-957819670.ap-northeast-1.elb.amazonaws.com
  • ALBターゲットグループ:fa-026-ALBTargetGroup
  • 起動テンプレート:fa-026-LaunchTemplate
  • EC2 Auto Scalingグループ:fa-026-AutoScalingGroup

作成されたリソースをAWS Management Consoleから確認します。
ALBを確認します。

ALBのDNS名等が確認できます。

Auto Scalingグループを確認します。

希望数・最小数が2、最大数が5です。つまりAuto Scalingグループ内に、通常時は2つ、スケールアウト時は最大5つのインスタンスが起動します。

スケーリングポリシーを確認します。

1つのターゲット追跡スケーリングポリシーが作成されていることがわかります。

Auto Scalingグループのアクティビティ履歴を見ると、空だったグループ内にインスタンスが2つ作成されたことがわかります。

グループ内のインスタンスを確認すると、確かにインスタンスが1つ起動していることがわかります。

動作確認

通常時

準備が整いましたので、ALBにアクセスします。

2つのインスタンスにアクセスできました。
確かにALBにAuto Scalingグループがアタッチされていることがわかります。

スケールアウト

スケールアウト時の挙動を確認します。
SSM Session Managerを使用して、Auto Scalingグループ内のインスタンスにアクセスします。

% aws ssm start-session --target i-00772e6923e792985

Starting session with SessionId: root-0fa311b43f4b8e6ba
sh-4.2$
Code language: Bash (bash)

SSM Session Managerの詳細につきましては、以下のページをご確認ください。

あわせて読みたい
LinuxインスタンスにSSM Session Manager経由でアクセスする 【LinuxインスタンスにSSM Session Manager経由でアクセスする】 EC2インスタンスにSSM Session Manager経由でアクセスする構成を確認します。 Session Manager は完全...

yesコマンドを使用して、インスタンスのCPU使用率を高めます。

sh-4.2$ yes > /dev/null &
Code language: Bash (bash)

CPU使用率を確認します。

CPU使用率が20%を超えました。
20%を維持するために、スケールアウトが開始されるはずです。

Auto Scalingグループのアクティビティ履歴を見ると、新たなインスタンスが起動したことがわかります。

グループ内のインスタンスを確認すると、確かにインスタンスが2台追加されていることがわかります。
Auto Scalingグループ全体でCPU使用率が20%以内に抑えられるはずです。

確かにCPU利用率が12%程度に落ち着きました。
このようにターゲット追跡を使用することによって、ターゲットのメトリックが指定の値に収まるように、自動的にEC2インスタンスをスケールアウトされることを確認しました。

スケールイン

改めてインスタンスを操作し、yesコマンドを停止します。

sh-4.2$ kill %1
[1]+ Terminated yes > /dev/null
Code language: Bash (bash)

しばらく待つとグループ全体のCPU使用率が低下します。

使用率が低下しましたので、不要なインスタンス数がスケールインされるはずです。

確かにスケールインが開始され、インスタンス数が4台から2台に変更されました。

確かにグループ内のインスタンス数が2台であることがわかります。
このようにターゲット追跡を使用することによって、ターゲットのメトリック値が閾値を大きく下回った場合、自動的にEC2インスタンスをスケールインされることを確認しました。

まとめ

EC2 Auto Scalingの動的スケーリングの一種であるターゲット追跡スケーリングの挙動を確認しました。