目次

目次

Lambda + CloudWatch で EC2 インスタンスを自動起動・停止

高橋克幸
高橋克幸
最終更新日2017/07/04 投稿日2017/07/04

はじめに

今私のチームではビルドサーバを利用しています。 でも、ビルドサーバって営業時間外って基本的に使わないよね〜ってことで、夜間は停止したいと思っていました。 でも、毎日AWSのコンソールに入って起動したり、停止したりするのは面倒ですよね? そこで “EC2 自動停止” とかぐぐってみると Lambda と CloudWatch でできるとあったので、やってみました。

Lambda 設定

  1. “Lambda 関数の作成” から実行する関数の定義をします
  2. “設計図の選択”でブランク関数を選択し次へ
  3. “トリガーの設定” は、ここでは何も設定せずに次へ(あとでやります)
  4. “関数の設定” では以下の項目を各種設定します。
    • 名前
    • 説明
    • 設定する関数の言語
  5. “Lambda 関数のコード” にEC2 インスタンスを起動するコードを入力します
  6. “Lambda 関数ハンドラおよびロール” で実行に必要なロールをアタッチします。
  7. 設定内容を確認して関数を作成します。

起動時のコードは以下のようになります。

import boto3

instanceId = 'i-0000000123456789e'
instance = boto3.resource('ec2').Instance(instanceId)
statusDict = {'pending'      : 0,
              'running'      :16,
              'shutting-down':32,
              'terminated'   :48,
              'stopping'     :64,
              'stopped'      :80 
             }

def instanceStart():
    state = instance.state
    stateCode = state['Code']
    if stateCode == statusDict['stopped']:
        resp= instance.start()
        if resp['ResponseMetadata']['HTTPStatusCode'] != 200:
            raise Exception('ec2 start error', resp)
    else:
        raise Exception('ec2 start error',
                        'Instance [' + instanceId + '] is already running')
    return 'success'

def lambda_handler(event, context):
    try:
        return instanceStart()
    except Exception as e:
        print e

以下実行に必要なロールです

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

CloudWatch の設定

CloudWatch で Lambda を発火させるための設定を行います。

  1. CloudWatch で “ルールの作成” をします。
  2. “ルールの作成” でスケジュールを選択しCron式を選択します。
  3. Cron式で、起動したい時間を指定します。
  • 起動する時間は平日の 9:30 としました
  1. “ターゲット” で先程作成した関数名を指定します。
  2. “ルールの詳細を設定する” で以下の項目を入れてルールを作成します。
  • 名前
  • 説明
  • 状態(これは有効のまま)
30 0 ? * MON-FRI *

以上で、平日の9:30 にビルドサーバが起動するようになりました。 停止は ‘instance.start()’ を ‘instance.stop()’ にすれば可能です。 現在は、平日の21:30に停止するようにしています。

高橋克幸

新卒3年目で脱新人を目指してます。
フロントに興味を持ち始めた今日このごろ。
趣味は 麻雀 プログラミング 音楽。
運動不足を感じているため、ダンスを始めようかと思っています。

目次