EC2の起動・停止をスケジュール実行できるAWS Instance Schedulerが便利
AWS Instance Schedulerを知るまでは、LambdaとCloudWatch Eventを使用してEC2を起動・停止する処理を作成していました。
より高機能に起動・停止処理を行えるのがAWS Instance Schedulerです。
EC2の起動時間を抑えるとコスト削減の効果が高いです。
1週間フルに稼働すると168時間ですが、5日×10時間で50時間にすると約3割の稼働時間になり、その分コスト削減できます。
AWS Instance Schedulerを使えば、このような起動時間の制御が簡単にできます。
以下で、AWS Instance Schedulerについて紹介します。
構成と特徴
アーキテクチャ構成
LambdaとCloudWatch EventとDynamoDBで構成されています。
特徴
- 細かいスケジュール指定が可能になっている
- CLIツールが用意されている
セットアップ方法
CLIツールのインストール
Instance SchedulerのCLIツールをインストールします。
$ wget https://s3.amazonaws.com/solutions-reference/aws-instance-scheduler/latest/scheduler-cli.zip $ unzip scheduler-cli.zip -d scheduler-cli $ cd scheduler-cli $ python setup.py install
下記が実行できれば、インストール成功です。
$ scheduler-cli --version
デプロイ
AWSマネージメントコンソールにログインして、以下のURLにアクセスします。
リージョンがバージニア北部に設定されているので、適宜変更します。
Stack Nameを指定して、次へを選択して、作成します。
使ってみる
事前知識
AWS Instance Schedulerには、期間とスケジュールというデータがあります。
スケジュールに対して期間を関連付けます。スケジュールには複数の期間を指定できます。
初期設定値を確認する
最初に用意されている期間を確認します。
$ scheduler-cli describe-periods --stack Ec2instanceScheduler { "Periods": [ { "Months": [ "jan/3" ], "Description": "Every first monday of each quarter", "Weekdays": [ "mon#1" ], "Name": "first-monday-in-quarter", "Type": "period" }, { "Begintime": "09:00", "Description": "Office hours", "Endtime": "17:00", "Weekdays": [ "mon-fri" ], "Name": "office-hours", "Type": "period" }, { "Description": "Days in weekend", "Weekdays": [ "sat-sun" ], "Name": "weekends", "Type": "period" }, { "Description": "Working days", "Weekdays": [ "mon-fri" ], "Name": "working-days", "Type": "period" } ] }
first-monday-in-quarter
という期間のデータでは、四半期毎の最初の月曜日という割と複雑な期間になっています。
office-hours
は平日の9時から17時という勤務時間を想定したデータになっています。
weekends
は土曜日と日曜日という休日を想定したデータ、working-days
は月曜から金曜という勤務日を想定したデータになっています。
最初に用意されているスケジュールを確認します。
$ scheduler-cli describe-schedules --stack Ec2instanceScheduler { "Schedules": [ { "Description": "Instances running", "Name": "running", "UseMetrics": false, "Type": "schedule", "OverrideStatus": "running" }, { "Timezone": "UTC", "Description": "Vertical scaling on weekdays, based on UTC time", "Periods": [ "weekends@t2.nano", "working-days@t2.micro" ], "Name": "scale-up-down", "Type": "schedule" }, { "Timezone": "US/Pacific", "Description": "Office hours in Seattle (Pacific)", "Periods": [ "office-hours" ], "Name": "seattle-office-hours", "Type": "schedule" }, { "Description": "Instances stopped", "Name": "stopped", "UseMetrics": false, "Type": "schedule", "OverrideStatus": "stopped" }, { "Timezone": "Europe/London", "Description": "Office hours in UK", "Periods": [ "office-hours" ], "Name": "uk-office-hours", "Type": "schedule" } ] }
scale-up-down
では、weekends
とworking-days
の期間を指定しています。
また、@t2.nano
という記載を付与することで、特定のインスタンスタイプで起動します。
Timezoneを指定できるのもポイントです。
seattle-office-hours
とuk-office-hours
というスケジュールでは、期間が同じデータですが、Timezoneが異なります。
Timezoneに合わせた時間に起動・停止が行われます。
起動・停止対象のインスタンスを決める
対象のインスタンスを設定するには、特定のタグ値を設定する必要があります。
タグ名にSchedule
、値にスケジュールの名前を設定します。
例えば、seattle-office-hours
を値に設定することができます。
期間を作成する
独自の期間を作成します。
以下では、月曜日から金曜日の9:00から18:00という期間を作成しています。
$ scheduler-cli create-period --stack Ec2instanceScheduler --name working --begintime 9:00 --endtime 18:00 --weekdays mon-fri
スケジュールを作成する
独自のスケジュールを作成します。
以下では、日本のTimezoneでスケジュールを作成しています。
$ scheduler-cli create-schedule --stack Ec2instanceScheduler --name japan-office-hours --periods working --timezone Asia/Tokyo
まとめ
自分のユースケースだと、いくつかのTimezoneでスケジュールを管理する必要があったのでInstance Schedulerの機能にピッタリはまりました。
Instance Schedulerをデプロイすれば、複数のインスタンスの起動・停止スケジュールを制御できるので楽です。
参考
AWS Instance Scheduler と AWS CloudFormation を使用したインスタンスの停止と起動