なになれ

IT系のことを記録していきます

EC2の起動・停止をスケジュール実行できるAWS Instance Schedulerが便利

AWS Instance Schedulerを知るまでは、LambdaとCloudWatch Eventを使用してEC2を起動・停止する処理を作成していました。
より高機能に起動・停止処理を行えるのがAWS Instance Schedulerです。

docs.aws.amazon.com

EC2の起動時間を抑えるとコスト削減の効果が高いです。
1週間フルに稼働すると168時間ですが、5日×10時間で50時間にすると約3割の稼働時間になり、その分コスト削減できます。
AWS Instance Schedulerを使えば、このような起動時間の制御が簡単にできます。
以下で、AWS Instance Schedulerについて紹介します。

構成と特徴

アーキテクチャ構成

LambdaとCloudWatch EventとDynamoDBで構成されています。
f:id:hi1280:20200906190304p:plain:w700

特徴

  • 細かいスケジュール指定が可能になっている
  • 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にアクセスします。

https://console.aws.amazon.com/cloudformation/home?region=us-east-1#/stacks/new?templateURL=https:%2F%2Fs3.amazonaws.com%2Fsolutions-reference%2Faws-instance-scheduler%2Flatest%2Finstance-scheduler.template

リージョンがバージニア北部に設定されているので、適宜変更します。

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では、weekendsworking-daysの期間を指定しています。
また、@t2.nanoという記載を付与することで、特定のインスタンスタイプで起動します。
Timezoneを指定できるのもポイントです。
seattle-office-hoursuk-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 を使用したインスタンスの停止と起動