サーバーを指定した期間で停止する「AWS Instance Scheduler」を試してみる

2021-10-05
AWS ソリューション紹介

佐藤 裕介

皆さん、こんにちは ! ソリューションアーキテクトの佐藤裕介です。

皆さんは「AWS ソリューションライブラリ」をご存知でしょうか ? AWS ソリューションライブラリには、AWS を用いた構成の参考となる AWS ソリューションリファレンスアーキテクチャ、AWS CDK を用いて複数の AWS サービスを組み合わせて構築する際にに利用できる AWS Solutions Constructs、AWS パートナーによる AWS ソリューションコンサルティングサービス、そして、今回紹介する AWS Instance Scheduler が含まれる AWS ソリューション実装 が含まれています。

AWS ソリューション実装では、世界中のユーザーが直面する一般的な問題の解決策を提供しています。AWS ソリューション実装は AWS CloudFormation のテンプレートが提供されており、お客様の環境で CloudFormation テンプレートを実行することで、実装にかかる時間と労力を節約することができます。構築後の運用はお客様にて実施していただく必要はありますが、CloudFormation テンプレートは無料で入手することができ、お客様は実際に利用したサービスの利用料を負担いただくのみで利用できます。

このように非常に便利なものではあるのですが、AWS ソリューションの存在を知っていた方であっても、「どんなソリューションがあるのかわからない」「ソリューションの概要や使い方がわからない」といった理由で実際に活用したことがある方は少ないのではないでしょうか ?

そのような背景から、今回の記事では、皆さんに活用頂けそうな AWS ソリューションを 1 つ、使いどころ、使い方、参考コストを紹介していこうと思います !

今回紹介するソリューションは、「AWS Instance Scheduler」というコスト削減のためのソリューションです。例えば、「開発環境、テスト環境は平日の日中以外は停止してコストを削減したい」ときにご活用いただけます。

それではここから本ソリューションの概要や使い方を紹介します。

ご注意

本記事で紹介する AWS サービスを起動する際には、料金がかかります。builders.flash メールメンバー特典の、クラウドレシピ向けクレジットコードプレゼントの入手をお勧めします。

*ハンズオン記事およびソースコードにおける免責事項 »

この記事のデモを無料でお試しいただけます »

毎月提供されるデベロッパー向けアップデート情報とともに、クレジットコードを受け取ることができます。 


「AWS Instance Scheduler」とは ?

「AWS Instance Scheduler」は、 Amazon Elastic Compute Cloud (Amazon EC2) および Amazon Relational Database Service (Amazon RDS) インスタンスの開始スケジュールと停止スケジュールを設定して、AWS リソースコストを管理することができます。使用されていないリソースを停止し、必要なときにリソースを開始することで、運用コストを削減するのに役立ちます。

インスタンスの起動や停止はご自身で AWS Lambda を記述して行うことも可能ですが、AWS Instance Scheduler を利用することで以下の利点があります。

  • CloudFormation テンプレートが提供されているため、簡単にデプロイすることが可能
  • ご自身で Lambda 関数をコーディングしないため、Lambda 関数の開発が不要
  • 日を跨ぐスケジュール、曜日指定、毎月第一月曜日といった柔軟なスケジュール設定が分単位で可能
  • CloudFormation のパラメータや Amazon DynamoDB に保存されているパラメータ変更で設定変更が可能
  • リソースタグにより対象を指定するため、複数の Amazon EC2, Amazon RDS に簡単にスケジュールを適用可能

クリックすると再生します


使用している AWS サービスは ?

本ソリューションは、主にスケジュール設定を保存する Amazon DynamoDB と、スケジュール設定に従ってインスタンスの起動状態を変更する AWS Lambda で構成されています。使用している AWS サービスはすべてサーバレスのサービスであるため、本ソリューションを利用することによるインフラストラクチャの追加の管理は不要です。

Amazon DynamoDB
ユーザーが定義したスケジュールや、対象を指定するためのリソースタグの値といった設定値が保存されます。
AWS Lambda
DynamoDB テーブルを参照 (図中 2) し、指定されたスケジュールでインスタンスの起動及び停止を行います。対象となるインスタンスはリソースタグを利用して指定 (図中 3) します。

その他、ソリューションの実現のために以下のサービスを利用しています。

Amazon EventBridge ユーザーが定義した間隔で Lambda 関数を呼び出すために使用します。デフォルトの起動間隔は 5 分で、1 分単位で指定できます。(図中 1)
AWS Key Management Service (AWS KMS) SNS トピックと DynamoDB テーブルのサーバーサイド暗号化を行うためのカスタマーマスタキー (CMK) を作成します。
Amazon Simple Notification Service (Amazon SNS) Lambda 関数が次の呼び出し前にすべてのインスタンスを処理できない場合、エラーを Amazon Cloud Watch Logs に記録し、SNS トピックに通知します。通知先を登録しサブスクリプションすることでエラー通知を受け取ることができます。
AWS Identity and Access Management (IAM) EC2 インスタンスと RDS インスタンスの開始及び停止、インスタンスのタグ変更、その他必要な AWS サービスへのアクセス権限が許可された IAM ロールを作成します。

コスト試算の例

CloudFormation でデプロイすると、規模感がわからず、利用料が不安・・・という方も多いと思います。そこで、コスト試算をご紹介します ! このソリューションを実行するために発生する AWS サービスのコストは、AWS Lambda の実行時間と Amazon DynamoDB へのアクセス数に比例します。

例えば、バージニア北部リージョンにて、2 つのアカウントの Amazon EC2 及び Amazon RDS に対するスケジュールを設定したとき、AWS Instance Scheduler は 5 つの Lambda 関数を実行します。1 つは指定した間隔 (デフォルト 5 分) で実行される関数、残り 4 本は 2 つのアカウントそれぞれの 2 サービス (Amazon EC2、Amazon RDS) に対応する関数です。

下記の試算前提でのコストは、月額約 $9.90 です。サーバレスサービスを活用しているので、起動時にのみ課金というのがいいですね !

  • バージニア北部リージョンを使用
  • 2 つのアカウントの 2 つのサービス (Amazon EC2、Amazon RDS)に対してスケジュールを設定
  • 実行される Lambda 関数は 5 つ (2 アカウント × 2 サービス × 1 リージョン + 1 つの指定した間隔で実行される関数)
  • AWS Lambda はデフォルトの 5 分間隔で実行 (1 日あたり 1,440 回、1 回あたり実行時間 8 秒間)
  • AWS Lambda のメモリサイズは 128 MB
サービス 項目 月額料金
AWS Lambda 24 時間あたり 1,440 回実行
1 つの Lambda 関数は1回あたり 8 秒間の実行時間
Lambda 関数は 5 つ実行
$7.25
Amazon CloudWatch Metrics (enabled) オプションで有効化した場合 $0.90
AWS DynamoDB 月あたり 1,080,000 回の書き込み $1.25
AWS DynamoDB 月あたり 1,080,000 回の読み込み $0.50
AWS DynamoDB ストレージ料金は 1 GB 未満
(最初の 25 GB は無料です)
$0
  合計 $9.90

※ 2021 年 4 月時点での試算です。コスト試算の詳細は デプロイガイドのコストページ をご覧ください。


デプロイ方法 / 設定方法

AWS CloudFormation スタックの作成

それでは、AWS ソリューションのデプロイ方法を見ていきましょう!
本ソリューションにて使用する CloudFormation テンプレートを実行するために、AWS Instance Schedulerのランディングページ にアクセスします。

「AWS コンソールで起動する」を選択します。

デフォルトではバージニア北部リージョンで CloudFormation が起動し、ソリューションが展開されます。なお、AWS Instance Scheduler は他のリージョンのインスタンスに対しても、CloudFormation のパラメータで対象インスタンスがあるリージョンを指定することでスケジュール可能です。そのため、どのリージョンに AWS Instance Scheduler の Lambda 関数や DynamoDB をプロビジョニングするかの指定となります。普段使っているリージョンと同じリージョンで Lambda 関数や DynamoDB のテーブルを管理する必要があれば、マネジメントコンソールの左上より普段お使いのリージョンを指定します。

今回はバージニア北部リージョンのまま進みます。

「前提条件 - テンプレートの準備」「テンプレートの指定」は変更せずに「次へ」を選択します。

クリックすると拡大します

「スタックの名前」に任意の名前 (例 : InstanceScheduler) を入力します。

クリックすると拡大します

CloudFormation パラメータの説明

次に、CloudFormation のパラメータを設定します。
今回は、同一アカウント内のバージニア北部リージョンにある Amazon EC2 に対して起動及び停止を設定します。

特に注意すべきパラメータは、対象となるリソースを指定するためのタグ名 (Instance Scheduler tag name) と対象とするサービス (Service(s) to schedule) です。

AWS Instance Scheduler は Instance Scheduler tag name で指定したリソースタグのキーを元に対象のインスタンスを判別しますので、既存のリソースタグと重複しないよう注意してください !

Service(s) to schedule は対象となるサービスが Amazon EC2、Amazon RDS、もしくはその両方かを選択します。また、TimeZone を日本時間に変更し、エラー時の原因特定や動作確認をするために、Amazon CloudWatch Metrics、Amazon CloudWatch Logs、起動及び停止時に追加するタグを指定しています。

画像は今回デフォルト値から修正したパラメーターです。その他、各パラメータの詳細は表をご確認ください。

クリックすると拡大します

パラメータ名 初期値 図中の値 説明
Instance Scheduler tag name Schedule 同左 インスタンスを指定するために使用するリソースタグのKeyを設定します。既存のリソースタグと重複しないように注意してください。
Service(s) to schedule EC2 同左 対象のサービスを選択します。Amazon EC2、Amazon RDS、その両方(Both)から選択できます。
Schedule Aurora Clusters No 同左 Amazon Auroraのクラスタを対象とするか否かを選択します。
Create RDS instance snapshot No 同左 Amazon RDSの停止時にスナップショットを作成するか否かを選択します。なお、Auroraのクラスタを対象としているときには適用されません。
Scheduling enabled Yes 同左 AWS Instance Schedulerによるスケジュールの有効/無効を選択します。CloudFormationのスタック更新を行うことで、一時的に機能を無効化したいときに使用します。
Region(s) - 同左 対象となるインスタンスがあるリージョンを指定します。CloudFormationをデプロイしたリージョンのみの場合は空欄にします。
Default time zone UTC Asia/Tokyo タイムゾーンを指定します。タイムゾーンはList of tz database time zonesのTZ列を参照し選択します。
Cross-account roles - 同左 異なるアカウントのリソースを対象とする場合、異なるアカウントで使用するIAMロールのARNを入力します。
This account Yes 同左 このアカウントのリソースを対象とする場合はYesを入力します。Noの場合は上記のCross-account rolesに指定が必要です。
Frequency 5 同左 Lambda関数の実行間隔(分)を指定します。
Memory size 128 同左 Lambda関数のメモリサイズを選択します。
Enable CloudWatch Metrics No Yes CloudWatch metricsの有効/無効を選択します。
Enable CloudWatch Logs No Yes CloudWatch Logsの有効/無効を選択します。
Enable SSM Maintenance windows No 同左 Systems ManagerのメンテナンスウィンドウをAmazon EC2のスケジュール設定にロードするかを選択します。
Log retention days 30 同左 ログの保存期間(日)を設定します。
Started tags - StartedByInstanceScheduler=True AWS Instance Schedulerによって起動したインスタンスに追加するタグ名及び値を設定します。
Stopped tags - StoppedByInstanceScheduler=True AWS Instance Schedulerによって停止したインスタンスに追加するタグ名及び値を設定します。

「スタックオプションの設定」「詳細オプション」は変更せずに、「次へ」を選択します。

「レビュー InstanceScheduler」で、CloudFormation のパラメータが指定した値で設定されていることを確認します。

クリックすると拡大します

レビューを下へスクロールし、AWS CloudFormation によって IAM リソースが作成される場合があることを承認します。 にチェックを入れ、スタックの作成 を選択します。

クリックすると拡大します

スタックの作成が成功したことを確認します。
作成完了までに 5 分程度かかります。

クリックすると拡大します


スケジュールを設定してみよう

用語の理解

AWS Instance Scheduler でスケジュールを設定するにあたり、おさえておきたい用語が 2 つあります。それは、スケジュール定義ピリオド定義です。

2 つは参照関係であり、スケジュール定義からピリオド定義を参照しています。

ピリオド定義にはインスタンスの開始時刻、終了時刻、曜日を設定します。

スケジュール定義は設定したいピリオド定義を束ねることで、インスタンスを起動及び停止する時刻、曜日を判定します。

そして、各インスタンスは Instance Scheduler tag name で指定したタグ名 (今回は Schedule) の値に、スケジュール定義の名前を指定することで、適用するスケジュール定義を判断します。

・・・ちょっと複雑なので、例を挙げてご説明します !

図は「月曜日の 09:00 から金曜日の 16:59 まで起動し、それ以外は停止するスケジュール」を表しています。
まず、ピリオド定義には名前 (name)、曜日 (weekdays)、開始時刻 (begintime) と終了時刻 (endtime) が含まれます。

曜日ごとにピリオド定義が分かれていることにご注目ください。ここでは、月曜日 (mon-start-9am)、火曜日〜木曜日 (tue-thu-full-day) 、金曜日 (fri-stop-5pm) の 3 つのピリオド定義が定義されています。

例えば、月曜日は開始時刻を 09:00、終了時刻を 23:59 に設定しています。曜日は weekdaysmon を設定することで定義しています。火曜日から木曜日は、開始時刻と終了時刻の設定がありませんが、稼働しているインスタンスの停止を行わない場合は、このように表現できます。

金曜日は終了時刻を 17:59 とすることで、インスタンスの停止時間を定義しています。開始時刻、終了時刻は片方だけを設定することはできず、両方に値を持たせる必要があります。

ピリオド定義が作成できたら、これらを束ねて一つのスケジュール定義を完成させましょう !

まず、スケジュール定義に名前 (name) を付けます。スケジュールを表す名前が良いので、今回は mon-9am-fri-5pm としました。

次に、periods に、参照するピリオド定義の name 値 (mon-start-9am, tue-thu-full-day, fri-stop-5pm) を指定することで、「月曜日の 09:00 から金曜日の 16:59 まで起動し、それ以外は停止するスケジュール」の完成です !

後は、CloudFormation のパラメータで指定したインスタンスのタグ (デフォルトはSchedule) にスケジュール定義の name 値 (mon-9am-fri-5pm) を指定することで、設定したスケジュールでインスタンスが起動及び停止します。

スケジュール定義、ピリオド定義の確認

マネジメントコンソールからも、AWS Instance Scheduler の設定内容を確認してみましょう !

AWS Instance Scheduler は DynamoDB テーブルに設定を保存するため、まず、DynamoDB のテーブル一覧のマネジメントコンソール を確認します。

AWS Instance Scheduler によって作成された Instance Scheduler- で始まるテーブルが 3 つ確認できます。うち、スケジュールの設定は InstanceScheduler-ConfigTable-* に格納されていますので、テーブル名をクリックします。

クリックすると拡大します

「項目を表示」をクリックします

クリックすると拡大します

画面下部に項目の一覧が表示されます。このように、AWS Instance Scheduler は DynamoDB にて設定値を管理するため、マネジメントコンソールから設定内容を一覧化して確認できることも AWS Instance Scheduler のメリットです。

type 属性の値により各行を区別しており、CloudFormation のスタック作成時の設定内容 (type 属性が config)、先程説明したスケジュール定義 (type 属性が schedule) とピリオド定義 (type 属性が period) が含まれていることが確認できます。

また、サンプルとして初期構築時点で、スケジュール定義とピリオド定義がいくつか設定されています。これらの行をコピーして、独自の定義を作成してみましょう。

クリックすると拡大します

スケジュールの設定

お待たせしました ! いよいよ、自分の設定したいスケジュールを AWS Instance Scheduler に設定してみましょう !
サンプルとして、先程例に挙げた「月曜日の 09:00 から金曜日の 16:59 まで起動し、それ以外は停止するスケジュール」を設定してみます。

まず、曜日に応じて異なる 3 つのピリオド定義を作成します。

すでに格納されている項目をコピーして、書き換えます。ピリオド定義 (type 属性が period) の office-hours のチェックボックスを選択し、「アクション」から「コピー」をクリックします。

クリックすると拡大します

項目エディタの画面に遷移しますので、以下のように各属性を書き換え「項目の作成」をクリックします。

属性名
name mon-start-9am
begintime 09:00
endtime 23:59
description Office hours on Monday
weekdays[0] mon

クリックすると拡大します

同様に火曜日から木曜日、金曜日のピリオド定義を作成します。


属性名 値(火曜日から木曜日) 値(金曜日)
name tue-thu-full-day fri-stop-5pm
begintime 削除 00:00
endtime 削除 16:59
description Full-day from Tuesday to Thursday Office hours on Friday
weekdays[0] tue-thu fri

クリックすると拡大します

次に、スケジュール定義を作成します。

スケジュール定義もすでに格納されている項目をコピーして、書き換えましょう。スケジュール定義 (type 属性が schedule) の seattle-office-hours のチェックボックスを選択し、アクションから「コピー」をクリックします。

クリックすると拡大します

項目エディタの画面に遷移しますので、以下のように各属性を書き換えます。

複数のピリオド定義を参照するときは、フィールドの挿入ボタンを押し、periods 属性にフィールドを追加し参照するピリオド定義の name の値を入力します。

今回は、CloudFormation のスタック作成時に、Default time zone として Asia/Tokyo を指定していますので、スケジュール定義の中で指定しなくとも日本時間でスケジュールが作動します。タイムゾーンをスケジュール定義で指定することで、同じピリオド定義を参照していても、現地のタイムゾーンでスケジュールを設定することが可能です。

属性名 値(火曜日から木曜日)
name mon-9am-fri-5pm
timezone Asia/Tokyo
description Monday 9am to Friday 5pm in Japan (JST)
periods[0] mon-start-9am
periods[1] tue-thu-full-day
periods[2] fri-stop-5pm

クリックすると拡大します

(オプション) Scheduler CLI を利用したスケジュールの設定

AWS Instance Scheduler は専用の CLI ツールである Scheduler CLI を提供しています。
上記のように、DynamoDB のコンソール画面で設定する他に、Scheduler CLI を用いて設定することも可能です。

例えば、先程設定した、月曜日の 09:00 から金曜日の 16:59 まで起動し、それ以外は停止するスケジュールは下記のコマンドによって設定することができます。

$ scheduler-cli create-period --name "mon-start-9am" --begintime 09:00 --endtime 23:59 --weekdays mon --stack InstanceScheduler
$ scheduler-cli create-period --name "tue-thu-full-day" --weekdays tue-thu --stack InstanceScheduler
$ scheduler-cli create-period --name "fri-stop-5pm" --begintime 00:00 --endtime 16:59 --weekdays fri --stack InstanceScheduler
$ scheduler-cli create-schedule --name mon-9am-fri-5pm --periods mon-start-9am,tue-thu-full-day,fri-stop-5pm --timezone Asia/Tokyo --stack InstanceScheduler

インスタンスへのタグ付け

いよいよ、インスタンスへタグ付けをすることで、設定したスケジュールをインスタンスへ適用します。

今回は Amazon EC2 に対して指定したスケジュールを適用します。
Amazon EC2 の起動方法は「チュートリアル: Amazon EC2 Linux インスタンスの開始方法」をご覧ください。

マネジメントコンソールのインスタンス一覧画面 から対象のインスタンスを選択し、タグのタブから、「タグを管理」をクリックします。

クリックすると拡大します

「タグを追加」をクリックし、キーに CloudFormationのInstance Scheduler tag name で指定した値 (初期値は Schedule)、値に適用するスケジュール定義の name の値 (今回は mon-9am-fri-5pm) を入力し、「保存」をクリックします。

クリックすると拡大します

インスタンスのタグ付けは、このように、一つ一つにタグを追加しても良いですが、複数のリソースにタグを追加する方法として、タグエディターがおすすめです。タグエディターを用いたインスタンスへのタグ付方法は タグエディターのドキュメント をご覧ください。

インスタンスの起動及び停止の確認

設定した起動時刻になると、インスタンスが自動的に起動されることが確認できます。また、インスタンスのタグに CloudFormation の Started tags で指定したタグ (StartedByInstanceScheduler=True) が自動的に追加されます。

クリックすると拡大します

設定した終了時刻になると、インスタンスが自動的に停止されます。また、インスタンスのタグに CloudFormation の Stopped tags で指定したタグ (StoppedByInstanceScheduler=True) が自動的に追加されます。

クリックすると拡大します

AWS Instance Scheduler が実施するのは停止であり、終了ではありません。そのため、停止したインスタンスが削除されることも、保存したデータが失われることもなく再開可能です。停止と終了の違いは、インスタンスのライフサイクル をご覧ください。

これまで解説してきた Amazon EC2 と同様に、Amazon RDS に対してもスケジュール定義を設定できます。Amazon RDS の場合は、CloudFormation の設定時に Create RDS instance snapshot パラメータを変更することで、停止時にスナップショットを取得することが可能です。なお、Amazon RDS の連続停止時間は 7 日間であり、7 日間を経過すると自動的に再開される点にご注意ください。Amazon RDS インスタンスの停止に関するドキュメント にて停止がサポートされるエンジンが確認できます。

また、インスタンスの起動及び停止のログは、Amazon CloudWatch のマネジメントコンソール画面 から確認できます。

メトリクスメニュー内の「すべてのメトリクス」をクリックすると、カスタム名前空間として <stackname>:InstanceScheduler が追加されています。

クリックすると拡大します

「Schedule, Service」のディメンションをクリックします。

クリックすると拡大します

スケジュール定義ごとにメトリクスが表示されます。

図は 8:00 に起動するスケジュール定義のメトリクスを表示しています。
起動しているインスタンスの数を表す RunningInstances (オレンジ色の線) が、時刻によって 0 (停止) から 1 (開始) に変化していることがわかります。

なお、以下の動画でも使い方をご紹介していますので、ぜひご覧ください !


リソースの削除方法

AWS Instance Scheduler により作成されたリソースは、CloudFormation スタック一覧 から「削除」をクリックすることで削除できます。

クリックすると拡大します

サンプルで立ち上げた Amazon EC2 インスタンスは、対象のインスタンスを選択し、「インスタンスの状態」から「インスタンスを終了」をクリックすることで終了できます。

クリックすると拡大します


まとめ

今回の記事では「AWS Instance Scheduler」ソリューションの概要や使い方を紹介しました。 CloudFormation テンプレートを使ってセットアップし、スケジュールを設定するだけで、任意の期間でのインスタンスの起動と停止を自動化できることをご理解いただけたのではないかと思います。

また、本記事で紹介しきれていない内容として、以下のことも可能です。

  • リソースタグにより異なるインスタンスファミリーの複数のインスタンスを一括で対象に指定
  • 異なるアカウント間のインスタンスの起動及び停止スケジュールを設定
  • AWS Systems Manager のメンテナンスウィンドウを AWS Instance Scheduler に取り込み
  • Amazon EC2 のインスタンスタイプを指定して起動及び停止スケジュールを設定

AWS ソリューション実装は日々アップデートされており、AWS Instance Scheduler も 2018 年に初版を提供後、AWS Systems Manager のメンテナンスウィンドウの取り込みや、異なるアカウントのリソースのスケジュールが実装されています。
本ソリューションを活用される際には、AWS Instance Scheduler の実装ガイド もご一読頂ければと思います。

今後も AWS ソリューション紹介の記事を書いていきたいと思いますので、是非また読んでもらえたら嬉しいです。

それではまた次の記事でお会いしましょう !


builders.flash メールメンバーへ登録することで
AWS のベストプラクティスを毎月無料でお試しいただけます

筆者紹介

佐藤 裕介
アマゾン ウェブ サービス ジャパン合同会社
ソリューションアーキテクト

ソリューションアーキテクトとして、製造業分野のお客様を中心に様々なお客様を支援させて頂いています。AWS と出会いクラウドの楽しさを知り、お客様にもクラウドの楽しさを知ってほしいと思い日々働いています。
好きなサービスは、AWS Lambda と Amazon Connect で、難しいことを考えずにシュッと使えるサービスが好きです。
プライベートでは 3 歳の双子男児の父で日々育児に翻弄されています。

AWS を無料でお試しいただけます

AWS 無料利用枠の詳細はこちら ≫
5 ステップでアカウント作成できます
無料サインアップ ≫
ご不明な点がおありですか?
日本担当チームへ相談する