AWS節約術 EC2を指定時刻に自動シャットダウン&起動する(EventBridge scheduler)

Page content

1.目的

AWSのコスト節約のためにEC2インスタンスの夜間停止、早朝起動をスケジュール実行します。

停止時間は0:00~06:00(6時間)とします。この場合、24時間稼働に比べてコストが3/4になります。

2.環境

  • 2023/12時点でのAWS

3.手順

a)IAMロール準備

EC2の起動/停止を行うためのIAMロールを用意します。

「IAM」で検索し、「IAM」サービスコンソールに接続します。

「アクセス管理」>「ロール」>「ロールを作成」を選択します。

信頼されたエンティティタイプは「カスタム信頼ポリシー」を選択します。

カスタム信頼ポリシーに下記の内容を貼り付けます。これにより、「誰が」「どのAWSサービスの」「どのリソースに対して」「どんな操作を」「許可する(許可しない)」、といったことを定義することができます。

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

内容を簡単に解説すると、

  • Version…ポリシー言語のバージョンを定義(2012-10-17は現行バージョンを示しています)
  • Statement…「ここに色々書きますよー!」の意味
  • Effect…最終的に許可するのか拒否するのか。ここではAllowなので許可。
  • Principal…「誰が?」の部分。“誰"はAWSアカウントやIAMユーザー、サービスなど色々指定可能。
  • Service…「誰が?」としてscheduler.amazonaws.com(=EventBridge Schedulerサービス)を指定している。
  • Action…「どんな操作を?」の部分。ここでは、STSサービスを通じてAssumeRole(一時的に権限を付与)してOKよ~としています。

詳しい解説は公式にもあるので、興味がある方は読んでみるとよいと思います。

「次へ」を実行します。

許可ポリシーで「ec2full」を検索し、「AmazonEc2FullAccess」を選択した状態で「次へ」

ロールの詳細でロール名を指定します。

許可ポリシーに「AmazonEc2FullAccess」があることを確認し「ロールを作成」

これで自動停止/起動をするためのIAMロールが用意できました。このIAMロールを使って、スケジュールを設定していきます。

b)スケジューラの作成(shutdown)

「EventBridge scheduler」を検索し、サービス画面を起動します。

EventBridge schedulerはすべてのAWSサービスでイベントやタスクを作成、開始、管理できるスケジューリングサービスです。

「スケジュールを作成」を実行します。

スケジュール名の設定をします。

「定期的なスケジュール」「cronベースのスケジュール」を選択し、今回は0時0分に指定します。

フレックスタイムウィンドウはOFFでも良いのですが、ここでは15分を指定しています。これにより、00:00-00:15のどこかで実行されることになります。

フレックスタイムウィンドウをONにすると、デフォルトのクォータにひっかからないようにいい感じに実行時間を変更してくれる(らしい)です。

今回は1つのスケジュールのみ作成しているので問題にはなりませんが、数が増えればクォータに引っかかるリスクは上がります。特に厳密な時間処理が不要な場合は、フレックスタイムウィンドウをONにした方が処理が安定するでしょう。

タイムゾーンを指定します。

ターゲットの詳細では、「すべてのAPI」から「Amazon EC2」を指定します。

さらに「stop」で検索することで停止用のAPI「StopInstances」が表示されるので、こちらを選択します。

APIには対象のEC2がどれか?を指示する必要があるので、対象EC2のインスタンスIDを入力します。

このあたりはデフォルトのままにしました。

アクセス許可の画面では、先ほど作成したIAMロールを指定します。

確認画面でざっと設定を再確認します。

スケジュールを有効化します。

これでシャットダウンのスケジュールは完成です。

c)スケジューラの作成(起動)

起動とシャットダウンではAPIが異なるだけです。起動の場合はAPIが「StartInstances」になります。

最後にステータスが「有効」になっていることを確認して設定終了です。

あとは指定時刻にEC2インスタンスが停止/起動することを確認できればOKです。

4.まとめ

EventBridge schedulerすごいですね。簡単にスケジュールタスクを設定することができました。

環境でのEC2の状態(起動停止)は外部からの監視通知や、CloudTailによる証跡ログ取得によって確認することになると思います。その辺りは後日別記事にまとめようと思います。