『あんさんぶるスターズ!! Music』におけるカレンダースケーリングの導入
こんにちは、HappyElements 株式会社でインフラ運用を担当しているN.Sです。
本記事では、あんさんぶるスターズ!! Music 日々の運用まわりでの改善について紹介します。
あんさんぶるスターズ!! Music のAWS構成についてはこちらを参考にしてください。
〇自動スケーリング運用について
AWS Auto Scaling には自動スケーリングする機能が付いてます。
オートスケーリング
(CPU使用率・ネットワーク・リクエスト数)が閾値になるとインスタンス数を増やす。というもの
スケジュールスケーリング
指定日時にインスタンス数を設定する。というもの
これらを駆使して、安定運用になるかと思っていたのですが...
〇運用中の困りごと
-
国民の休日(土日祝)では、平日に比べてアクセス量が多い。
高負荷状態の通知が頻発してしまうため、私的には心が休まらない。 -
アイドルの誕生日は色々な特典があって平日に比べてアクセス量が多い。
スケジュールスケーリングがあるのでは?と思われますが、登録数が多くなると状況が分かりづらくなります。
要件
- 土日祝、アプリ特有の日はリソースを適切に増加させたい。
- 見やすい、わかりやすい様に管理したい。(イメージはカレンダー)
〇解決策
こちらの記事を参考にさせて頂きました。
AWS Systems Manager Change Calendarで祝日を設定したジョブ実行が可能になりました
▼イメージ図
手順1. Googleカレンダー編
-
Googleカレンダーを開いて、設定(歯車)
-
新しいカレンダーを作成する。
-
再度、Googleカレンダーの設定から、日本の祝日にチェックする。
-
日本の祝日を選択し、iCal 形式をダウンロードする。
-
ダウンロードしたファイルをテキストで開き 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
:(省略)
-
新規作成したカレンダーに日本の祝日iCalをインポートする。
-
その他、新規作成したカレンダーに予定を登録する。
-
新規作成したカレンダーをエクスポートする。
※zipファイルとなっているので、使うときは解凍が必要
手順2. AWS Systems Manager Change Calendar編
-
AWSコンソールから、Systems Manager > カレンダーを変更 > カレンダーを作成 で、エクスポートしたファイルを選択し、DEFAULT_OPENのまま「カレンダーを作成」
-
説明(タブ) > Calender use(▼) > AWS CLI(コマンドライン)をコピーする。
手順3. 実行方法について
予定が入っている分に関しては、CLOSEが返ってくる。未予定部分はOPENとなるので確認します。
- カレンダーで設定している日本の祝日を指定して実行した場合
$ 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
- カレンダーで設定している平日を指定して実行した場合
$ 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
- スケジュールスケーリングは利用せず、cronでLambdaを実行する処理に変更します。
- AWS 管理ポリシー『AmazonSSMReadOnlyAccess』を付ける。
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を組み合わせることで、非常に簡単に『日本の祝日・土日』『アプリ特有の日』の対応ができました♪
Discussion