この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。
プロジェクトで稼働しているEC2インスタンスの中には常時稼働している必要のないものがある場合があります。
例を挙げると、月末だけで稼働していればよかったり、日中の9:00~17:00だけ稼働していればよかったりする場合です。
インスタンスタイプにもよりますが、必要最低限の稼働時間を実現することでコストを抑えられるかもしれません。
今回の記事では、Amazon EventBridgeスケジューラを利用してEC2インスタンスを指定した時間に起動・停止する方法を紹介します。
EC2インスタンスの定期起動/停止をスケジュールしてみる
わたしは以前、指定した時間にEC2インスタンスを停止する仕組みをAmazon EventBridgeとAWS Lambdaを使って実現する記事を書きました。
Amazon EventBridgeスケジューラが登場したので、Amazon EventBridgeスケジューラを利用して、スケジュールを作成し、定期開始・停止する構築を実施してみます。
■Amazon EventBridge Schedulerとは
今回の構築のキモである"Amazon EventBridge Scheduler"とはどんなサービスなのでしょうか。
Amazon EventBridge Scheduler は、一元化されたマネージドサービスからタスクを作成、実行、管理できるサーバーレススケジューラーです。 EventBridge スケーラブルなスケジューラーでは、AWS 270を超えるサービスと6,000を超えるAPI操作を呼び出すことができる何百万ものタスクをスケジュールできます。
EventBridge Schedulerを使用すると、インフラストラクチャをプロビジョニングして管理したり、複数のサービスと統合したりすることなく、スケジュールを大規模に配信し、メンテナンスコストを削減できます。(AWS公式ドキュメント)より
Amazon EventBridge Schedulerの強みは指定した時間に任意のAPI実施スケジュールを、コンソール画面だけで作成できることですよね。
コードを書く必要がないので、AWS初心者にとっても簡単に作業の自動化が実現できます。
■構築の流れ
今回利用するAWSサービスと作成の流れは以下の通りです。
IAMポリシー作成
↓
IAMロール作成
↓
Amazon EventBridgeスケジュール作成
↓
動作確認
利用するサービスが少ないですね。
■IAMポリシー作成
はじめにIAMポリシーを作成します。Amazon EventBridgeがわたしたちに代わってEC2インスタンスを開始・停止するための権限ポリシーですね。
↓検索ウィンドウで[IAM]と検索し、Identity and Access Management (IAM)ダッシュボード画面に行きます。
↓左のナビゲーションペインから[ポリシー]をクリックし、[ポリシー作成]を押します。
↓[JSON]タブをクリックし、以下のドキュメントを貼り付けましょう。[AmazonEC2FullAccess]を利用してもいいのですが、EC2インスタンスの起動と停止しか実施しないので権限を制限しました。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"ec2:StartInstances",
"ec2:StopInstances"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
↓貼り付けが完了しましたら、[次のステップ:タグ]を押します。タグは任意で設定し、[次のステップ: 確認]をクリックします。
↓[名前]を入力し、内容に問題がなければ[ポリシーの作成]を押します。例)名前:saitou-ec2-stopstart-schedules-policy
IAMポリシーの作成は以上です。
■IAMロール作成
次にIAMロールを作成します。
↓Identity and Access Management(IAM)ダッシュボード画面で、左のナビゲーションペインから[ロール]をクリックし、[ロールを作成]を押します。
↓[信頼されたエンティティタイプ]で[カスタム信頼ポリシー]を選択し、以下のドキュメントを貼り付けます。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "scheduler.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
↓貼り付けが完了したら[次へ]をクリックします。フィルタウィンドウではじめに作成したIAMポリシー名を入力し、チェックボックスに☑を入れます。[次へ]をクリックします。
↓ロール名を入力し、内容に問題がなければ[ロールを作成]をクリックします。
例)ロール名:saitou-ec2-stopstart-schedules-role
IAMロールの作成は以上です。
■Amazon EventBridgeスケジュール作成
Amazon EventBridgeスケジューラでEC2を開始するスケジュールを作成します。
設定値は以下の通りです。
項目 | 設定値 |
---|---|
スケジュール名 | saitou-ec2-start-schedules |
説明 | 任意 |
スケジュールグループ | default |
頻度 | 定期的なスケジュール |
スケジュールの種類 | cron ベースのスケジュール |
cron式 | 20 9 ? * |
フレックスタイムウィンドウ | オフ |
↓サービス検索ウィンドウで[Amazon EventBridge]と検索し、[Amazon EventBridge Scheduler]をクリックします。
↓スケジュール名を入力します。
↓スケジュールパターンを選択し、cron式を定義します。cron式の例は以下の通りです。cronについてさらに知りたい方はAmazon公式ドキュメントをご確認ください。
状況 | 式 |
---|---|
毎日午前 10:15 (UTC) | cron(15 10 * * ? *) |
毎週月曜日から金曜日まで午後 6:00 | cron(0 18 ? * MON-FRI *) |
毎月 1 日の午前 8:00 | cron(0 8 1 * ? *) |
平日の 10 分ごと | cron(0/10 * ? * MON-FRI *) |
月曜日から金曜日まで午前 8:00 から午後 5:55 まで 5 分ごと | cron(0/5 8-17 ? * MON-FRI *) |
毎月最初の月曜日の午前 9 時 | cron(0 9 ? * 2#1 *) |
↓入植が完了したら、[次へ]をクリックします。
↓[ターゲットAPI]は[すべてのAPI]を選択肢、[EC2]をフィルタリングします。
↓[Amazon EC2]から[StrtInstances]を選択します。
↓[入力]欄の[InastanceIds]に起動したいEC2インスタンスのIDを入力します。
↓
↓[スケジュールを有効化]は任意で[有効化]のトグルをオンにしてください。スケジュールを用意するだけの場合はトグルをオフにしておきましょう。
↓[アクセス許可]で[既存のロールを使用]を選択し、用意したIAMロールを選択しましょう。選択したら、[次へ]をクリックしてください。
↓内容に問題がなければ、[スケジュールを作成]を押します。
EC2インスタンスを開始するスケジュールを作成しました。続いて、EC2インスタンスを停止するスケジュールを作成します。
構築手順自体はほぼ一緒なので、違う部分のみ紹介していきます。
↓Amazon EventBridgeスケジューラで[スケジュールを作成]をクリックします。
↓[スケジュール名]を入力します。
例)スケジュール名:saitou-ec2-stop-schedules
↓cron式を定義します。任意の時間を設定してください。わたしは開始時間の10分後に停止するよう設定しました。
例)cron:30 9 ? *
↓[ターゲットの詳細]で[Amazon EC2]から[StopInstances]を選択します。
↓[入力]で停止したいEC2インスタンスIDを入力します。
↓
↓使用するIAMロールは開始の時と同じIAMロールを使用します。
↓内容に問題なければ、[スケジュールの作成]をクリックします。
EC2インスタンスを開始・停止するスケジュールの作成は以上です。
■動作確認
今回の構築では該当のEC2インスタンスを[毎日9:20に開始]し、[毎日9:30に停止]するスケジュールを作成しました。
事前にEC2インスタンスを用意し、停止しておきました。9:20になったので見てみると、
開始が確認できました。CloudTrailを見てみると、
↓
EC2を開始するAPIが記録されていますね。
つぎに、9:30になったのでEC2インスタンスを見てみると、
停止が確認できました。CloudTrailを見てみると、
↓
EC2インスタンスを停止するイベントが記録されています。任意の時間でEC2インスタンスの開始と停止が確認できました。
今回の構築は以上です。
まとめ:Amazon EventBridgeスケジューラでEC2インスタンスの定期開始/停止を実施してみる
Amazon EventBridgeを利用すると、普段の作業の自動化に役立ち、かつコスト削減にもつながります。
以前はAmazon EventBridgeルールを利用して今回の仕組みを実現していましたが、Amazon EventBridgeスケジューラのリリースによってさらに簡単に自動化が実現できるようになりました。
ぜひ試してみてください。
参考リンク:AWS公式ドキュメント
↓ほかの協栄情報メンバーもAWS Lambdaに関する記事を公開しています。ぜひ参考にしてみてください。
■Amazon EventBridgeでセキュリティグループの変更を検知してみる(齊藤弘樹)
https://cloud5.jp/saitou-securitygroup-change-notification/
■EventBridgeとLambdaを使用してRDS自動停止を作成する(watanabe.r)
https://cloud5.jp/autostop-rds/
■RDS起動をEventBridgeで検知してLambdaで停止する構築ハンズオン(INAMURA)
https://cloud5.jp/rds-eventbridge-by-lambda-stopping/