Help us understand the problem. What is going on with this article?

AutoScalingのスケジュール【備忘録】

More than 1 year has passed since last update.

はじめに

AWSを利用しているとよく使うであろうアプリケーションの Auto Scalingですが、スケジュールで増減させる設定を追加したときの備忘録です。
※EC2のAuto Scalingについては触れません。

概要

対象サービス

Resource type Possible values Describe
Amazon ECS サービス ecs:service:DesiredCount ECSサービスの希望タスク数
スポットフリートリクエスト ec2:spot-fleet-request:TargetCapacity スポットフリートのリクエスト数
Amazon EMR クラスター elasticmapreduce:instancegroup:InstanceCount EMRインスタンスグループのインスタンス数
AppStream 2.0 のフリート appstream:fleet:DesiredCapacity AppStream 2.0フリートの希望容量
DynamoDB テーブルとグローバルセカンダリインデックス dynamodb:table:ReadCapacityUnits DynamoDBテーブルのプロビジョニングされた読み取りキャパシティーユニット
dynamodb:table:WriteCapacityUnits DynamoDBテーブルのプロビジョニングされた書き込みキャパシティーユニット
dynamodb:index:ReadCapacityUnits DynamoDBグローバルセカンダリインデックスのプロビジョニングされた読み取りキャパシティーユニット
dynamodb:index:WriteCapacityUnits DynamoDBグローバルセカンダリインデックスのプロビジョニングされた書き込みキャパシティーユニット
Aurora レプリカ rds:cluster:ReadReplicaCount Aurora DBクラスター内のAuroraレプリカの数。Aurora MySQL互換版およびAurora PostgreSQL互換版で利用可能
Amazon SageMaker sagemaker:variant:DesiredInstanceCount Amazon SageMakerモデルのエンドポイントバリアントのEC2インスタンスの数
独自のアプリケーションまたはサービスにより提供されるカスタムリソース(詳細 custom-resource:ResourceType:Property 独自のアプリケーションまたはサービスによって提供されるカスタムリソース用のスケーラブルなディメンション

機能

Scaling type API Describe
ターゲット追跡スケーリング PutScalingPolicy 特定の CloudWatch メトリクスのターゲット値に基づいてリソースをスケーリングします。TargetTrackingScalingPolicyConfiguration
ステップスケーリング PutScalingPolicy 超過アラームのサイズによって異なる一連のスケーリング調整値に基づいてリソースをスケーリングします。StepScalingPolicyConfiguration
スケジュールスケーリング PutScheduledAction 日付と時刻に基づいてリソースをスケーリングします。

スケジュールによるAuto Scaling

aws application-autoscaling put-scheduled-action...にて設定できる。

パラメータ

設定時に必須のパラメータは下記4つ

  • --service-namespace
  • --scheduled-action-name
  • --resource-id
  • --scalable-dimension

以下は利用可能なパラメータ

  • --schedule
  • --start-time
  • --end-time
  • --scalable-target-action
  • --cli-input-json
  • --generate-cli-skeleton

awscliコマンドリファレンス

スケジュール設定

スケジュールの設定方式ですが、下記パラメータにて設定していきます。
--schedule (string)

Expression Format
日時指定 at(yyyy -mm -dd T*hh* :mm :ss )
Rate式 rate(value unit )
Cron式 cron(fields )

e.g.)
日時指定

date schedule
aws application-autoscaling put-scheduled-action --service-namespace ecs --scheduled-action-name ecs-task-run --schedule "at(2019-06-02T18:00:00)" --resource-id service/hoge-cluster/fuga-task --scalable-dimension ecs:service:DesiredCount --scalable-target-action MinCapacity=4

Rate式

rate schedule
aws application-autoscaling put-scheduled-action --service-namespace ec2 --scheduled-action-name hourly-spot-request --schedule "rate(1 hour)" --resource-id spot-fleet-request/hogehogefugafuga --scalable-dimension ec2:spot-fleet-request:TargetCapacity --scalable-target-action MinCapacity=2

cron式

cron schedule
aws application-autoscaling put-scheduled-action --service-namespace dynamodb --scheduled-action-name my-recurring-action --schedule "cron(30 15 * * ? *)" --resource-id table/HogeTable --scalable-dimension dynamodb:table:ReadCapacityUnits --scalable-target-action MinCapacity=8

RateやCronについてはAWS独自の書き方なので公式が一番詳細に書いてあり、わかりやすかったです。

おしまい

タスクを定期的にスケールアウト/インさせたかったため今回は追加しました。古いコンテナをkillしたかったのですが、思い通りにスケールインしてくれないので原因は調査中です。

おまけ

こんなスケジュールを追加してみたのですが、上記のとおり落ちないコンテナくんがいるのでふむ…って感じです。

ecs_task.tf
resource "aws_appautoscaling_target" "hogehoge-task" {
  max_capacity       = 10
  min_capacity       = 2
  resource_id        = "service/hogecluster/hogehoge-task"
  role_arn           = "${var.ecs_iam_role}"
  scalable_dimension = "ecs:service:DesiredCount"
  service_namespace  = "ecs"
}

resource "aws_appautoscaling_scheduled_action" "hogehoge-task-out" {
  name               = "hogehoge-task-scale-out"
  service_namespace  = "${aws_appautoscaling_target.hogehoge-task.service_namespace}"
  resource_id        = "${aws_appautoscaling_target.hogehoge-task.resource_id}"
  scalable_dimension = "${aws_appautoscaling_target.hogehoge-task.scalable_dimension}"
  schedule           = "cron(0 * * * ? *)"

  scalable_target_action {
    min_capacity = 4
    max_capacity = 10
  }
}

resource "aws_appautoscaling_scheduled_action" "hogehoge-task-in" {
  name               = "hogehoge-task-scale-in"
  service_namespace  = "${aws_appautoscaling_target.hogehoge-task.service_namespace}"
  resource_id        = "${aws_appautoscaling_target.hogehoge-task.resource_id}"
  scalable_dimension = "${aws_appautoscaling_target.hogehoge-task.scalable_dimension}"
  schedule           = "cron(15 * * * ? *)"

  scalable_target_action {
    min_capacity = 2
    max_capacity = 10
  }
}

スケジュールサービスで楽できると思ったんだけどな。。

KsntsTt
パワー系インフラエンジニア
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away