ソリューション技術部の赤澤です。
普段は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も同じ様に設定ができます。
簡単に設定できますので是非利用してみてください。