Yak shaving logs


My life is just yak shaving.

[EC2のスケジュール 停止・起動] 会社から帰る時にスケジュール実行したlambdaからEC2(staging)をとめる

2017/10/04 #aws #lambda #EC2

stgingで使っているEC2を停止するのを忘れてしまうということがよくありました。(主な犯人は僕です)手動で毎回止めるのもだるいし、人間は忘れっぽい生き物ですのでEC2のスケジュール停止をlambdaで実現しました。

設定の流れ

  1. EC2を停止するlambda関数を作成
    • EC2をlambdaから停止・起動するためのIAMのロールを作成
    • node.js で関数を実装
    • テスト
  2. CloudWatch Eventsでスケジュール設定

EC2を停止するlambda関数を作成

「一から作成」で新規関数を作成します。

https://gyazo.com/3a46795ca6ed2019674451fa7c40c265

lambdaからEC2の起動・停止をするにあたり、IAMのロールを作成します。

https://gyazo.com/890e460ddafeeb2aa003495293c8fe17

ポリシーを編集します。

https://gyazo.com/554b539050c1208cf8192ac161091941

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

EC2を停止するための関数コードを入力します。

const INSTANCE_ID = '*****';

var AWS = require('aws-sdk'); 
AWS.config.region = '******'; // 東京リージョン: ap-northeast-1

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

  ec2.stopInstances(params, function(err, data) {
    if (!!err) {
      console.log(err, err.stack);
    } else {
      console.log(data);
      cb();
    }
  });
}

exports.handler = function(event, context) {
  console.log('start');
  ec2Stop(function() {
    context.done(null, 'Stoped Instance');
  });
};

この段階で「テスト」を実行して以下のようになれば成功です。

https://gyazo.com/88457ba6a983ca0785092d8ab60056c9

CloudWatch Eventsでスケジュール設定

トリガータブで新規のトリガーを追加します。

https://gyazo.com/dc62eb7532e618d4a67dd29558b73cbd

こんな感じで18時に自動で止まるようにします。

https://gyazo.com/ab5e6d877d9775a50b6af2cba6e68bb1

cronの設定はUTCで時間を設定する必要があるので cron(0 9 * * ? *) です。
平日だけなどのパターンは以下に記載されているので参考にしてください。

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

まとめ

これでヒューマンエラー・めんどくさい作業なしでEC2が止まるようになりました。

参考にしたLambdaのScheduleイベントでEC2を自動起動&自動停止してみたのパクリになってしまいましたが、AWSのUIが変わっていたりしていたので、新しいUIのキャプチャでも貼っておくかということで手順をまとめてみました。

参考

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

このエントリーをはてなブックマークに追加

categories


最新記事


tags