PLAY DEVELOPERS BLOG

HuluやTVerなどの日本最大級の動画配信を支える株式会社PLAYが運営するテックブログです。

HuluやTVerなどの日本最大級の動画配信を支える株式会社PLAYが運営するテックブログです。

AWSのランニングコストを削減しよう! EventBridgeを使った定期停止・起動について

ソリューション技術部の赤澤です。
普段はAWSでの環境構築などを担当しています。

環境構築にあたって、話題によくあがるのがコストについてです。
所謂本番/開発環境のような環境を運用している場合、 AWSは主にリソースの稼働時間に対してコストが掛かってくるため、開発環境については不要な時間は停止させてコストを抑えたいという要望がよくあります。

このようにリソースに対して定期的なスケジュールを実施させたい場合に何かいい手段は無いかと検討していたところ、Amazon EventBridgeを利用するのがシンプルでよさそうだったので試してみました。

Amazon EventBridgeとは、外部SaaSやAWSサービスをイベントを通じて繋げることができるサービスです。
https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-what-is.html

EventBridge は、イベントを使用してアプリケーションコンポーネントを接続するサーバーレスサービスです。これにより、スケーラブルなイベント駆動型アプリケーションを簡単に構築できます。

今回はAmazon EventBridgeのRulesにあるスケジュール機能を使います。 https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-create-rule-schedule.html

ルールは、イベントに対応して実行したり、一定の時間間隔で実行したりすることができます

設定方法ですが、このような使い回しが効くようなシステムはCloudFormationテンプレートにすると便利ですのでCloudFormationを利用して設定していきます。

CloudFormationについてはこちらの記事がわかりやすいです。
https://www.ctc-g.co.jp/solutions/cloud/column/article/07.html

Auroraを例に実際に定期停止、起動を設定していきます。

CloudFormationテンプレート作成

CloudFormationに使うYAMLテンプレートを作成します。

以下が今回作成するテンプレートの設定内容です。
任意のAuroraクラスターを、平日(月曜~金曜)9:00〜23:00のみ稼働させる。

指定するパラメーターは以下の通り。

  • "AuroraCluster" にて任意のAuroraクラスター名を指定
  • "AuroraStopSchedule" にて 月~金 23:00 の時刻を指定
  • "AuroraStartSchedule" にて 月~金 9:00 の時刻を指定

この内容をCloudFormationテンプレートにします。

AWSTemplateFormatVersion: "2010-09-09"

Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
      -
        Parameters:
          - AuroraCluster
          - AuroraStopSchedule
          - AuroraStartSchedule

Parameters:
  AuroraCluster:
    Type: String
    Description: Enter aurora cluster name.

  AuroraStopSchedule:
    Type: String
    Default: "cron(0 14 ? * MON-FRI *)"
    Description: Enter stop schedule UTC.

  AuroraStartSchedule:
    Type: String
    Default: "cron(0 0 ? * MON-FRI *)"
    Description: Enter start schedule UTC.

Resources:

  # IAM Policy
  SSMAutoPolicy:
    Type: AWS::IAM::ManagedPolicy
    Properties:
      ManagedPolicyName: eventbridge-rules-aurora-policy
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Action:
              - "rds:StartDBCluster"
              - "rds:StopDBCluster"
              - "rds:DescribeDBClusters"
              - "rds:DescribeDBInstances"
            Resource:
              - "*"

  # IAM Role
  EventBridgeRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: eventbridge-rules-aurora-role
      Path: /
      ManagedPolicyArns:
        - !Ref SSMAutoPolicy
        - arn:aws:iam::aws:policy/service-role/AmazonSSMAutomationRole
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - "events.amazonaws.com"
                - "ssm.amazonaws.com"
                - "rds.amazonaws.com"
            Action:
              - "sts:AssumeRole"

  # EventBridge Rules
  AuroraStop:
    Type: AWS::Events::Rule
    Properties:
      State: ENABLED
      Name: !Sub Stop-Aurora-${AuroraCluster}
      ScheduleExpression: !Ref AuroraStopSchedule
      Targets:
        - Arn: arn:aws:ssm:ap-northeast-1::automation-definition/AWS-StartStopAuroraCluster:$DEFAULT
          Id: TargetStopAuroraCluster
          RoleArn: !GetAtt EventBridgeRole.Arn
          Input: !Sub '{"Action":["Stop"],"ClusterName":["${AuroraCluster}"]}'

  AuroraStart:
    Type: AWS::Events::Rule
    Properties:
      State: ENABLED
      Name: !Sub Start-Aurora-${AuroraCluster}
      ScheduleExpression: !Ref AuroraStartSchedule
      Targets:
        - Arn: arn:aws:ssm:ap-northeast-1::automation-definition/AWS-StartStopAuroraCluster:$DEFAULT
          Id: TargetStartAuroraCluster
          RoleArn: !GetAtt EventBridgeRole.Arn
          Input: !Sub '{"Action":["Start"],"ClusterName":["${AuroraCluster}"]}'

CloudFormation実行

作成したテンプレートからCloudFormationを実行し、EventBridge Rulesを設定します。
AWSマネージメントコンソールからCloudFormationを検索し、"スタックの作成" を選択。

"テンプレートの準備完了"、"テンプレートファイルのアップロード" にチェックを入れ、
"ファイルの選択" で上記で作成したYAMLテンプレートをアップロードします。

"スタックの名前" にわかりやすいスタック名を入力し、"AuroraCluster" に対象とするAuroraクラスター名を入力します。
"AuroraStopSchedule", "AuroraStartSchedule" はそれぞれUTCにて、Aurora停止時間(月〜金 23:00)、起動時間(月〜金 9:00)がCron式で入力されています。
任意の時間に書き換えも可能です。

しばらく待つと、

設定できたようです。
EventBridge側も確認します。

AWSマネージメントコンソールからEventBridgeを検索。
"ルール" を選択します。

Auroraの停止と起動のルールが作成されているようです。
ルールの内容についてはそれぞれ選択すると確認ができます。

まとめ

夜間休日停止のスケジュールを組んでおけば、常時稼働の半分程度にランニングコストを抑えることができます。

今回はAuroraを例にしましたが、EC2も同じ様に設定ができます。
簡単に設定できますので是非利用してみてください。