EC2インスタンスの停止・起動をLambdaのScheduled Eventで自動化してみる

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

Create a Lambda Function

  • 基本設定
デフォルトで作成していく
  • Edit code inline(停止用)
var AWS = require('aws-sdk'); 
AWS.config.region = 'ap-northeast-1';
var ec2 = new AWS.EC2();

var targetInstanceIds = [
    'i-XXXXXXXX',
    'i-YYYYYYYY'
];

exports.handler = function(event, context) {
    var params = {
        InstanceIds: targetInstanceIds
    };

    ec2.stopInstances(params, function(err, data) {
        if (err) {
            console.log(err, err.stack);
        } else {
            console.log(data);
            context.done(null, 'Stoped Instance');
        }
    });
};

※起動の場合はec2.stopInstances→ec2.startInstances

  • Role(停止用)
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents",
        "ec2:StopInstances"
      ],
      "Resource": [
        "arn:aws:logs:*:*:*",
        "arn:aws:ec2:*"
      ]
    }
  ]
}

※起動用の場合は"ec2:StopInstances"→"ec2:StartInstances"

Add Event Source(Scheduled Event)

  • Event source type
Scheduled Event
  • Schedule expression
cron(Minutes Hours Day-of-month Month Day-of-week Year)
※日または週日の値は疑問符である必要があります (?)。
設定対象 設定値
毎日10:00 (JST) cron(0 19 * * ? *)
毎週月曜~金曜の19:00 (JST) cron(0 10 ? * MON-FRI *)

UTC+9 - Wikipedia

テスト

  • Sample event template
Scheduled Event
  • テストコード
{
  "account": "XXXXXXXXXXXXXXXX",
  "region": "us-east-1",
  "detail": {},
  "detail-type": "Scheduled Event",
  "source": "aws.events",
  "time": "1970-01-01T00:00:00Z",
  "id": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "resources": [
    "arn:aws:events:us-east-1:123456789012:rule/my-schedule"
  ]
}

※プルダウンを選択するだけでいいです

  • テストの確認
Lambdaの画面下部のExecution result or Cloud WatchのLogs

※テストを実行した場合には実際にインスタンスは停止します