ジャバ・ザ・ハットリ
Published on

AWSのEC2をLambdaでスケジュール設定して決まった曜日や時間だけ稼働させる方法

Authors
  • avatar
    ジャバ・ザ・ハットリ

staging の EC 2インスタンスはデバッグ用にしか使っていないので、土日とか真夜中の時間帯は眠らせて、朝になったら起きる設定にした。その作業メモ。

こういうのを365日24時間稼働させておかないで、要らない時には眠らせておくと AWS 様に支払う金額が割安にできる。そこで「本来なら**ドルもかかってるサーバーコストがオレ様の設定で低価格で済んでるんだぜ」と雇用主に言って、その差額分をボーナスとして貰ってください。

指定の日時にスタートする方とストップする方と2種類の設定が必要。2つとも大して違いはないけど、まずはスタートする方から。

1

Lambda を出す。(もし使っているリージョンに Lambda が無ければ別リージョンへ移動する)

Create a Lambda function のボタンを押す

image

2

Select blueprint はスキップする

image

3

Configure function を設定する。
Name は分かりやすく、Start EC2 <プロジェクト名>などが入っていれば Ok か、と。
Description はお好きなように。
Runtime は Node.js 4.3

4

Lambda function code に以下のコードを入れる。
1 行目の INSTANCE_ID = '*******';には Instance ID を入れる。Instance ID は AWS > EC2 > Instance のインスタンス表に出ている。
AWS.config.region = '********';にはリージョンを入れる。例 ap-southeast-1 リージョンの最後は数字。アルファベットではない

const INSTANCE_ID = '*******'

var AWS = require('aws-sdk')
AWS.config.region = '********'

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')
  })
}

5

Lambda function handler and role を設定する。
Role で Basic execution role を選択すると、IAM の設定画面へ飛ぶ

image

6

Role を設定する
Role Name にわかりやすい名前を設定
Policy Document を表示して Edit ボタンを押す。

image

Policy Document を以下の内容に書き換える

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

保存して Role の作成が完了したら、Lambda に戻る

7

Advanced settings はそのままにして「Next」を押す

image

8

内容に間違いがないか確認して「Create function」を押す

image

9

「Test」ボタンを押すことで、止まっているインスタンスが動くことを確認する。

image

10

Event sources タブの Add event source を押す

image

11

Event source type で CloudWatch Events - Schedule を選択する

image

スケジュール設定は「Schedule expression」に入れた内容で決定される。

詳しくはここ

例)
Invoke Lambda function every 5 minutes
5分ごとに実行

    rate(5 minutes)

Invoke Lambda function at 06:00pm (UTC) every Mon-Fri
月曜から金曜の午後6時(UTC)に実行。時刻は全て UTC なので自分の意図する時間帯への変換が必要。

    cron(0 18 ? \* MON-FRI \*)

12

「submit」ボタンを押したら完了。

13

指定の時刻にストップする設定は Lambda function code に貼り付けるコード(手順4)がこれ。

const INSTANCE_ID = '******'

var AWS = require('aws-sdk')
AWS.config.region = '*********'

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')
  })
}

Role(手順6)がこれ

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

後は名前以外、全て同じ。

IP アドレスが毎日変わる

もし指定したインスタンスに Elastic IP を付けてなかったら毎日寝て起きてする度に IP アドレスが変更される。capistrano などの設定上、それが不便なら Elastic IP を付ける。

以上。

Amazon Web Services パターン別構築・運用ガイド  一番大切な知識と技術が身につく
Amazon Web Services パターン別構築・運用ガイド  一番大切な知識と技術が身につく
作者: NRI ネットコム株式会社,佐々木拓郎,林晋一郎,小西秀和,佐藤瞬
出版社/メーカー: SB クリエイティブ
発売日: 2015/03/25
メディア: Kindle 版

Amazon Web Services クラウドネイティブ・アプリケーション開発技法 一番大切な知識と技術が身につく (Informatics&IDEA)
Amazon Web Services クラウドネイティブ・アプリケーション開発技法 一番大切な知識と技術が身につく (Informatics&IDEA)
作者: NRI ネットコム株式会社,佐々木拓郎,佐藤瞬,石川修,高柳怜士,佐藤雄也,岸本勇貴
出版社/メーカー: SB クリエイティブ
発売日: 2016/04/20
メディア: 単行本

関連記事