AWS CloudFormation と CloudWatch のスケジュール機能を使ってタグ付けされた EC2 と RDS をまとめて自動停止する設定手順について解説します。
過去の CloudFormation に関する記事一覧です。
【AWS】CloudFormation の基本的な解説(VPCの作成手順)
【AWS】CloudFormation で Amazon EC2 インスタンスを作成する手順【単純な作成】【Part.1】
【AWS】CloudFormation で Amazon EC2 インスタンスを作成する手順【VPC&サブネット&セキュリティグループ&EC2インスタンス】【Part.2】
コスト削減の悩み
単純に AWS は従量課金です。
使えば使うほど料金が掛かります。
物理サーバーを購入し、データセンターを利用してオンプレ環境でサーバーを運用している場合は、初期費用が掛かるだけでランニング費用はたいして掛かりません。
しかしその一方、人件費が掛かります。
更に今の時代だと新規サービスを立ち上げたいとなった時に業者を読んで見積もりを作ってもらって社内稟議を通して注文して物理サーバーを受け取りデータセンターでラッキング・ケーブリングをして OS をインストールしてミドルウェアをインストールして・・・などやっているとあっという間に数か月が経ってしまいます。
そのころにはすでに他の企業が新しいサービスを立ち上げて利益を持っていってしまっているかもしれません。
やはり企業にとってクラウド環境は必須です。
日常の管理が難しい
ただし AWS の台数が100台、200台、300台に増えてくると突然管理が難しくなります。
コスト削減のために、どのサーバーを落として、どのサーバーを上げて・・・などやっているとそれだけで1日が終わります。
もっと簡単に管理できるようなシステムがあると非常に助かるな・・・と思っていたところ、ありました。
Classmethod さんのサイトを見てひらめいた
タグでまるっと管理できないかな。。と考えていたところ、以下の Classmethod さんのサイトがありました。
定期的に EC2・RDS インスタンスを停止・起動する仕組みの CloudFormation テンプレート(2017年06月19日)
https://dev.classmethod.jp/cloud/aws/state-scheduler-cloudformation/
定期的に EC2 インスタンスを停止・起動する仕組みの CloudFormation テンプレート(2017年01月30日)
https://dev.classmethod.jp/cloud/aws/ec2-state-scheduler-cloudformation/
最初はタグでまるっと管理するためには Lambda でプログラムを作り込めば自分がやりたいことはできそうかと思いましたが、ソースの管理はやりたくありません。
もっとシンプルな環境にしたいです。
そこで CloudFormation と CloudWatch のスケジュール機能を使って EC2・RDS インスタンスを自動起動・自動停止する仕組みを構築してみます。
CloudFormation のスタック作成手順
CloudFormation のスタックを作成します。
初めに Classmethod さんのテンプレートにアクセスします。
以下の CloudFormation のスタックのテンプレートを置いている URL をクリックすると下図の画面に移動します。
上記 URL をクリックすると下図の「スタックの作成」画面に移動するので、何の設定変更もせずにそのまま「次へ」ボタンをクリックします。
「スタックの詳細を指定」画面で以下のように設定します。
- スタックの名前 ← CloudFormation のスタック名を設定します。
- StartSchedule ← インスタンスの起動時間を設定します。(例では朝6時になります)※CloudWatch Events の場合は、UTC(+9)になるので注意です。
- StopSchedule ← インスタンスの停止動時間を設定します。(例では深夜0時になります)※CloudWatch Events の場合は、UTC になるので注意です。
- TagKey ← タグキー名になります。
- TagValue ← True タグが付いているインスタンスが処理の対象となります。
設定が完了したら「次へ」ボタンをクリックします。
「スタックオプションの設定」画面で必要な場合は各種設定します。(例では何も追加設定はしません)
設定が完了したら「次へ」ボタンをクリックします。
「レビュー」画面で各種設定を確認します。
「AWS CloudFormation によって IAM リソースが作成される場合があることを了承します。」にチェックを入れて「スタックの作成」ボタンをクリックします。
しばらくして下図のように「CREATE COMPLETE」のメッセージが表示されることを確認します。
EC2 インスタンスにタグ付けをする
スタックを作成したら、管理対象の EC2 インスタンスにタグ付けをします。
EC2 ダッシュボードより左側ペインの「タグ」をクリックして「タグの管理」ボタンをクリックします。
タグの管理画面で以下のように設定します。
管理対象にしたい EC2 インスタンスにチェックを入れます。
タグの追加で「キー」に「state-scheduler」を入力し「値」に「True」を入力し「タグの追加」ボタンをクリックします。
下図のように、新たに「state-scheduler」のタグが追加されたことを確認します。
インスタンス一覧でも下図のようにタグが追加されていることを確認します。
動作確認
動作確認をします。
一旦スタックの起動時間と停止時間を修正し、時刻通りに問題なく起動・停止が出来ることを確認します。
動作確認用に起動・停止時間の調整をする手順
起動時間を 11時45分、停止時間を 11時50分に設定して動作確認をします。
AWS 管理コンソールより「サービス」-「管理とガバナンス」-「CloudFormation」をクリックします。
対象のスタック(StateScheduler)を選択し「更新する」ボタンをクリックします。
「スタックの更新」画面で「テンプレートの準備」で「現在のテンプレートの仕様」を選択して「次へ」ボタンをクリックします。
「スタックの詳細を指定」画面で起動・停止スケジュールを動作確認用に修正します。
下図の例では動作確認用に「午前11時45分起動」、「午前11時50分停止」に設定しています。
設定したら「次へ」ボタンをクリックします。
「UTC」と「JST」対応表
簡単ですが、一瞬で分かるように「UTC」と「JST」の対応表です。
例えば、日本時間の21時に設定したい場合は、「12」を設定します。
簡単に計算する方法ですが、UTCで表示された数字を見たら「+9」すればOKです。
- 0を見た ← 9を足して日本時間で9時
- 22を見た ← 9を足して31 ← 24を引くと7 ← 日本時間で7時
- 日本時間の月曜日の朝6時 ← UTC の日曜日の21時
- 日本時間の月曜日の夜12時(火曜日の0時) ← UTC の月曜日の15時
- UTC の月曜日の16時 ← 日本時間の火曜日の深夜1時
UTC(GMT) JST
0 9
1 10
2 11
3 12
4 13
5 14
6 15
7 16
8 17
9 18
10 19
11 20
12 21
13 22
14 23
15 0(翌日)
16 1(翌日)
17 2(翌日)
18 3(翌日)
19 4(翌日)
20 5(翌日)
21 6(翌日)
22 7(翌日)
23 8(翌日)
11時45分に起動して11時50分に停止する場合
- StartSchedule ← 45 2 ? * MON-FRI *
- StopSchedule ← 50 2 ? * MON-FRI *
「スタックオプションの設定」画面で必要な場合は設定を変更して「次へ」ボタンをクリックします。
設定内容の確認画面で「AWS CloudFormation によって IAM リソースが作成される場合があることを承認します。」にチェックを入れて「スタックの更新」ボタンをクリックします。
下図のように「UPDATE_CONPLETE」のメッセージが表示されることを確認します。
EC2 インスタンスの起動確認
時間が来たら対象の EC2 インスタンスが起動することを確認します。
CloudWatch よりログを確認する
CloudWatch よりログを確認します。
CloudWatch ダッシュボードより左側ペインの「ログ」をクリックします。
対象のログをクリックします。
下図のようにエラーなく実行されていることを確認します。
EC2 インスタンスの停止確認
時間が来たら対象の EC2 インスタンスが停止することを確認します。
CloudWatch よりログを確認する
CloudWatch よりログを確認します。
対象のログをクリックします。
実行当日のログをクリックします。
下図のようにエラーなく実行されていることを確認します。
EC2 及び RDS インスタンスの停止だけ定期的に実行する方法
毎日定期的に朝から夜までインスタンスを利用するような環境なら上記の手順でいいですが、時には終日利用しない場合もあります。
その場合は使わないのに EC2 及び RDS インスタンスが起動したら従量課金が発生します。
定期的に利用するわけではなく、且つインスタンスの使用を終了する時間だけが決まっている場合は、インスタンスの起動処理はせずに毎日停止だけするように設定を変更することができます。
上記の CloudFormation を利用して、毎日(平日だけでなく土日も)の24時(深夜0時)に特定の EC2 及び RDS を停止する設定をしてみます。
毎日24時(深夜0時)に EC2 及び RDS インスタンスを停止する手順
AWS 管理画面より「サービス」-「管理とガバナンス」-「CloudWatch」をクリックします。
CloudWatch ダッシュボードの左側ペインより「ルール」をクリックします。
ルール画面で「StartScheduler」にチェックを入れます。
下図のように「アクション」をクリックして「無効化」をクリックします。
無効化の確認画面が表示されるので「無効化」ボタンをクリックします。
「StartScheduler」が無効化されていることを確認します。
参考サイト
定期的に EC2・RDS インスタンスを停止・起動する仕組みの CloudFormation テンプレート(2017年06月19日)
https://dev.classmethod.jp/cloud/aws/state-scheduler-cloudformation/
定期的に EC2 インスタンスを停止・起動する仕組みの CloudFormation テンプレート(2017年01月30日)
https://dev.classmethod.jp/cloud/aws/ec2-state-scheduler-cloudformation/
コメント