CloudWatch Eventsを使ってEC2を自動停止する

CloudWatch
スポンサーリンク

例えば社内でAWSのEC2を使ってファイルサーバーを運用していたとします。

日中はファイルサーバーを使用しますが、深夜帯はみんな帰宅してファイルサーバーは使われません。

EC2は従量課金制です。
起動していれば起動していた時間分だけ課金されます。

ですので、この例で言えばファイルサーバーを使っていない深夜帯は無駄なコストがかかっていると言えます。

「深夜1時になったらEC2を自動停止して、翌朝5時になったら自動起動させたい」
「土日は会社がお休みだから、1日中停止しておきたい」

こんな方法があったら便利だと思いますよね?

この方法、実はあります。

CloudWatch Events と AWS System Managerを使えば可能なんです。

今回は「CloudWatch Events」と「AWS System Manager」を使ったEC2の自動停止・起動方法をご紹介したいと思います。

AWS Systems Manager って何?

AWS Systems Manager (以降SSMと記載)は、AWSリソースの管理運用を簡単にしてくれるサービスです。

SSMを利用することで、以下のようなことができます。

  1. 運用タスクの自動実行
  2. OSやソフトウェアの設定情報等、運用に必要なデータの可視化
  3. AWSリソース以外のオンプレサーバも一緒に一元管理できる

今回利用するSSMの機能は、上記1の「運用タスクの自動実行」という部類に入り、EC2の停止、または起動を行います。

CloudWatch Eventsって何?

CloudWatch Eventsとは、特定のタイミング、またはスケジュールによって他のAWSサービスを自動発火してくれる、いわばトリガーの役割を担うAWSサービスです。

今回の行う自動停止・起動ではCloudWatch Eventsは、”定期的”にSSMを自動発火する役割を担います。

EC2自動停止・起動を行う仕組み

それではEC2を自動停止、または起動させるためのざっくりとした仕組みをご説明します。

CloudWatch Eventsを使ってEC2を自動停止する

まず最初にCloudWatch EventsにてスケジューリングされたタイミングでSSMへイベントを発行します。
イベントを受け取ったSSMは指定のイベントによって指定のEC2の停止、または起動タスクを実行します。
EC2の停止、または起動となります。

EC2自動停止・起動にかかる料金

料金は下記表の通りです。

AWSサービス料金
SSM無料
CloudWatch Eventsイベント発行数100万件あたり1ドル
(2018.11.14時点 東京リージョン)

仮に毎日起動・停止を行ってそれを1年間行ってもイベント発行回数は730回ですので1ドルですみます。
なんならそれを10年間続けても1ドルです!!

というわけで、この「EC2の自動停止・起動」にかかる費用はほぼ無いといっても過言ではございません

であれば、24時間365日稼働し続けるサービスは別にして、やらない手はないでしょう。

EC2の自動停止・起動の設定方法

それではSSMとCloudWatch Eventsを使ってEC2を自動起動停止設定をしてみよう

CloudWatch Eventsに適用するIAMロールの作成

SSMを発火する場合、CloudWatch EventsはSSMを発火する”権限”がなくては発火できません。

ですので、SSMを発火するためのIAMロールを作成してCloudWatch Eventsのルールに持たせる必要があります。

(1)IAMマネジメントコンソールを開きます

(2)左メニューから[ロール]をクリックし、[ロールの作成]をクリックします

(3)[このロールを利用するサービスを選択]で[CloudWatch Events]を選択し、[ユースケースの選択]で[CloudWatch Events]を選択します。
選択したら[次のステップ:アクセス権限]をクリックします

(4)特に何もせず、一旦[次のステップ:確認]をクリックします

(5)[ロール名]と[ロールの説明]を入力して[ロールの作成]をクリックします

(6)ロールの一覧画面に戻りますので、再度作成したロールをクリックします

(7)[ポリシーをアタッチします]をクリックし、”AmazonSSMAutomationRole”をアタッチします。
その他のポリシーは削除します。

以上でIAMロールが完成です。

CloudWatch Eventsのルールを作成する

SSMのEC2起動、停止のタスクは既にデフォルトで用意されておりますので、CloudWatch Eventsの設定をしたら完成です。
それでは以下より「毎平日深夜1時になったらEC2インスタンスを停止する」ルールを作成します。

(1)CloudWatchマネジメントコンソールを開きます。

(2)左メニューから[ルール]をクリックし、[ルールの作成]をクリックします。

(3)[スケジュール]を選択し、[cron式]を選択。以下を入力欄へ入力します。
この入力の意味は、平日深夜1時を表します。(タイムゾーンはUTCです。だから”16″と記載しております。)
→ スケジュールの記載ルールについてはこちらをご確認ください

(4)[ターゲットの追加]をクリックします

(5)”SSM Automation”を選択します

(6)以下のような設定を行い、[設定の詳細]をクリックします
Document:AWS-StopEC2Instance
“定数”を選択
InstanceID:停止するインスタンスIDを入力
“既存のロールを使用”を選択
※ここで先ほど作成した IAMロールを選択します

(7)ルールの[名前]と[説明]を入力、状態は有効にチェックを入れたまま[ルールの作成]をクリックします
※有効のチェックを外すと、無効状態として登録されます。一旦ルールを作成するけどまだ実行はさせたくない場合は有効のチェックをはずしてください。

「成功」という画面が表示されたら作成成功です。

上記と同様にEC2の起動(Documentは”AWS-StartEC2Instance”を選択してくださいね)、土日は停止、というルールも作ってみてください。
スケジュールの書き方、Documentを変更するだけで簡単に作成ができると思います。

尚、この機能を使えばRDSの自動起動・停止だって行うことが可能です。
ドキュメントを”AWS-StartRdsInstance”、または”AWS-StopRdsInstance”でRDSの自動起動・停止となります。
RDSは7日間で自動的に立ち上がりますので、その対策にも使えそうですね!

ここまでお読みいただきありがとうございました!hidesanでした〜( ´ ▽ ` )

タイトルとURLをコピーしました