LoginSignup
2
1

More than 3 years have passed since last update.

インスタンスの自動起動停止をする Instance Scheduler を触ってみた

Last updated at Posted at 2021-01-06

Instance Scheduler とは

AWS を使っていると、コストを削減するために、定期的に EC2 インスタンスや RDS インスタンスを停止したいときがあります。CloudWatch Event + Lambda を使って独自にプログラムを作っても良いですが、実装するのがめんどくさいです。そういったときに、AWS が提供している Instance Scheduler が便利に使えます。AWS 公式で提供されているソリューションになっていて、多機能で安心感があります。

Instance Scheduler は、AWS のマネージドサービスではなく、いくつかのマネージドサービスを組み合わせて提供されているソリューションです。CloudFormation のテンプレートが提供されており、簡単に Deploy が出来て、自動的に起動停止をしてくれます。

こちらのURL で公開されています。
https://aws.amazon.com/jp/solutions/implementations/instance-scheduler/

アーキテクチャの概要はこんなかんじです。 (引用)

1609896963412.png

EventBridge (画像では CloudWatch) が定期的に Lambda を起動して、その Lambda が DynamoDB に格納されている情報を読み込んで、EC2 インスタンスと RDS インスタンスの自動停止・起動を行う構成です。対象のインスタンスは、特定の Tag を付与して起動停止の対象と判断しています。

それでは、Instance Scheduler の Deploy 方法を備忘録としてメモしておきます。

Instance Scheduler Stack の起動

次の URL にアクセスします。
https://aws.amazon.com/jp/solutions/implementations/instance-scheduler/

画面の中から、AWS コンソールで起動する を選択します。

1609898100657.png

すると、AWS のマネージドコンソールで、Instance Scheduler を CloudFormation で Deploy する画面に移ります。対象の Region を確認したあとで、Next を押します。
ちなみに、ここで View in Designer を押すと視覚的にわかりやすく CloudFormation で出来上がるリソースが確認できます。

1609908769983.png

各種パラメータを入れて Next を入れます。パラメータの詳細はこちら のドキュメントに乗っています。
この記事の場合は、5分おきに Lambda を起動するパラメータをいれています。

1609909405411.png

確認画面で IAM リソースの作成を許すチェックを入れて Create stack を押します。

1609909506503.png

作成中になります。約5分ほど待つと作成完了になりました。

1609909592523.png

CloudFormation によって、作成された Resources はこれらです

  • Lambda Function
  • DynamoDB Table
  • IAM Policy
  • KMS Key
  • KMS Alias
  • SNS Topic
  • EventBridge Rule

1609911338898.png

Scheduler CLI Install

Instance Scheduler では、いつどのようにインスタンスを起動停止するかを Dynamo DB でデータを格納しています。DynamoDB データに紐づくインスタンスを、自動的に起動・停止をしてくれます。
DynamoDB には、次の2つの重要なデータが格納されています

  • スケジュール(Schedule) : インスタンス起動停止に関係するスケジュールを指定。1つ以上の期間(Period)が含まれている。
  • 期間(Period) : いつからいつまでを起動するのか期間を定義

紐づくインスタンスとの関係性はこんな感じです。
インスタンス → Schedule → Period
インスタンスは、Schedule と1対1で紐づき、Schedule は Period と、1対多で紐づきます。

詳細はこちらに書かれています。
https://d1.awsstatic.com/Solutions/ja_JP/instance-scheduler.pdf

Schedule と Period は独自にカスタマイズが出来ます。DynamoDB のデータを直接編集することもできますが、Scheduler CLI を使うのが便利です。次のコマンドで Scheduler CLI をダウンロードします。

wget https://s3.amazonaws.com/solutions-reference/aws-instance-scheduler/latest/scheduler-cli.zip
unzip scheduler-cli.zip

Scheduler CLI を Install

sudo python3 setup.py install

実行例

> sudo python3 setup.py install
/usr/lib/python3/dist-packages/setuptools/dist.py:473: UserWarning: Normalizing 'v1.2.0' to '1.2.0'
  warnings.warn(
running install
running bdist_egg
running egg_info
creating scheduler_cli.egg-info

省略

Using /usr/lib/python3/dist-packages
Finished processing dependencies for scheduler-cli==1.2.0
>

Scheduler CLI の 動作検証 をしていきます。
DynamoDB の ConfigTable に保存されている Period 一覧を取得するコマンドです。

scheduler-cli describe-periods --stack InstanceScheduler

デフォルトで格納されている Period を JSON で取得できます。

> scheduler-cli describe-periods --stack InstanceScheduler
{
   "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"
      }
   ]
}

同様に、Schedule の一覧を取得します

scheduler-cli describe-schedules --stack InstanceScheduler

実行例

> scheduler-cli describe-schedules --stack InstanceScheduler
{
   "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"
      }
   ]
}

Period の設定

Scheduler CLI が正常に動作したので、Period を独自に設定していきます。今回は、深夜1時に起動しているインスタンスを自動的に停止したいので、次のコマンドで LateNightStop という名前の Period を作成します。

scheduler-cli create-period \
--name "LateNightStop" \
--description "Stop Instance at 01:00 every day" \
--endtime "01:00" \
--stack InstanceScheduler

実行例

> scheduler-cli create-period \
  --name "LateNightStop" \
  --description "Stop Instance at 01:00 every day" \
  --endtime "01:00" \
  --stack InstanceScheduler
{
   "Period": {
      "Description": "Stop Instance at 01:00 every day",
      "Endtime": "01:00",
      "Name": "LateNightStop",
      "Type": "period"
   }
}

DynamoDB Table に、作成した LateNightStop Item が生成されています。

1609931770150.png

Schedule の設定

次に、作成した Period を使った LateNightStopSchedule という名前の Schedule を作成します。

scheduler-cli create-schedule \
--name "LateNightStopSchedule" \
--description "Stop Instance at 01:00 every day" \
--periods "LateNightStop" \
--timezone "Asia/Tokyo" \
--stack InstanceScheduler

実行例

> scheduler-cli create-schedule \
  --name "LateNightStopSchedule" \
  --description "Stop Instance at 01:00 every day" \
  --periods "LateNightStop" \
  --timezone "Asia/Tokyo" \
  --stack InstanceScheduler
{
   "Schedule": {
      "Description": "Stop Instance at 01:00 every day",
      "Timezone": "Asia/Tokyo",
      "Name": "LateNightStopSchedule",
      "Periods": [
         "LateNightStop"
      ],
      "StopNewInstances": true,
      "UseMaintenanceWindow": false,
      "RetainRunning": false,
      "Enforced": false,
      "Hibernate": false,
      "UseMetrics": false,
      "Type": "schedule"
   }
}

DynamoDB Table に、作成した LateNightStopSchedule Item が生成されています。

1609932344511.png

インスタンスにタグ付け

EC2 インスタンスに 特定の Tag をつけると自動起動・停止が動作します。TagName=Shedule名の書式で Tag を設定すればよいです。
この記事の場合は、TagName を Schedule としているので、Schedule=LateNightStopSchedule という形式で Tag を生成します。

TagName は Stack の Parameters を表示すれば確認できます。

1609932888826.png

ちなみに、この指定は Lambda Function の Environment で使われています。

1609932949742.png

それでは、EC2 Instance に Tag を付与しました。これで自動的に停止されます。

1609933060300.png

CloudWatch Logs

Instance Scheduler 配下の Lambda の Log は、CloudWatch Logs に出力されています。

1609940172949.png

また、エラーが発生した際には、自動生成された SNS にサブスクライブ先を追加することで、エラーメッセージを受けることも出来ます。必要そうな場合は手動で追加をしておくのもよいです。

付録 : CloudFormation で作成されたリソースの確認

Event Bridge

Rule

1609911427501.png

5分おきに、Lambda を Trigger している

1609911465383.png

Lambda

Function が作成されている

1609911589315.png

実際のソースコードや環境変数などが確認可能

1609911721351.png

DynamoDB

DynamoDB Table が3つ作成されている

1609911779826.png

ConfigTable には、スケジュールや期間のテンプレート設定が初めから入っている

1609911876583.png

StateTable や MantenainceWindowTable の中身は空っぽ

SNS

Topic が1個作成されている

1609912050993.png

Subscription は空なので、手動でメール通知したいアドレスを入れる

1609912074014.png

KMS

Customer managed key が作成されている

1609912148110.png

Alias name もこんなかんじ

1609912488867.png

参考URL

AWS Instance Scheduler
https://aws.amazon.com/jp/solutions/implementations/instance-scheduler/

AWS 実装ガイド
https://d1.awsstatic.com/Solutions/ja_JP/instance-scheduler.pdf

ソースコード
https://github.com/awslabs/aws-instance-scheduler

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1