AWS節約術 EC2を指定時刻に自動シャットダウン&起動する(EventBridge scheduler)
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による証跡ログ取得によって確認することになると思います。その辺りは後日別記事にまとめようと思います。