AWS EC2のCPU負荷でのオートスケーリングとCPUクレジットを試してみた

# AWS Hands-on for Beginners
## Amazon EC2 Auto Scaling スケーリング基礎編

https://pages.awscloud.com/JAPAN-event-OE-Hands-on-for-Beginners-Auto_Scaling-2022-confirmation_842.html

上記のハンズオンに基づいて、EC2インスタンスを作成しオートスケーリンググループ（通常：２　最小：２　最大４）を作成する。

ここで、作成したインスタンスに対して下記のコマンドを実行しCPU負荷をかける。
```
stress -c 1
```

ハンズオンでは、CloudWatchによるCPU使用率が上昇し、スケールアウトが発生する。とのことだが、実際にはCPU負荷は一度は上昇するが、すぐに減少してしまい。スケールアウトが発生しないケースがある。

***
### 1.CloudFormationでハンズオン用のスタックを作成する
　CloudFormation　＞　スタック　＞　スタックの新規作成

```
{
  "AWSTemplateFormatVersion" : "2010-09-09",

  "Description" : "This template is for 'AWS Hands-on for Beginners Amazon EC2 Auto Scaling'.",

  "Resources" : {

    "VPC" : {
      "Type" : "AWS::EC2::VPC",
      "Properties" : {
        "CidrBlock" : "10.0.0.0/16",
        "EnableDnsSupport" : true,
        "EnableDnsHostnames" : true,
        "Tags" : [ {"Key" : "Name", "Value" : "h4b-vpc" } ]
      }
    },

    "PublicSubnet1" : {
      "Type" : "AWS::EC2::Subnet",
      "Properties" : {
        "VpcId" : { "Ref" : "VPC" },
        "CidrBlock" : "10.0.0.0/24",
        "AvailabilityZone" : { "Fn::Select" : [ "0", { "Fn::GetAZs" : { "Ref" : "AWS::Region" }}]},
        "MapPublicIpOnLaunch" : true,
        "Tags" : [ {"Key" : "Name", "Value" : "h4b-subnet1" } ]
      }
    },
    
    "PublicSubnet2" : {
      "Type" : "AWS::EC2::Subnet",
      "Properties" : {
        "VpcId" : { "Ref" : "VPC" },
        "CidrBlock" : "10.0.1.0/24",
        "AvailabilityZone" : { "Fn::Select" : [ "1", { "Fn::GetAZs" : { "Ref" : "AWS::Region" }}]},
        "MapPublicIpOnLaunch" : true,
        "Tags" : [ {"Key" : "Name", "Value" : "h4b-subnet2" } ]
      }
    },

    "InternetGateway" : {
      "Type" : "AWS::EC2::InternetGateway",
      "Properties" : {
        "Tags" : [ {"Key" : "Name", "Value" : "h4b-igw" } ]
      }
    },

    "AttachGateway" : {
       "Type" : "AWS::EC2::VPCGatewayAttachment",
       "Properties" : {
         "VpcId" : { "Ref" : "VPC" },
         "InternetGatewayId" : { "Ref" : "InternetGateway" }
       }
    },

    "RouteTable" : {
      "Type" : "AWS::EC2::RouteTable",
      "Properties" : {
        "VpcId" : {"Ref" : "VPC"},
        "Tags" : [ {"Key" : "Name", "Value" : "h4b-route-table" } ]
      }
    },

    "Route" : {
      "Type" : "AWS::EC2::Route",
      "DependsOn" : "AttachGateway",
      "Properties" : {
        "RouteTableId" : { "Ref" : "RouteTable" },
        "DestinationCidrBlock" : "0.0.0.0/0",
        "GatewayId" : { "Ref" : "InternetGateway" }
      }
    },

    "SubnetRouteTableAssociation1" : {
      "Type" : "AWS::EC2::SubnetRouteTableAssociation",
      "Properties" : {
        "SubnetId" : { "Ref" : "PublicSubnet1" },
        "RouteTableId" : { "Ref" : "RouteTable" }
      }
    },
      
    "SubnetRouteTableAssociation2" : {
      "Type" : "AWS::EC2::SubnetRouteTableAssociation",
      "Properties" : {
        "SubnetId" : { "Ref" : "PublicSubnet2" },
        "RouteTableId" : { "Ref" : "RouteTable" }
      }
    },

    "ALBSecurityGroup" : {
      "Type" : "AWS::EC2::SecurityGroup",
      "Properties" : {
        "VpcId" : { "Ref" : "VPC" },
        "GroupDescription" : "Enable http access",
        "GroupName" : "h4b-alb-sg",
        "SecurityGroupIngress" : [
          { "IpProtocol" : "tcp", "FromPort" : "80", "ToPort" : "80", "CidrIp" : "0.0.0.0/0"}
         ],
         "Tags" : [ {"Key" : "Name", "Value" : "h4b-alb-sg" } ]
      }
    },


    "EC2SecurityGroup" : {
      "Type" : "AWS::EC2::SecurityGroup",
      "Properties" : {
        "VpcId" : { "Ref" : "VPC" },
        "GroupDescription" : "Enable http access from ALB Security Group",
        "GroupName" : "h4b-ec2-sg",
        "SecurityGroupIngress" : [
          { "IpProtocol" : "tcp", "FromPort" : "22", "ToPort" : "22", "CidrIp" : "0.0.0.0/0" },
          { "IpProtocol" : "tcp", "FromPort" : "80", "ToPort" : "80", "SourceSecurityGroupId" : { "Ref" : "ALBSecurityGroup" }}
         ],
         "Tags" : [ {"Key" : "Name", "Value" : "h4b-ec2-sg" } ]
      }
    },
    
    "ALBTargetGroup" : {
      "Type" : "AWS::ElasticLoadBalancingV2::TargetGroup",
      "Properties" : {
        "HealthCheckEnabled" : true,
        "HealthCheckIntervalSeconds" : 30,
        "Matcher" : {
          "HttpCode" : "200"
        },
        "Name" : "h4b-tg",
        "Port" : 80,
        "Protocol" : "HTTP",
        "TargetGroupAttributes" : [{
          "Key" : "deregistration_delay.timeout_seconds",
          "Value" : "120"
        }],
        "VpcId" : { "Ref" : "VPC" },
        "Tags" : [ {"Key" : "Name", "Value" : "h4b-tg"} ]
      }
    },
    
    "ALB" : {
      "Type" : "AWS::ElasticLoadBalancingV2::LoadBalancer",
      "Properties" : {
        "IpAddressType" : "ipv4",
        "Name" : "h4b-alb",
        "Scheme" : "internet-facing",
        "SecurityGroups" : [{ "Ref" : "ALBSecurityGroup" }],
        "Subnets" : [ { "Ref" : "PublicSubnet1" }, {"Ref" : "PublicSubnet2"} ],
        "Tags" : [ {"Key" : "Name", "Value" : "h4b-alb"} ],
        "Type" : "application"
      }
    },
    
    "ALBListener" : {
      "Type" : "AWS::ElasticLoadBalancingV2::Listener",
      "Properties" : {
        "DefaultActions" : [{
          "TargetGroupArn" : { "Ref" : "ALBTargetGroup" },
          "Type" : "forward"
        }],
        "LoadBalancerArn" : { "Ref" : "ALB" },
        "Port" : 80,
        "Protocol" : "HTTP"
      }
    }

  }

}

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/17c27885-4f30-9040-50d3-cb596563c8d5.png)

***
### 2.EC2の起動テンプレートの作成
EC2　＞　起動テンプレート　＞　起動テンプレートを作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/79ef6330-edb5-2d1c-0d81-2e31317a7d08.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/6782fcc3-c045-475f-f9c4-71bd2799638c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/f4d4ba76-3e6b-9677-2da5-def8af61f2c0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/535bb252-2961-acfe-ee07-53bcab2be4ee.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/a607bb59-51b2-ed21-6df8-557e0d58de39.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/139655d7-67e2-4dbf-01b3-99c5180621af.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/b09ade00-2880-7b22-cad8-9ef4188816b5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/d4728a14-88c1-ad93-464e-41fe2cf66972.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/d3ae5694-2bd5-90b7-b793-21c4f295ee47.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/aecb7b38-555d-90a4-4661-c260f110fe85.png)


***
### 3.EC2のオートスケーリンググループの作成
EC2　＞　Auto Scaling グループ　＞　Auto Scaling グループを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/241a37c4-7b22-92f5-19ce-96962f233bc0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/aa4032e7-38d1-bc7c-0372-f37d4fd4ea99.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/ce17cd6e-c961-100c-91ed-81c5daa84292.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/7665bab3-0823-e4b9-9a80-98607bd4dece.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/2f556cd9-d18d-b233-de79-cfacff7e3f0b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/0d5756ae-6214-5dd9-84a5-c5a005d92726.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/bbc28cef-7ae6-50a9-99c1-22ec90102219.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/59de3341-8392-0f62-ec7b-0f595a8a64b0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/3177d60c-84af-67e9-cf15-9e7cc107bff4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/bf3c4d54-34f4-2c0c-5b25-025bb8e3adf9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/b550423e-ce44-71f6-9a7a-164850fad1f8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/672f5413-97dc-5a09-1d38-4032b2d7921a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/7a7cad9b-682b-c63a-3d7f-1574188a12f1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/d28f2431-235b-f9ef-c246-24ca10152d2a.png)


***
### 4.インスタンスを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/7c9e2afd-29ac-140a-506e-e8309d960e12.png)

***
### 5.CloudWatchのCPUUtilizationの確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/a39159ed-a759-b3b2-34a6-fdbd9bbef89a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/a2a70821-a43b-463f-b142-c7105178e5ae.png)

***
### 6.インスタンスに接続し、topコマンド実行
■１号機
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/7aab689a-7948-c516-6cd3-8244a01bac0a.png)

■２号機
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/9603327e-f27d-b4bf-9c1c-cd1f94b234ef.png)

```
stress -c 1
```
コマンドを実行

■１号機
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/9f53b8f5-cd46-5faa-d370-8fb53a23b6d1.png)

■２号機
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/ce36ab4f-25dd-7bb5-0229-9dea5eb9a260.png)

この時のインスタンスの状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/aed4ba5c-2c5a-72b5-9cac-3463adb47399.png)


この時のCloudWatchの状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/87b9c32e-84d3-5927-daa1-8049dcf7e3b1.png)

***
***
数分後
■CloudWatch
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/3754373d-4461-dd88-8591-0d8f232a5444.png)

３号機のインスタンスが起動される

■インスタンスの状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/46da1f00-6433-1589-27af-57752525fd76.png)

■１号機の状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/2da204ae-56a2-13d9-4ca6-4de889f0e54d.png)

■２号機の状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/cb280e77-8d24-2418-77b1-0ae2603d7661.png)

***
***
さらに４号機のインスタンスが起動される

■インスタンスの状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/e4ad9888-ce3f-3bf8-7322-215b52db0d31.png)

■CloudWatchの状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/41da0f80-12f8-f043-8b03-e75fa15ef8a7.png)

■最終形態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/dbd1316a-43c8-b289-01f9-619e82724be5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/4bd5dcec-96fb-672d-639e-6acafc8aa125.png)

■オートスケーリンググループのアクティビティ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/80e91521-1b45-c206-babe-e83f0f34bf59.png)


***
### 7.スケールインを試す
１号機、２号機のstressコマンドを中断
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/6e54a1ab-b439-ac0b-66a1-afe44cf4f114.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/d32673a5-5986-db73-b2da-4d38a7497c4c.png)

スケールインの条件は
15 分内の15データポイントのCPUUtilization < 60

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/868612c4-8410-2aa4-bb27-a8f75d4f5f99.png)

***
約２０分後にTargetTracking-h4b-autoscaling-group-AlarmLowのアラームが発生
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/d5795a26-ef87-e018-1269-9012bcc27ab9.png)

１つのインスタンスが終了状態になる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/8e4d808c-269f-5dd5-e3a9-2e21e18ee53b.png)

オートスケーリングのアクティビティ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/d2e50a9c-6ffe-3d71-34d3-33f11f14d75e.png)

古いインスタンスから終了していることがわかる

そしてもう一つのインスタンスも終了される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/b68185fe-290a-8e45-2582-d78a28ab76e9.png)

これでスケールアウト、およびスケールインの検証は完了。
***
***
**ここまではスムーズにいったケース
しかし、筆者が同じ状態で行ったときには、CPU負荷が一度は１００％になったが、それ以降CPU負荷は１０％にとどまり、それ以上上昇しなかった。**

***
# EC2のCPUクレジット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/c88145ae-7926-325f-1de2-67b10237b458.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/6de47497-cce9-1bb9-882f-49b7476c72bd.png)

Amazon EC2でT系インスタンスでは、他のインスタンスタイプとは違い、ベースラインと呼ばれるあらかじめ決められたCPU使用率が定義されています。ベースラインを超えたCPU使用率が使用できる状況をバースト機能と呼びます。バースト機能を使用している時に使われるのが、「CPUクレジット」です。

この「CPUクレジット残高」が0になると、CPUクレジットの消費タイプにより、ベースライン以下の性能しか出なくなるか、追加の課金が発生します。

ここで、先ほどの２つのインスタンスの内、一つだけstressでCPUを100%の状態にしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/1d9989bd-8006-fc5e-3e1a-6979ce6d4beb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/6aff74f5-8651-eaf9-bba2-fa8e824956e1.png)

何もしていないインスタンスの状態はCPUが０％のままです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/a4d9ee5c-f771-7eba-d74e-1bfece163973.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/bc3eebde-a1a2-53d9-87d1-2575c4f922a0.png)

負荷をかけたインスタンスのほうがCPUクレジットを消費していくのがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/7e586da6-8744-b9b1-6c69-51f115b103e8.png)

このときのCloudWatchのTargetTracking-h4b-autoscaling-group-AlarmHighのCPUUtilizationメトリクスは一度は上昇します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/0494454d-09fe-240d-c693-6acfefed6911.png)

その後もCPUクレジットは減少を続けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/5213800c-1e59-b2b7-21ba-cde6599dba28.png)

***
ついにCPUクレジットがなくなりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/93908e73-b934-b3a3-f891-46004dae5b3c.png)

■この時の負荷をかけたインスタンスの状態はこのようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/f363df15-2edc-fd56-4843-c34bb374af80.png)


stressでCPUが100%だった状態が、CPUが10%しか稼働していません。

この時のCloudWatchのTargetTracking-h4b-autoscaling-group-AlarmHighのCPUUtilizationメトリクスは減少します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597406/f1e89cfc-328f-ac1a-2cba-579387e27735.png)

これで負荷をかけても、CPUクレジットがなくなるとCPUが100%の能力を出せず、オートスケーリングが失敗することがあるようです。
筆者の場合、最初にこの状態になりました。
この状態だと、一度stressを止めて再度実行しても、既にクレジットがないためCPUは１０％までしか稼働できません。

なぜ最初からCPUクレジットがなくなっていたのかは謎のままですが、CPU負荷を掛けても１００％使えない状態があることは知っておいたほうが良いと思います。