💭

Amazon EventBridge Schedulerで開発環境のECSタスクを夜間停止してコスト削減した話

2023/08/28に公開

はじめに

こんにちは。アスエネ株式会社のVPoEの石坂です。
Amazon EventBridge Schedulerを知り、触ってみたので記事としてまとめます。

Amazon EventBridge Schedulerとは

Amazon EventBridgeをスケジュール実行できるようにしたものです。
そもそものAmazon EventBridgeは公式ページに以下のように記載があります。

EventBridge は、イベントを使用してアプリケーションコンポーネントを接続するサーバーレスサービスです。
これにより、スケーラブルなイベント駆動型アプリケーションを簡単に構築できます。
これを使用して、自社開発アプリケーション、AWS サービス、サードパーティソフトウェアなどのソースから組織全体のコンシューマアプリケーションにイベントをルーティングできます。
EventBridge では、イベントの取り込み、フィルタリング、変換、配信をシンプルかつ一貫性のある方法で行うことができるため、新しいアプリケーションをすばやく構築できます。

やりたいこと

  • 平日の夜間と土日は特定のECSサービスの必要タスク数を0にする
  • 平日の朝には特定のECSサービスの必要タスク数を規定数にする

やってみる

ロールとポリシーの作成

スケジュールを作成する過程でロールの設定が必要になってくるので、予め作成しておきます。

Trust Policy(信頼ポリシー)を下記のようにして、schedulerがロールを取得できるようにしておきます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement",
            "Effect": "Allow",
            "Principal": {
                "Service": "scheduler.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

また、このロールにポリシーをアタッチします。
今回はタスク数の更新が目的のため、サービス更新権限を付与しておきます。

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Action": "ecs:UpdateService",
			"Resource": "arn:aws:ecs:ap-northeast-1:000000000000:service/hoge-hoge-dev/hoge-webapp-service"
		}
	]
}

これで前準備は終わりです。実際にスケジュールを作成していきます。

平日の23:59にのみ起動するようにしています。
cron式で記述します。記述の仕方の補足資料のリンクが設置されている部分は親切ですね。

次に対象操作を作成します。
すべての AWS のサービス > Amazon ECS > UpdateService を選択しつつ下記のように
DesiredCount(タスク必要数)を0にしておきます。

{ 
    "Service": "hoge-webapp-service",
    "Cluster": "hoge-hoge-dev", 
    "DesiredCount": 0 
 }

最後に作成しておいたロールを選択して、完了です。

無事に動作してくれました。

以上と同じ手順で平日8時に起動するスケジュールイベントを作成することで
平日の8-24時のみ稼働するECSサービスになります。

注意点

エラーログはCloudTrailから確認します。最初にポリシーの設定が間違っていたときにエラーログを見つけられず困惑しましたが、CloudTrailにありました。
成功した際のServiceUpdateログは ECSのイベントタブから確認できます。

さいごに

さくっと設定が終わる部分でAWSコストの削減につながるのでおすすめです。
0時〜8時まで停止すれば24時間稼働と比較して、稼働時間が2/3になるのでコストは3割減になります。
大きいですね。

参考

https://dev.classmethod.jp/articles/amazon-eventbridge-scheduler-ecs-stop-start/

Discussion