From e2a6946b817c7ffa3c9dbd0c2fa17f293fe8e616 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 + } +}