ベルリンのITスタートアップで働くジャバ・ザ・ハットリの日記

日本→シンガポール→ベルリンへと流れ着いたソフトウェアエンジニアのブログ

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

移転しました。

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

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


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

1

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

Create a Lambda functionのボタンを押す
f:id:tango_ruby:20160614155608p:plain

2

Select blueprintはスキップする
f:id:tango_ruby:20160614155703p:plain

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の設定画面へ飛ぶ
f:id:tango_ruby:20160614160644p:plain:W500

6

Roleを設定する
Role Nameにわかりやすい名前を設定
Policy Documentを表示してEditボタンを押す。
f:id:tango_ruby:20160614160854p:plain:W500

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」を押す
f:id:tango_ruby:20160614161445p:plain

8

内容に間違いがないか確認して「Create function」を押す
f:id:tango_ruby:20160614161556p:plain:W400

9

「Test」ボタンを押すことで、止まっているインスタンスが動くことを確認する。
f:id:tango_ruby:20160614161649p:plain:W300

10

Event sourcesタブのAdd event sourceを押す
f:id:tango_ruby:20160614161718p:plain:W400

11

Event source typeでCloudWatch Events - Scheduleを選択する
f:id:tango_ruby:20160614161909p:plain:W400

スケジュール設定は「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
  • メディア: 単行本
  • この商品を含むブログ (1件) を見る


tango-ruby.hatenablog.com

tango-ruby.hatenablog.com

tango-ruby.hatenablog.com