全ての定義済みメトリクスに基づいたスケーリングを確認する構成
EC2 Auto Scaling入門ということで、以下のページでCPU使用率に基づいて、インスタンス数をスケーリングさせる構成をご紹介しました。
上記のCPUに加えて、事前定義されたメトリクスは4つあります。
・ASGAverageCPUUtilization – Auto Scaling グループの平均 CPU 使用率。
・ASGAverageNetworkIn – すべてのネットワークインターフェイスで Auto Scaling グループが受信した平均バイト数。
・ASGAverageNetworkOut – すべてのネットワークインターフェイスで Auto Scaling グループが送信した平均バイト数。
・ALBRequestCountPerTarget – Application Load Balancer ターゲットグループ内のターゲットごとに完了したリクエストの数。
Amazon EC2 Auto Scaling のターゲットトラッキングスケーリングポリシー
今回は上記の4つのメトリクスを使って、実際にスケーリング構成を作成し、挙動を確認します。
構築する環境
ALBと4つのALBターゲットグループを作成します。各グループに、Auto Scalingグループを関連付けます。それぞれのAuto Scalingグループは、先述の4つのメトリックタイプに基づいてスケーリングするように、スケーリングポリシーを用意します。
パスベースルーティングを使用して、それぞれのターゲットグループを、ALBに関連付けます。URLとターゲットグループの対応は、以下の通りです。
- /cpu/:ALB Target Group 1
- /network-in/:ALB Target Group 2
- /network-out/:ALB Target Group 3
- /alb/:ALB Target Group 4
今回作成するEC2インスタンスは、共通して、Apacheをインストールし、Webサーバとして動作させ、80/tcpでHTTPをリッスンします。
CloudFormationテンプレートファイル
上記の構成をCloudFormationで構築します。以下のURLにCloudFormationテンプレートを配置してます。
https://github.com/awstut-an-r/awstut-fa/tree/main/027
テンプレートファイルのポイント解説
基本的な構成は、先述のCPU使用率でスケーリングさせる構成と同様です。本ページでは、異なる点にフォーカスします。
なおALBのパスベースルーティングに関しては、以下のページをご確認ください。
事前定義されたメトリクス(CPU, Network in/out)
まず3つのメトリクス用のスケーリングポリシーを確認します。メトリックタイプの選択と閾値の指定がポイントです。
Resources:
ScalingPolicy:
Type: AWS::AutoScaling::ScalingPolicy
Properties:
AutoScalingGroupName: !Ref AutoScalingGroup
PolicyType: TargetTrackingScaling
TargetTrackingConfiguration:
PredefinedMetricSpecification:
PredefinedMetricType: !Ref PredefinedMetricType
TargetValue: !Ref TargetTrackingConfigurationTargetValue
Code language: YAML (yaml)
メトリックタイプはPredefinedMetricType、閾値はTargetValueプロパティで設定します。
今回は検証ということで、以下の通りに設定します。
Auto Scalingグループ | メトリックタイプ | 閾値 |
グループ1 | ASGAverageCPUUtilization | 5(%) |
グループ2 | ASGAverageNetworkIn | 1000(Byte) |
グループ3 | ASGAverageNetworkOut | 10000(Byte) |
事前定義されたメトリクス(ALBリクエスト数)
グループ4用のスケーリングポリシーを確認します。このメトリックを使用する上でのポイントは、対象となるALBを、リソースラベルという形で指定する必要があるという点です。
Resources:
ScalingPolicy:
Type: AWS::AutoScaling::ScalingPolicy
Properties:
...
PredefinedMetricSpecification:
PredefinedMetricType: ALBRequestCountPerTarget
ResourceLabel: !Ref ALBResourceLabel
TargetValue: !Ref TargetTrackingConfigurationTargetValue
Code language: YAML (yaml)
今回の閾値は10としました。
リソースラベルは2つの要素で構成されます。
The format is app/load-balancer-name/load-balancer-id/targetgroup/target-group-name/target-group-id , where
・app/load-balancer-name/load-balancer-id is the final portion of the load balancer ARN, and
・targetgroup/target-group-name/target-group-id is the final portion of the target group ARN.
AWS::AutoScaling::ScalingPolicy PredefinedMetricSpecification
これらの値は、組み込み関数Fn::GetAttを使用して、ALBおよびターゲットグループリソースから取得からできます。
Outputs:
ALBResourceLabel:
Value: !Sub
- "${LoadBalancerFullName}/${TargetGroupFullName}"
- LoadBalancerFullName: !GetAtt ALB.LoadBalancerFullName
TargetGroupFullName: !GetAtt ALBTargetGroup4.TargetGroupFullName
Code language: YAML (yaml)
組み込み関数Fn::Subを使用して、2つの値からリソースラベルを作成します。
環境構築
CloudFormationを使用して、本環境を構築し、実際の挙動を確認します。
CloudFormationスタックを作成し、スタック内のリソースを確認する
CloudFormationスタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。
各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。
- ALB:fa-027-ALB
- ターゲットグループ1:fa-027-ALBTargetGroup1
- ターゲットグループ2:fa-027-ALBTargetGroup2
- ターゲットグループ3:fa-027-ALBTargetGroup3
- ターゲットグループ4:fa-027-ALBTargetGroup4
AWS Management Consoleからも、リソースの作成状況を確認します。
まずALBを確認します。
正常にALBが作成されました。
各Auto Scalingグループを確認します。
別々のメトリックが設定されていることがわかります。
動作確認
準備が整いましたので、ALBにアクセスします。
ASGAverageCPUUtilization
CPU使用率の挙動については、別ページで検証済みですので、割愛します。詳細はそちらをご確認ください。
ASGAverageNetworkIn
/network-in/にアクセスし、ALBターゲットグループ2の挙動を確認します。
このグループのメトリックタイプはASGAverageNetworkIn、つまり受信したバイト数によってスケーリングが起こります。しばらく繰り返しリロードすると、受信バイト数が閾値(1000Byte)を超えます。
履歴を見ると、スケーリングが開始され、新しいインスタンスが作成されたことがわかります。
改めてALBにアクセスします。
先ほどのインスタンスに加えて、新しく作成されたインスタンスからも応答がありました。このように受信したデータ量に応じて、EC2インスタンs数をスケーリングすることができました。
ASGAverageNetworkOut
続いて/network-out/にアクセスし、ALBターゲットグループ3の挙動を確認します。
このグループのメトリックタイプはASGAverageNetworkOut、つまり送信したバイト数によってスケーリングが起こります。しばらく繰り返しリロードすると、送信バイト数が閾値(10000Byte)を超えます。
スケーリングが開始され、新しいインスタンスが作成され、ALB経由でアクセスできました。
このように送信したデータ量に応じて、EC2インスタンス数をスケーリングすることができました。
ALBRequestCountPerTarget
続いて/alb/にアクセスし、ALBターゲットグループ4の挙動を確認します。
このグループのメトリックタイプはALBRequestCountPerTarget、つまりALBターゲットグループ内の、インスタンスごとに完了したリクエスト数に応じて、スケーリングが開始されます。しばらく繰り返しリロードすると、リクエスト数が閾値(10)を超えます。
スケーリングが開始され、新しいインスタンスが作成され、ALB経由でアクセスできました。
このようにALBターゲットグループ内で処理されたリクエスト数に応じて、EC2インスタンス数をスケーリングすることができました。
まとめ
事前定義された4つのメトリクスを使って、実際にスケーリング構成を作成し、挙動を確認しました。