From 00f978bb73992e5c6790f4bc62f3c63b1f2f1353 Mon Sep 17 00:00:00 2001 From: Andy Hunt Date: Tue, 25 Feb 2025 17:07:58 +0000 Subject: [PATCH] .review_apps: use app autoscaling to turn review apps off at night, weekends AWS App Autoscaling allows us to scale AWS ECS services up and down on a schedule. To save money, we want to turn them off at 6pm each day, and then back on at 8am Monday to Friday. The result should be them being turned off from 6pm to 8am Monday to Friday, and all day on weekends. --- .review_apps/app_autoscaling.tf | 38 +++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 .review_apps/app_autoscaling.tf diff --git a/.review_apps/app_autoscaling.tf b/.review_apps/app_autoscaling.tf new file mode 100644 index 000000000..f90edee00 --- /dev/null +++ b/.review_apps/app_autoscaling.tf @@ -0,0 +1,38 @@ +resource "aws_appautoscaling_target" "review_app" { + service_namespace = "ecs" + resource_id = "service/${data.terraform_remote_state.review.outputs.ecs_cluster_id}/${aws_ecs_service.app.name}" + scalable_dimension = "ecs:service:DesiredCount" + + max_capacity = 1 + min_capacity = 1 +} + +resource "aws_appautoscaling_scheduled_action" "shutdown_at_night" { + name = "pr-${var.pull_request_number}-shutdown-at-night" + + service_namespace = aws_appautoscaling_target.review_app.service_namespace + resource_id = aws_appautoscaling_target.review_app.resource_id + scalable_dimension = aws_appautoscaling_target.review_app.scalable_dimension + + schedule = "cron(0 18 * * ? *)" # daily at 1800 + + scalable_target_action { + min_capacity = 0 + max_capacity = 0 + } +} + +resource "aws_appautoscaling_scheduled_action" "startup_weekday_mornings" { + name = "pr-${var.pull_request_number}-startup-weekday-mornings" + + service_namespace = aws_appautoscaling_target.review_app.service_namespace + resource_id = aws_appautoscaling_target.review_app.resource_id + scalable_dimension = aws_appautoscaling_target.review_app.scalable_dimension + + schedule = "cron(0 8 ? * MON-FRI *)" # Monday-Friday at 0800 + + scalable_target_action { + min_capacity = 1 + max_capacity = 1 + } +}