AWS

EC2 Auto Scaling入門 CPU使用率に応じてスケーリング

スポンサーリンク
EC2 Auto Scaling ターゲット追跡ポリシー - CPU使用率 AWS
スポンサーリンク
スポンサーリンク

CPU使用率に基づいてEC2をスケーリングさせる構成

Auto Scalingを使って、EC2をスケールアウトさせる構成を作成します。今回はCPUの使用率に応じてスケーリングさせます。
今回はターゲット追跡スケーリングを選択し、対象とするCloudWatchメトリクスに、CPU使用率を指定します。

構築する環境

Diagram of EC2 Auto Scaling Target Tracking Policy (CPU Utilization).

プライベートサブネット内に、EC2 Auto Salingグループを設置します。このグループをALBにアタッチします。

CloudFormationテンプレートファイル

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

awstut-fa/026 at main · awstut-an-r/awstut-fa
Contribute to awstut-an-r/awstut-fa development by creating an account on GitHub.

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

プライベートサブネット内のAuto ScalingグループをALBにアタッチする

今回の構成では、ALBにアタッチするAuto Scalingグループは、プライベートサブネットに設置されています。ALBのターゲットとして、プライベートサブネット内のリソースを指定する場合、パブリックサブネットを用意し、ALBに関連付ける必要があるという点がポイントです。以下のページは、プライベートサブネット内のEC2インスタンスをALBにアタッチする方法をご紹介しています。

1点、上記のページと異なる点は、ALBターゲットグループのターゲット設定です。

Resources: ALBTargetGroup: Type: AWS::ElasticLoadBalancingV2::TargetGroup Properties: VpcId: !Ref VPC Name: !Sub "${Prefix}-ALBTargetGroup" Protocol: HTTP Port: !Ref HTTPPort HealthCheckProtocol: HTTP HealthCheckPath: / HealthCheckPort: traffic-port HealthyThresholdCount: !Ref HealthyThresholdCount UnhealthyThresholdCount: !Ref UnhealthyThresholdCount HealthCheckTimeoutSeconds: !Ref HealthCheckTimeoutSeconds HealthCheckIntervalSeconds: !Ref HealthCheckIntervalSeconds Matcher: HttpCode: !Ref HttpCode #Targets:
Code language: YAML (yaml)

通常、Targetsプロパティで、ALBにアタッチするEC2インスタンスやIPアドレス、Lambdaを指定します。しかし今回は本プロパティを設定しません。後述のAuto Scalingグループの方で設定を行うためです。

Auto Scalingを構成する3つの要素

本記事の主題です。Auto Scalingを構成するためには、以下の3つのリソースを作成します。

  • 起動設定
  • Auto Scalingグループ
  • スケーリングポリシー

順番に確認します。

起動設定

Auto Scalingの起動設定は、EC2インスタンスと似たパラメータが多く用意されています。

Resources: LaunchConfiguration: Type: AWS::AutoScaling::LaunchConfiguration Properties: IamInstanceProfile: !Ref InstanceProfile ImageId: !Ref ImageId InstanceType: !Ref InstanceType LaunchConfigurationName: !Sub "${Prefix}-LaunchConfiguration" SecurityGroups: - !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 yes > /dev/null
Code language: YAML (yaml)

ImageIdやInstanceTypeなど、EC2インスタンスでお馴染みのプロパティが多く用意されています。
UserDataプロパティで、Auto Scalingグループ内で作成されるインスタンスの、初期化処理が定義できます。今回はApacheのインストール・有効化後、yesコマンドを実行するように指定します。yesコマンドは、インスタンスのCPU使用率を高めて、スケーリングを誘発させることを目的としています。

Auto Scalingグループ

Auto Scalingグループで、作成するインスタンス数や、ターゲットグループを指定します。

Resources: AutoScalingGroup: Type: AWS::AutoScaling::AutoScalingGroup Properties: AutoScalingGroupName: !Sub "${Prefix}-AutoScalingGroup" DesiredCapacity: !Ref DesiredCapacity LaunchConfigurationName: !Ref LaunchConfiguration MaxSize: !Ref MaxSize MinSize: !Ref MinSize VPCZoneIdentifier: - !Ref PrivateSubnet1 - !Ref PrivateSubnet2 TargetGroupARNs: - !Ref ALBTargetGroup
Code language: YAML (yaml)

Auto Scalingグループの設定でポイントとなるのは2点です。
1点目はグループ内に起動するインスタンス数です。DesiredCapacityプロパティで希望数、MaxSizeプロパティで最大数、MinSizeプロパティで最小数を定義できます。今回はそれぞれ1、2、1を設定し、デフォルトでは1台、最大で2台のインスタンスが起動するようにします。
2点目はターゲットグループです。TargetGroupARNsプロパティで、Auto Scalingグループに関連づけるリソースを指定します。今回はALBにアクセスすると、Auto Scalingグループ内のEC2インスタンスにアクセスできるように構成します。ですから同プロパティに、先述のALBターゲットグループを指定します。

スケーリングポリシー

スケーリングポリシーは、インスタンス数を増減させるためのルールです。

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

今回の構成では、インスタンス数をCPUの使用率に応じて増減させます。そのためPolicyTypeプロパティに「TargetTrackingScaling」を、PredefinedMetricTypeプロパティに「ASGAverageCPUUtilization」を指定します。TargetValueプロパティで、閾値を設定できます。今回はCPUの使用率が50%を基準として、スケーリングが開始するように設定します。

環境構築

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

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

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

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

  • ALB:fa-016-ALB
  • Auto Scalingグループ:fa-026-AutoScalingGroup

AWS Management Consoleからも、リソースの作成状況を確認します。まずALBを確認します。

The ALB has been created normally.

ALBが作成され、DNS名が自動的に付与されていることがわかります。後ほど、このDNS名にアクセスします。

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

The Auto Scaling group has been created successfully.

インスタンス数やインスタンスタイプが、CloudFormationテンプレートファイルの設定通りであることがわかります。

From the history of the Auto Scaling group, we can see that the instances were automatically created.

履歴を見ると、希望数通りに1台のインスタンスが自動的に作成されたことがわかります。

Automatically created instance.

確かに1台のインスタンスが作成されていることがわかります。

ALBにアクセス ①

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

Access results to ALB 1.

正常にアクセスできました。Auto Scalingグループ内に自動的に作成されたインスタンスが、ALBターゲットとして応答していることがわかります。

スケールアウト時の挙動

UserDataによるインスタンスの初期化処理の中で、yesコマンドを実行しています。絶えず、実行することになるため、次第にCPU使用率が高まってきます。

CPU usage is above the threshold.

CPU使用率50%を超えました。スケーリングが開始されます。

You can see that the second instance has been created automatically.

Auto Scalingの履歴を見ると、インスタンス数が1台から2台に増えたことがわかります。

Automatically created the second instance.

ALBにアクセス ②

改めてALBにアクセスします。

Access results to ALB 2.

今度は先ほどのページに加えて、2台目のインスタンスからも応答が確認できました。このようにALBのターゲットグループに、Auto Scalingグループを指定することによって、負荷が高まったとしても、自動的にインスタンス数を増加し、システムを稼働し続けることが可能となります。

まとめ

Auto Scalingグループ内のインスタンス数を、CPU使用率に基づいてスケーリングする方法を確認しました。
Auto Scalingグループを、ALBのターゲットグループに指定する方法を確認しました。

タイトルとURLをコピーしました