🏄

メディア露出のビッグウェーブに乗るオートスケーリング計画

に公開

はじめに

こんにちは。レンティオでエンジニアやっている宮原です。

テレビで見かけたあのサービス。アクセスしてみたのにサイトにアクセスが集中してしまって画面が真っ白。
せっかく期待を持ったのに肝心のサイトが見られず「何じゃこりゃw」と目が点になってしまったことありませんか?

レンティオでは、そんな期待に応えられるようにメディア露出でアクセスが集中しても可能な限り閲覧できるサイトを目指しています。

ビッグウェーブに乗るには準備が大事

普段からオートスケーリングを使っていますが、何も準備なしでメディア露出してしまうと
サーバーの台数を増やす判断するまでのタイムラグ + 追いマシンが起動するまで数分…とオートスケーリングが間に合わず、サイトがダウンしてしまうことがありました。
そのため広報から連絡があったときは、オートスケーリングのスケジュール設定を利用して事前に備えています。

AWS ECS のオートスケーリングの設定

今のところ以下の条件でスケーリングポリシーを設定しています。
Number of tasksはサーバー台数に相当します。

Number of tasks to run for
2 - 20
Target metric Type Scaling mechanism
RequestCountPerTarget (250) Target Tracking Maintain target
ECSServiceAverageCPUUtilization (50%) Target Tracking Maintain target
ECSServiceAverageMemoryUtilization (85%) Target Tracking Maintain target

ちなみに ECSServiceAverageCPUUtilization(CPU使用率) を少し過剰めな 50% としている理由は、
スパイクアクセスが発生したらなるべく早めにオートスケールが効くようにしたいからです。

とある週のサーバー台数の波

メディア露出なしの週だとサーバー数(ALBHealthyHostCount)はこのような感じで増減しています。
ALBHealthyHostCountのグラフ

オートスケーリングのスケジュール設定

AWS CopilotのYAMLパッチ機能を使ってCloudFormationテンプレートをオーバーライドしてます。
この設定例は、2月4日(火)23:06〜0:00 放送のテレビに出演予定だったので、経験則で23:00からサーバー台数を増強し、翌0:10から通常のサーバー台数へ戻るよう設定してます。

cfn.patches.yml
- op: add
  path: /Resources/AutoScalingTarget/Properties/ScheduledActions
  value:
    - ScalableTargetAction:
        MaxCapacity: !If [IsProduction, 20, 5]
        MinCapacity: !If [IsProduction, 10, 1]
      Schedule: 'at(2025-02-04T23:00:00)'
      Timezone: 'Asia/Tokyo'
      ScheduledActionName:
        Fn::Join:
          - '-'
          - - !Ref AppName
            - !Ref EnvName
            - !GetAtt Service.Name
            - 'ScaleOut'
    - ScalableTargetAction:
        MaxCapacity: !If [IsProduction, 20, 5]
        MinCapacity: !If [IsProduction, 2, 1]
      Schedule: 'at(2025-02-05T00:10:00)'
      Timezone: 'Asia/Tokyo'
      ScheduledActionName:
        Fn::Join:
          - '-'
          - - !Ref AppName
            - !Ref EnvName
            - !GetAtt Service.Name
            - 'ScaleIn'

CloudWatch の反応

📺 公共放送のニュース番組 2023年7月20日(木) 8:15〜9:55

この時はまだオートスケーリングのスケジュール設定のやり方が固まっていない時期でした。
番組開始前に本番環境のサーバー台数 4 で待機して、番組終了後から 3、2 と通常に戻すようにセットしていました。

結果:ALBHealthyHostCountを見ると最大20までサーバー台数が激増してました。番組開始前のサーバー台数をもっと多めにしておきたかったという結果でした。

📻 関東地方を中心に放送されているラジオ番組 2024年10月31日(水) 11:00〜14:00

前回同番組に出演した時の反応が良かったので、その経験を踏まえてスケジュール設定できました。
番組開始前に本番環境のサーバー台数 4 で待機して、番組終了直後から通常の 2 に戻すようにセットしていました。

結果:ALBHealthyHostCountのグラフは残ってませんでしたが、RequestCountを見るとしっかりアクセスをさばいてたのがわかります。設定はちょうど良さそうでした。

📺 民放テレビ局の報道番組 2025年2月4日(火) 23:06〜0:00

自分が住んでる地域では映らないチャンネルの番組でしたが、YouTubeの番組予告だけ見てスケジュール設定しました。
番組開始前に本番環境のサーバー台数 10 で待機して、番組終了直後から通常の 2 に戻すようにセットしていました。

結果:ALBHealthyHostCountが最大14になってたのでサーバー台数もう少し多めにしておいたら良かったなという結果でした。

おわりに

レンティオでの仕事は、技術面はもちろんですが自分の実装した機能がビジネスに活かされていく様子が観察できるのもおもしろかったりします。

もう一つのビッグウェーブ(余談)

2025年現在 空前のAIブームということで、レンティオでも開発部社員で希望するメンバーにGitHub Copilot for Businessを導入しています。
CursorやClaude Codeなども話題になったと思ったら、すぐに社内で利用検証を始めてたりで盛り上がっています。

↓活用方法はまだ手探りですが、今回の記事執筆などをちょこっと手伝ってもらったりしてました。
記事のファイル名を決めているところ

この記事がお役に立てれば幸いです。

採用情報

レンティオでは絶賛、エンジニアを募集しています!
https://www.wantedly.com/companies/rentio

Discussion