🐈

【コスト削減】Terraformで少工数でECS タスクを自動で停止!

2024/07/24に公開

はじめに

社内業務システムなどでECSを夜間、休日止めたいケースは往々にしてあるかと思います。
ECSを止める方法はいくつかあるようなのですが、少工数の方法を探した結果、オートスケーリングを使用してECSを止める方法が良いと思いました。

他の方法

  1. EventBridge、Lambdaを使う
    一番紹介されている記事が多い気がします。
    実際に作っていないので分からないのですが、オートスケーリングよりは工数掛かりそうな気がします。
  2. CloudWatch、EventBridge、SSMオートメーションを使う
    SSMオートメーション[1]は、タスクの実行をしてくれる機能です。
    デフォルトでECSのタスク停止、開始をしてくれるSSMオートメーションは用意されていないので、自分でカスタムする必要があります。
    今回は少工数でやりたいので、この方法も却下としました。

オートスケーリングを使用してECSタスクを自動停止する

今回は、平日の9時00分にタスクをもとに戻し、平日の20:00にタスクを0にしたいと思います。
コードは以下です。

auto_scaling.tf
# ECSのオートスケーリング
resource "aws_appautoscaling_target" "ecs_autoscaling_target" {
  service_namespace  = "ecs"
  scalable_dimension = "ecs:service:DesiredCount"

  # 紐付けるECSサービス
  resource_id = "service/${aws_ecs_cluster.cluster.name}/${aws_ecs_service.service.name}"

  # 最小タスク数と最大タスク数
  min_capacity = 1
  max_capacity = 2

  depends_on = [aws_ecs_service.service]
}

# =============ここから下がメインの処理=============

# 平日の9時00分にタスクを元に戻す
resource "aws_appautoscaling_scheduled_action" "up-ecs-task-scheduled-action" {

  name               = "up-ecs-task-scheduled-action"
  service_namespace  = aws_appautoscaling_target.ecs_autoscaling_target.service_namespace
  resource_id        = aws_appautoscaling_target.ecs_autoscaling_target.resource_id
  scalable_dimension = aws_appautoscaling_target.ecs_autoscaling_target.scalable_dimension
  schedule           = "cron(0 9 ? * MON-FRI *)"
  timezone           = "Asia/Tokyo"

  scalable_target_action {
    max_capacity = aws_appautoscaling_target.ecs_autoscaling_target.max_capacity
    min_capacity = aws_appautoscaling_target.ecs_autoscaling_target.min_capacity
  }
}

# 平日の20時00分にタスクを0にする
resource "aws_appautoscaling_scheduled_action" "down-ecs-task-scheduled-action" {

  name               = "down-ecs-task-scheduled-action"
  service_namespace  = aws_appautoscaling_target.ecs_autoscaling_target.service_namespace
  resource_id        = aws_appautoscaling_target.ecs_autoscaling_target.resource_id
  scalable_dimension = aws_appautoscaling_target.ecs_autoscaling_target.scalable_dimension
  schedule           = "cron(0 20 ? * MON-FRI *)"
  timezone           = "Asia/Tokyo"

  scalable_target_action {
    min_capacity = 0
    max_capacity = 0
  }
}

それぞれの処理について説明します。

  • aws_appautoscaling_target[3]は、オートスケーリングの対象となるリソースを定義してます
  • aws_ecs_cluster.cluster.nameは任意のECSクラスターのname,aws_ecs_service.service.nameは任意のECSサービスのnameです
  • 最小タスク数と最大タスク数は任意の値です
  • aws_appautoscaling_scheduled_action[4]は、いつどんなスケーリングをするかを定義しています
  • scheduleは、cron式でそれぞれ、月〜金の9:00、20:00を指しています
  • タスクをもとに戻すscalable_target_actionは、aws_appautoscaling_target.ecs_autoscaling_targetで定義したmax_capacityとmin_capacityをそれぞれ定義することにより、任意(本来定義している)のオートスケーリングをしています。
  • タスクを0にするscalable_target_actionは、タスク止めたいので単純に0としています。

おわりに、、、

弊社では、IaCを用いてインフラを構築しており、今回紹介したようなコスト削減の取り組みも行っております。
ご興味のある方やご依頼を希望される企業様は、ぜひ弊社のホームページよりお問い合わせください。
https://x-point-1.net/

脚注
  1. https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/scheduling-automations.html ↩︎

  2. https://docs.aws.amazon.com/ja_jp/systems-manager-automation-runbooks/latest/userguide/start-stop-aurora-cluster.html ↩︎

  3. https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/appautoscaling_target ↩︎

  4. https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/appautoscaling_scheduled_action ↩︎

エックスポイントワン技術ブログ

Discussion