Fargateタスクでターゲット追跡スケーリングとスケジュールスケーリングの併用

ターゲット追跡スケーリングとスケジュールスケーリングを併用できるのか確認したメモ。

参考リンク

準備

前回の続きとして実施する。サービスが作成され、ターゲット追跡スケーリングが設定された状態。

すなわち、register-scalable-targetput-scaling-policyは実施済みの状態。

f:id:sotoiwa:20201106105405p:plain

$ aws application-autoscaling describe-scalable-targets --service-namespace ecs --resource-ids service/fargate-cluster/echoserver
{
    "ScalableTargets": [
        {
            "ServiceNamespace": "ecs",
            "ResourceId": "service/fargate-cluster/echoserver",
            "ScalableDimension": "ecs:service:DesiredCount",
            "MinCapacity": 1,
            "MaxCapacity": 10,
            "RoleARN": "arn:aws:iam::XXXXXXXXXXXX:role/aws-service-role/ecs.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ECSService",
            "CreationTime": "2020-11-06T10:06:09.967000+09:00",
            "SuspendedState": {
                "DynamicScalingInSuspended": false,
                "DynamicScalingOutSuspended": false,
                "ScheduledScalingSuspended": false
            }
        }
    ]
}
$ aws application-autoscaling describe-scaling-policies --service-namespace ecs --resource-id service/fargate-cluster/echoserver
{
    "ScalingPolicies": [
        {
            "PolicyARN": "arn:aws:autoscaling:ap-northeast-1:XXXXXXXXXXXX:scalingPolicy:5bb4a23d-5417-4cda-b63f-6d5c439d50da:resource/ecs/service/fargate-cluster/echoserver:policyName/MyMetricTargetTrackingPolicy",
            "PolicyName": "MyMetricTargetTrackingPolicy",
            "ServiceNamespace": "ecs",
            "ResourceId": "service/fargate-cluster/echoserver",
            "ScalableDimension": "ecs:service:DesiredCount",
            "PolicyType": "TargetTrackingScaling",
            "TargetTrackingScalingPolicyConfiguration": {
                "TargetValue": 10.0,
                "CustomizedMetricSpecification": {
                    "MetricName": "MyMetricName",
                    "Namespace": "MyNamespace",
                    "Dimensions": [
                        {
                            "Name": "MyMetricDimensionName",
                            "Value": "MyMetricDimensionValue"
                        }
                    ],
                    "Statistic": "Average"
                },
                "ScaleOutCooldown": 60,
                "ScaleInCooldown": 60,
                "DisableScaleIn": false
            },
            "Alarms": [
                {
                    "AlarmName": "TargetTracking-service/fargate-cluster/echoserver-AlarmHigh-d945ea9e-3722-4428-8633-758ee31546e4",
                    "AlarmARN": "arn:aws:cloudwatch:ap-northeast-1:XXXXXXXXXXXX:alarm:TargetTracking-service/fargate-cluster/echoserver-AlarmHigh-d945ea9e-3722-4428-8633-758ee31546e4"
                },
                {
                    "AlarmName": "TargetTracking-service/fargate-cluster/echoserver-AlarmLow-f864b106-a656-4b20-aebe-01042354cb37",
                    "AlarmARN": "arn:aws:cloudwatch:ap-northeast-1:XXXXXXXXXXXX:alarm:TargetTracking-service/fargate-cluster/echoserver-AlarmLow-f864b106-a656-4b20-aebe-01042354cb37"
                }
            ],
            "CreationTime": "2020-11-06T10:07:59.650000+09:00"
        }
    ]
}

スケジュールスケーリングの設定

スケジュールスケーリングは、スケーリングポリシーとは別に、スケジュールアクションとして作成する。

1回のみのアクションを登録することも、rate式またはcron式を使って定期的なアクションを作成することも可能。

1回のみのアクションとして登録

1回のみのアクションを登録する。

aws application-autoscaling put-scheduled-action \
  --service-namespace ecs \
  --scalable-dimension ecs:service:DesiredCount \
  --resource-id service/fargate-cluster/echoserver \
  --scheduled-action-name scale-out \
  --schedule "at(2020-11-06T01:30:00)" \
  --scalable-target-action MinCapacity=3

登録したアクションを確認する。

$ aws application-autoscaling describe-scheduled-actions --service-namespace ecs --resource-id service/fargate-cluster/echoserver
{
    "ScheduledActions": [
        {
            "ScheduledActionName": "scale-out",
            "ScheduledActionARN": "arn:aws:autoscaling:ap-northeast-1:XXXXXXXXXXXX:scheduledAction:5bb4a23d-5417-4cda-b63f-6d5c439d50da:resource/ecs/service/fargate-cluster/echoserver:scheduledActionName/scale-out",
            "ServiceNamespace": "ecs",
            "Schedule": "at(2020-11-06T01:30:00)",
            "ResourceId": "service/fargate-cluster/echoserver",
            "ScalableDimension": "ecs:service:DesiredCount",
            "ScalableTargetAction": {
                "MinCapacity": 3
            },
            "CreationTime": "2020-11-06T10:27:13.180000+09:00"
        }
    ]
}

時間になると最小数が変更されスケールする。

f:id:sotoiwa:20201106105428p:plain

スケーリングアクティビティを確認できる。最小数が変更される。この場合タスク数が最小数を下回っていたので、その後少し後にDesiredが変更されている。

$ aws application-autoscaling describe-scaling-activities --service-namespace ecs --resource-id service/fargate-cluster/echoserver --max-items 2
        {
            "ActivityId": "e6796600-390a-4307-b8b4-43ca6c274463",
            "ServiceNamespace": "ecs",
            "ResourceId": "service/fargate-cluster/echoserver",
            "ScalableDimension": "ecs:service:DesiredCount",
            "Description": "Setting desired count to 3.",
            "Cause": "minimum capacity was set to 3",
            "StartTime": "2020-11-06T10:30:40.076000+09:00",
            "EndTime": "2020-11-06T10:31:46.790000+09:00",
            "StatusCode": "Successful",
            "StatusMessage": "Successfully set desired count to 3. Change successfully fulfilled by ecs."
        },
        {
            "ActivityId": "2689954f-cd75-48cf-af1f-9ad877e3413c",
            "ServiceNamespace": "ecs",
            "ResourceId": "service/fargate-cluster/echoserver",
            "ScalableDimension": "ecs:service:DesiredCount",
            "Description": "Setting min capacity to 3",
            "Cause": "scheduled action name scale-out was triggered",
            "StartTime": "2020-11-06T10:30:39.582000+09:00",
            "EndTime": "2020-11-06T10:30:39.602000+09:00",
            "StatusCode": "Successful",
            "StatusMessage": "Successfully set min capacity to 3"
        }

定期的なアクションとして登録

定期的なアクションを2つcron式で登録する。毎40分と毎44分にアクションを登録。

aws application-autoscaling put-scheduled-action \
  --service-namespace ecs \
  --scalable-dimension ecs:service:DesiredCount \
  --resource-id service/fargate-cluster/echoserver \
  --scheduled-action-name my-recurring-action1 \
  --schedule "cron(40 * * * ? *)" \
  --scalable-target-action MinCapacity=5,MaxCapacity=20
aws application-autoscaling put-scheduled-action \
  --service-namespace ecs \
  --scalable-dimension ecs:service:DesiredCount \
  --resource-id service/fargate-cluster/echoserver \
  --scheduled-action-name my-recurring-action2 \
  --schedule "cron(44 * * * ? *)" \
  --scalable-target-action MinCapacity=1,MaxCapacity=10

確認する。

$ aws application-autoscaling describe-scheduled-actions --service-namespace ecs --resource-id service/fargate-cluster/echoserver
{
    "ScheduledActions": [
        {
            "ScheduledActionName": "my-recurring-action1",
            "ScheduledActionARN": "arn:aws:autoscaling:ap-northeast-1:XXXXXXXXXXXX:scheduledAction:5bb4a23d-5417-4cda-b63f-6d5c439d50da:resource/ecs/service/fargate-cluster/echoserver:scheduledActionName/my-recurring-action1",
            "ServiceNamespace": "ecs",
            "Schedule": "cron(40 * * * ? *)",
            "ResourceId": "service/fargate-cluster/echoserver",
            "ScalableDimension": "ecs:service:DesiredCount",
            "ScalableTargetAction": {
                "MinCapacity": 5,
                "MaxCapacity": 20
            },
            "CreationTime": "2020-11-06T10:39:44.322000+09:00"
        },
        {
            "ScheduledActionName": "scale-out",
            "ScheduledActionARN": "arn:aws:autoscaling:ap-northeast-1:XXXXXXXXXXXX:scheduledAction:5bb4a23d-5417-4cda-b63f-6d5c439d50da:resource/ecs/service/fargate-cluster/echoserver:scheduledActionName/scale-out",
            "ServiceNamespace": "ecs",
            "Schedule": "at(2020-11-06T01:30:00)",
            "ResourceId": "service/fargate-cluster/echoserver",
            "ScalableDimension": "ecs:service:DesiredCount",
            "ScalableTargetAction": {
                "MinCapacity": 3
            },
            "CreationTime": "2020-11-06T10:27:13.180000+09:00"
        },
        {
            "ScheduledActionName": "my-recurring-action2",
            "ScheduledActionARN": "arn:aws:autoscaling:ap-northeast-1:XXXXXXXXXXXX:scheduledAction:5bb4a23d-5417-4cda-b63f-6d5c439d50da:resource/ecs/service/fargate-cluster/echoserver:scheduledActionName/my-recurring-action2",
            "ServiceNamespace": "ecs",
            "Schedule": "cron(44 * * * ? *)",
            "ResourceId": "service/fargate-cluster/echoserver",
            "ScalableDimension": "ecs:service:DesiredCount",
            "ScalableTargetAction": {
                "MinCapacity": 1,
                "MaxCapacity": 10
            },
            "CreationTime": "2020-11-06T10:39:45.154000+09:00"
        }
    ]
}

40分に変更される。

f:id:sotoiwa:20201106105451p:plain

44分にまた変更される。

f:id:sotoiwa:20201106105503p:plain

$ aws application-autoscaling describe-scaling-activities --service-namespace ecs --resource-id service/fargate-cluster/echoserver --max-items 3
{
    "ScalingActivities": [
        {
            "ActivityId": "54bf35c4-c4fa-43a8-9f8b-b87dae42c230",
            "ServiceNamespace": "ecs",
            "ResourceId": "service/fargate-cluster/echoserver",
            "ScalableDimension": "ecs:service:DesiredCount",
            "Description": "Setting min capacity to 1 and max capacity to 10",
            "Cause": "scheduled action name my-recurring-action2 was triggered",
            "StartTime": "2020-11-06T10:44:03.493000+09:00",
            "EndTime": "2020-11-06T10:44:03.534000+09:00",
            "StatusCode": "Successful",
            "StatusMessage": "Successfully set min capacity to 1 and max capacity to 10"
        },
        {
            "ActivityId": "bee13543-c633-48f4-b683-8a5fd5780ed2",
            "ServiceNamespace": "ecs",
            "ResourceId": "service/fargate-cluster/echoserver",
            "ScalableDimension": "ecs:service:DesiredCount",
            "Description": "Setting desired count to 5.",
            "Cause": "minimum capacity was set to 5",
            "StartTime": "2020-11-06T10:40:49.312000+09:00",
            "EndTime": "2020-11-06T10:41:59.274000+09:00",
            "StatusCode": "Successful",
            "StatusMessage": "Successfully set desired count to 5. Change successfully fulfilled by ecs."
        },
        {
            "ActivityId": "59fc0ec8-1d66-4c5c-9d45-ab0ed36bcf5e",
            "ServiceNamespace": "ecs",
            "ResourceId": "service/fargate-cluster/echoserver",
            "ScalableDimension": "ecs:service:DesiredCount",
            "Description": "Setting min capacity to 5 and max capacity to 20",
            "Cause": "scheduled action name my-recurring-action1 was triggered",
            "StartTime": "2020-11-06T10:40:48.815000+09:00",
            "EndTime": "2020-11-06T10:40:48.840000+09:00",
            "StatusCode": "Successful",
            "StatusMessage": "Successfully set min capacity to 5 and max capacity to 20"
        }
    ],
    "NextToken": "eyJOZXh0VG9rZW4iOiBudWxsLCAiYm90b190cnVuY2F0ZV9hbW91bnQiOiAzfQ=="
}