EC2 インスタンスの起動と停止を自動化することは出来ますか?
困っていた内容
1日のうち決まった時間帯のみ特定の EC2 インスタンスを起動させたい要件があります。毎回手動で行うのは手間なので、自動化させたいと考えています。
どうすればいいの?
Amazon Systems Manager のオートメーションと CloudWatch イベントを使用して自動起動、停止をスケジュールすることが可能です。
IAMロールを作成する
CloudWatch イベントの作成時に使用する IAM ロールを作成します。 CloudWatch Events には、提供された Automation ドキュメントとパラメータを使用して SSM Start Automation Execution を呼び出すための権限が必要です。
IAM コンソールよりロールを作成します。今回は event-ssm-automation-role という名前のロールを作成しました。IAM ロールには、下記のように AWS 管理ポリシーの AmazonSSMAutomationRole をアタッチします。
「信頼関係」タブを開き、「信頼関係の編集」より下記のように編集します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "events.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
CloudWatch イベントのルールを作成する
EC2 インスタンスを自動起動するための CloudWatch イベントのルールを作成します。CloudWatch コンソールのイベントから「ルールの作成」ボタンをクリックします。
下記画面でイベントソースを設定します。今回は、毎日特定の時間に EC2 インスタンスを起動するように設定したいため、cron 式で入力します。cron 式の書き方は下記ドキュメントをご参考ください。
参考ドキュメント: cron 式 - ルールのスケジュール式 - Amazon CloudWatch Events
今回は、「30 18 * * ? *」と入力しました。毎日 18:30 UTC にイベントが発生するような設定です。
次に、「ターゲットの追加」ボタンからターゲットを設定します。 ロールは「既存のロールを使用」に変更し、先ほど作成した IAM ロールを選択します。 全て設定出来たら「設定の詳細」ボタンをクリックします。
ルールの名前と説明を入力し、「ルールの作成」をクリックします。
ルールが作成されました。
同様の手順で EC2 インスタンスを自動停止させるための CloudWatch イベントルールを作成します。イベントソースにて「スケジュール」を選択し、Cron 式で「0 19 * * ? *」と入力しました。毎日 19:00 UTC にイベントが発生するような設定です。
ターゲットには、下記のように設定しました。SSM Automation の「ドキュメント」以外は先ほどの設定と同様です。全て設定出来たら「設定の詳細」ボタンをクリックします。
ルールの名前と説明を入力し、「ルールの作成」をクリックします。
ルール作成完了です。
実行確認
まずは、インスタンスの自動起動の確認です。指定のインスタンスを停止状態にしておきます。
設定した時間にインスタンスのステータスが「実行中」となりました。
Amazon Systems Manager コンソールの自動化でオートメーションの実行が成功していることを確認しました。
次に、インスタンスの自動停止の確認です。設定した時間にインスタンスのステータスが「停止済み」となりました。
Amazon Systems Manager コンソールの自動化でオートメーションの実行が成功していることを確認しました。
さらに、CloudTrail コンソールでイベント履歴を確認すると、StartInstance は想定通りでしたが、StopInstance は2回履歴が記録されていました。詳細を確認すると、2回目の StopInstance は "force": true と強制終了していました。
"requestParameters": {
"instancesSet": {
"items": [
{
"instanceId": "i-*******"
}
]
},
"force": true
},
SSM のドキュメント「AWS-StopInstance」の内容を確認してみると、通常の StopInstances の後に forceStopInstances するよう作成されていました。
インスタンス停止のタイミングで、基盤側の障害等と重る等、通常の StopInstances のみでは停止出来ない場合がある可能性があるため、強制停止で必ず停止出来るようになっているのだと思います。
EC2の起動と停止を自動化する無料ツールのご紹介
Systems ManagerオートメーションとEventBridgeは平日の決まった時間にEC2を起動することができるとても便利なサービスです。ですが他にもし以下のようなご要望がありましたら、ぜひ弊社のAWS運用支援ツールopswitchをご利用ください。
- EC2を起動する際、Insufficient Instance Capacity エラーが発生した場合は別のインスタンスタイプで起動したい。
- 日本の祝日はEC2を起動しないようにしたい。
- 会社の休日を事前にまとめて設定して、EC2を起動しないようにしたい。(EventBridgeの場合はルールを都度無効化する必要があります。)
- 複数のEC2、RDSをまとめて起動停止したい。
- 難しい設定をせずに結果をSlackに通知したい。
- 止め忘れたリソースがないかチェックしたい。
opswitchの機能紹介の動画がありますのでぜひご覧ください。
※音声が出ます。
opswitchのURLは以下になります。「opswitchをはじめる」というボタンからサインアップできます。
AWSの定型作業スケジュール実行サービス・opswitch(オプスウィッチ)by クラスメソッド
以下はユーザーガイドのリンクです。
ユーザーガイド opswitchを開始する