見出し画像

『あんさんぶるスターズ!! Music』におけるカレンダースケーリングの導入

この記事は「Cacalia Studio アドベントカレンダー 2021 エンジニア版」の19日目の記事です。

こんにちは、HappyElements 株式会社でインフラ運用を担当しているN.Sです。
本記事では、あんさんぶるスターズ!! Music 日々の運用まわりでの改善について紹介します。

あんさんぶるスターズ!! Music のAWS構成についてはこちらを参考にしてください。
https://aws.amazon.com/jp/solutions/case-studies/happyelements/

〇自動スケーリング運用について

AWS Auto Scaling には自動スケーリングする機能が付いてます。

オートスケーリング

(CPU使用率・ネットワーク・リクエスト数)が閾値になるとインスタンス数を増やす。というもの

画像1

スケジュールスケーリング

指定日時にインスタンス数を設定する。というもの

画像2

これらを駆使して、安定運用になるかと思っていたのですが...

〇運用中の困りごと

● 国民の休日(土日祝)では、平日に比べてアクセス量が多い。
高負荷状態の通知が頻発してしまうため、私的には心が休まらない。

● アイドルの誕生日は色々な特典があって平日に比べてアクセス量が多い。
スケジュールスケーリングがあるのでは?と思われますが、登録数が多くなると状況が分かりづらくなります。

要件

● 土日祝、アプリ特有の日はリソースを適切に増加させたい。
● 見やすい、わかりやすい様に管理したい。(イメージはカレンダー)

〇解決策

こちらの記事を参考にさせて頂きました。
AWS Systems Manager Change Calendarで祝日を設定したジョブ実行が可能になりました

▼イメージ図

画像3

手順1. Googleカレンダー編

1.Googleカレンダーを開いて、設定(歯車)

画像4

2.新しいカレンダーを作成する。

画像5

3.再度、Googleカレンダーの設定から、日本の祝日にチェックする。

画像6

4.日本の祝日を選択し、iCal 形式をダウンロードする。

画像7

5.ダウンロードしたファイルをテキストで開き X-WR-TIMEZONE の値を Asia/Tokyo に変更して保存。

BEGIN:VCALENDAR
PRODID:-//Google Inc//Google Calendar 70.9054//EN
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:PUBLISH
X-WR-CALNAME:日本の祝日
X-WR-TIMEZONE:UTC -> Asia/Tokyo
 :(省略)

6.新規作成したカレンダーに日本の祝日iCalをインポートする。

画像8

7.その他、新規作成したカレンダーに予定を登録する。

画像9

8.新規作成したカレンダーをエクスポートする。

画像10

※zipファイルとなっているので、使うときは解凍が必要

手順2. AWS Systems Manager Change Calendar編

1.AWSコンソールから、Systems Manager > カレンダーを変更 > カレンダーを作成 で、エクスポートしたファイルを選択し、DEFAULT_OPENのまま「カレンダーを作成」

画像11

2.説明(タブ) > Calender use(▼) > AWS CLI(コマンドライン)をコピーする。

画像12

手順3. 実行方法について

予定が入っている分に関しては、CLOSEが返ってくる。未予定部分はOPENとなるので確認します。

1.カレンダーで設定している日本の祝日を指定して実行した場合

11/23(祝日)
$ aws ssm get-calendar-state --calendar-names arn:aws:ssm:ap-northeast-1:1234567890:document/AWS2DAY --region ap-northeast-1 --at-time "2021-11-23T00:00:00+09:00" --query 'State' --output text
CLOSED

2.カレンダーで設定している平日を指定して実行した場合

11/24(水)
$ aws ssm get-calendar-state --calendar-names arn:aws:ssm:ap-northeast-1:1234567890:document/AWS2DAY --region ap-northeast-1 --at-time "2021-11-24T00:00:00+09:00" --query 'State' --output text
OPEN

3.スケジュールスケーリングは利用せず、cronでLambdaを実行する処理に変更します。

● AWS 管理ポリシー『AmazonSSMReadOnlyAccess』を付ける。

python
import boto3
from datetime import datetime, timedelta, timezone
ssm = boto3.client('ssm')
def lambda_handler(event, context):
   try:
       # holidays
       JST = timezone(timedelta(hours=+9), 'JST')
       nowtime = datetime.now(JST).isoformat(timespec="seconds")
       print(nowtime)
       response = ssm.get_calendar_state(
           CalendarNames=[
               'AWS2DAY',
           ],
           AtTime=nowtime
       )
       print(response['State'])
       if response['State'] == 'CLOSED':
           print("休日or誕生日な為、リソースを通常より多くする処理")
   except Exception as e:
       print(e)

CLOSE時はカレンダーで設定した土日祝・アプリ特有の日の為、ここでリソースの調整を行います。

〇まとめ

AWS Systems Manager Change CalendarとLambdaを組み合わせることで、非常に簡単に『日本の祝日・土日』『アプリ特有の日』の対応ができました♪

--

Happy Elements カカリアスタジオでは
いっしょに「熱狂的に愛されるコンテンツ」をつくっていただけるメンバーを大募集中です!

もし弊社にご興味持っていただけましたら、是非一度
下記採用サイトをご覧ください!