AWS Auto Scalingのスケジュール設定作業を効率化した話
1. はじめに
こんにちは、くふうAIスタジオの@fukajunです。
トクバイのサービスはECSを利用して運用されています。サーバーの負荷に応じてオートスケーリングを行う一方で、特定の時間帯やTV放映、CM、キャンペーンなど予測可能な負荷には、スケジュールを組んでスケール調整をしています。これらの設定は、AWSのApplication Autoscalingを活用し、Terraformで管理されていました。
当初は、Terraformによるスケーリング設定が少数であれば問題ありませんでしたが、件数が増加するにつれて修正作業が困難になりました。特に長文化してしまう設定を一覧で視認しにくくなる点や、予測される負荷の重なりがあると、修正時間とレビュー作業が増えるという課題がありました。
この記事では、これらの課題を解決するためにスクリプトを活用した具体的な方法と、その結果についてご紹介します。
2.やったこと
私たちは、Terraformファイルを作成するための簡単なDSLをRubyで作成しました。これにより、設定作業が効率的になりました。主な工夫としては、1日の定期的スケールをcron記法で、一時的な日時指定のスケールにはat要素を利用して記述する方式を導入しました。
実際のDSL定義例) あるクラスターをスケールインスケールアウトするための設定
setting("cluster-name", 20, 180) do
cron 'scale-out-morning-user-increase', 80, 180, 6, 50, "朝のユーザー増加対応"
cron 'scale-out-morning-push', 120, 180, 7, 45, "朝push暖気"
cron 'scale-in-morning-push', 20, 180, 9, 30, "朝push暖気解除"
:
省略
:
cron 'scale-out-midnight-spike', 70, 180, 23, 45, "深夜スパイク対応"
cron 'scale-in-midnight-spike', 20, 180, 0, 30, "深夜スパイク対応解除"
at "scale-out-for-news", 120, 180, 2024, 9, 12, '?', 15, 45, "おいしいもの総選挙特集 9/12 15:50-19:00"
at "scale-in-for-news", 20, 180, 2024, 9, 12, '?', 19, 10, "おいしいもの総選挙特集 9/12 15:50-19:00"
:
省略
:
at "scale-out-for-variety-show", 120, 180, 2024, 10, 1, '?', 17, 10, "生活便利アプリ特集 10/17 17:19-17:30"
at "scale-in-for-variety-show", 20, 180, 2024, 10, 1, '?', 18, 00, "生活便利アプリ特集 10/17 17:19-17:30"
end
DLSから生成されたterraformでのapp autoscaling scheduled action
resource "aws_appautoscaling_target" "cluster-name" {
min_capacity = 20
max_capacity = 180
resource_id = "service/cluster-name/service-name"
scalable_dimension = "ecs:service:DesiredCount"
service_namespace = "ecs"
}
# Generate from bin/generate_ecs_ec2_scheduled_action
# 朝のユーザー増加対応
resource "aws_appautoscaling_scheduled_action" "cluster-name-time-based-scale-out-morning-user-increase" {
name = "bargain-backyard-v6-time-based-scale-out-morning-user-increase"
service_namespace = aws_appautoscaling_target.cluster-name.service_namespace
resource_id = aws_appautoscaling_target.cluster-name.resource_id
scalable_dimension = aws_appautoscaling_target.cluster-name.scalable_dimension
schedule = "cron(50 21 * * ? *)"
scalable_target_action {
min_capacity = 80
max_capacity = 180
}
}
# Generate from bin/generate_ecs_ec2_scheduled_action
# 朝push暖気
resource "aws_appautoscaling_scheduled_action" "cluster-name-time-based-scale-out-morning-push" {
name = "bargain-backyard-v6-time-based-scale-out-morning-push"
service_namespace = aws_appautoscaling_target.cluster-name.service_namespace
resource_id = aws_appautoscaling_target.cluster-name.resource_id
scalable_dimension = aws_appautoscaling_target.cluster-name.scalable_dimension
schedule = "cron(45 22 * * ? *)"
scalable_target_action {
min_capacity = 120
max_capacity = 180
}
}
:
省略
:
3. スクリプト導入による具体的な利点
可読性を改善
DSLの採用により、Terraform上で長かったコードを1スケジュール1行にまとめることができました。これにより、設定が何のスケジュールなのかが一目でわかるようになり、可読性が向上しました。
時間指定負荷の軽減
また、Terraformの設定でUTCを使用していた時間指定をJSTで記述できるようになりました。この変更により、ちょっとした時間指定のミスが減り、正確なスケジュール設定が可能になりました。
作業負担の低減
さらに、スクリプト導入後に追加したセルフチェック機能により、cronとatの設定がそれぞれの間で競合していないかを確認することが可能になりました。この機能は、レビュー作業の負担を軽減するのに役立っています。
実行時にcron設定とat設定でスケジュールが競合している場合に表示される
Conflict: cron設定:9時アクセス増対応 07:20, at設定:主婦が選ぶ便利アプリ特集 9/15 7:30-10:25 07:00
4. まとめ
今回の取り組みでは、スクリプトを活用することでスケジューリング設定の効率を改善し、チームの作業負担を少し軽減することができました。また、運用上のミスを減らす手助けにもなっており、今後もさらなる改善を目指していきます。
くふうAIスタジオでは、採用活動を行っています。
当社は「AX で 暮らしに ひらめきを」をビジョンに、2023年7月に設立されました。 (AX=AI eXperience(UI/UX における AI/AX)とAI Transformation(DX におけるAX)の意味を持つ当社が唱えた造語) くふうカンパニーグループのサービスの企画開発運用を主な事業とし、非エンジニアさえも当たり前にAIを使いこなせるよう、積極的なAI利活用を推進しています。 (サービスの一例:累計DL数1,000万以上の家計簿アプリ「Zaim」、月間利用者数1,600万人のチラシアプリ「トクバイ」等) AXを活用した未来を一緒に作っていく仲間を募集中です。 ご興味がございましたら、以下からカジュアル面談のお申込みやご応募等お気軽にお問合せください。 https://open.talentio.com/r/1/c/kufu-ai-studio/homes/3849