EC2インスタンスをスケジュールで自動起動・自動停止させる(定時出社・定時退社)

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

こんばんは。ばっしーです。

AWSのサーバーを作っていると課金体系に疑問を持つことがあります。

特にEC2では1時間ごとにインスタンスを立ち上げていると料金がかかるので、使わない時間は落としていると節約になります。

弊社が担当するお客様で割と多いのが、リモートデスクトップサービスの提供なのですが、当然勤務時間しか使わないので夜間や休業日はリソースを無駄に消費しています。

ちなみにリモートデスクトップと似ているサービスでWorkspacesというサービスもありますが、そちらは一か月単位の課金なので落としても料金は変わりません。

また、料金が変わるのはEC2の料金のみで、アタッチ(マウント)しているEBSの料金は変わりません。

そのため、社内からしかアクセスしないファイルサーバや会計システムも落とせるかもしれませんが、EBSが大きいと相対的な価格メリットは享受しにくくなりそうですね。

とは言いつつも、役立っていないで動き続けているインスタンスは、御社の資本を食いつぶしているだけの存在になっています。

いくら安いAmazonでも無駄に動かしていると高い!

なのでインスタンスを自動運転して得しちゃおう!

どのくらい損しているか計算

簡単に算数してみると、、、

【一か月間起動しっぱなし】30日×24時間=720時間

【定時出社&定時退社】20日×9時間=180時間

なんと、EC2の代金は最大で1/4、75%の削減効果です。

もっとも、起動時間や若干の早出、そして残業もあると思うので実際の勤務体系に合わせてみましょう。

【8:30出社&19:30退社】20日×11時間=220時間

少し利用時間を拡大させても約70%節約できます。

これは利用しない手はありませんね。

そこで今回のお題です。

EC2インスタンスをスケジュールで自動起動・自動停止させる

そのままの見出しです。

ひねりがなくてすみません。

どんな方法があるの?

AWSのインスタンスを起動・停止させるにはいろいろな方法がありますが、スケジュールで実行させるためには以下のような選択肢があるようです。

  • インスタンス内でAmazon CLIをcronもしくはタスクスケジューラーで実行する
  • Lambdaのスケジュールで実行する
  • CloudWatchのイベントで実行する

正直、EC2とかRDS程度しか扱っていない昔のサーバーエンジニアでしたらcronで実行してしまうでしょう。

ところが折角のクラウドなので、AWSの機能を活用していきますよー!

ちなみに正確には裏でCloudwatchが動いているようです。

Lambdaのスケジュールやってみる

やり方はクラスメソッド様のこちら↓に書いてありますので、ハマった点とカスタマイズについて記載します。

LambdaのScheduleイベントでEC2を自動起動&自動停止してみた

とりあえず結構面倒だけどスクショをぺたぺたしてみました。

まずはLambdaを選択。画面上の「サービス」から探します。

2016-06-17_11h00_25

「Create a Lambda Function」をクリックします。

2016-06-17_11h01_41

何もしないで「Skip」をクリック。

2016-06-17_11h12_36

Name、Description、Runtime を以下のように設定し、Code entry typeは「Edit code inline」を選択します。

下の窓部分をクリックするとコードを編集可能になるため、コードを貼り付けます。

2016-06-17_11h14_40

コードを記載する場合は以下の点に注意します。

リージョン:ap-northeast-1 (例:東京リージョン)

Amazon EMR リージョン Amazon EMR CLI および API リージョン Amazon S3 リージョン Amazon EC2 リージョン
米国東部(バージニア北部) us-east-1 米国スタンダード 米国東部(バージニア北部)
米国西部(オレゴン) us-west-2 Oregon 米国西部(オレゴン)
米国西部(北カリフォルニア) us-west-1 北カリフォルニア 米国西部(北カリフォルニア)
欧州 (アイルランド) eu-west-1 アイルランド 欧州 (アイルランド)
欧州(フランクフルト) eu-central-1 フランクフルト 欧州(フランクフルト)
アジアパシフィック(シンガポール) ap-southeast-1 シンガポール アジアパシフィック(シンガポール)
アジアパシフィック(東京) ap-northeast-1 東京 アジアパシフィック(東京)
アジアパシフィック (ソウル) ap-northeast-2 ソウル アジアパシフィック (ソウル)
アジアパシフィック (シドニー) ap-southeast-2 シドニー アジアパシフィック (シドニー)
南米 (サンパウロ) sa-east-1 Sao Paulo 南米 (サンパウロ)
AWS GovCloud (US) us-gov-west-1 GovCloud AWS GovCloud (US)
中国(北京) cn-north-1 中国(北京) 中国(北京)

https://docs.aws.amazon.com/ja_jp/ElasticMapReduce/latest/DeveloperGuide/emr-plan-region.htmlより

あとは1行目のインスタンスIDだけ書き換えればOKです。

2016-06-17_11h30_06

コードサンプル

const INSTANCE_ID = 'i-0aa12345bb67890c1';

var AWS = require('aws-sdk');
AWS.config.region = 'ap-northeast-1';

function ec2Start(cb){
var ec2 = new AWS.EC2();
var params = {
InstanceIds: [
INSTANCE_ID
]
};

ec2.startInstances(params, function(err, data) {
if (!!err) {
console.log(err, err.stack);
} else {
console.log(data);
cb();
}
});
}
exports.handler = function(event, context) {
console.log('start');
ec2Start(function() {
context.done(null, 'Started Instance');
});
};

ページの下方に移って設定を続けます。

Lambda function handler and roleのRoleは、「 *Base execlution role」を選択します。

2016-06-17_11h19_24

上記を選択すると、新しいウィンドウ(タブ)が開くので、以下の様に設定します。

2016-06-17_11h20_55

コードサンプル

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents",
        "ec2:StartInstances"
      ],
      "Resource":[
      "arn:aws:logs:*:*:*",
      "arn:aws:ec2:*"
      ]
    }
  ]
}

Create Functionをクリックします。

2016-06-17_11h32_42

これでスクリプトは完成です!

Testをクリックすると、起動/停止すると思います。

定時出社・定時退社の設定

あとはイベントの発生タイミングを指定するため、Event sourcesをクリックします。

2016-06-17_11h33_19

イベントソース一覧画面になるので、Add event sourceをクリックします。

2016-06-28_13h53_13

ダイアログが開くのでEvent source typeから「CloudWatch Events – Schedule」を選択します。

2016-06-28_13h55_39

ここが最後の設定です。

どのようなスケジュールで動かすか設定します。

2016-06-28_13h56_54

Rule name:適当な名前を入力

Rule description:適当な説明を入力

Schedule expression:以下のルールに基づいて適切に記述します。

http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-scheduled-events.html

この例では、日本時間9時~18時の毎時00分にインスタンス起動のスクリプトが走る設定となっています。

更に毎時30分にインスタンスを停止するスクリプトも走らせると、以下の様なグラフになります。うまく動いていますね。

2016-06-28_17h48_12

実際に利用する際には、社員の提示出社時間より早く立ち上げる必要があるので月~金の8:30に起動。
同じく定時退社後に停止する必要があるので月~金の19:30に停止、などの設定が実用的な例かと思います。停止については基本的には最終退出者が手動で電源を落とすオペレーションでもいいかもしれませんね。その場合にも22:00頃に設定して置いて、電源消し忘れを防ぐのが良いかもしれません。

 

以上、定時出社・定時退社のインスタンス操作方法でした。

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

SNSでもご購読できます。

コメントを残す