はじめに
今私のチームではビルドサーバを利用しています。 でも、ビルドサーバって営業時間外って基本的に使わないよね〜ってことで、夜間は停止したいと思っていました。 でも、毎日AWSのコンソールに入って起動したり、停止したりするのは面倒ですよね? そこで “EC2 自動停止” とかぐぐってみると Lambda と CloudWatch でできるとあったので、やってみました。
Lambda 設定
- “Lambda 関数の作成” から実行する関数の定義をします
- “設計図の選択”でブランク関数を選択し次へ
- “トリガーの設定” は、ここでは何も設定せずに次へ(あとでやります)
- “関数の設定” では以下の項目を各種設定します。
- 名前
- 説明
- 設定する関数の言語
- “Lambda 関数のコード” にEC2 インスタンスを起動するコードを入力します
- “Lambda 関数ハンドラおよびロール” で実行に必要なロールをアタッチします。
- 設定内容を確認して関数を作成します。
起動時のコードは以下のようになります。
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 を発火させるための設定を行います。
- CloudWatch で “ルールの作成” をします。
- “ルールの作成” でスケジュールを選択しCron式を選択します。
- Cron式で、起動したい時間を指定します。
- 起動する時間は平日の 9:30 としました
- “ターゲット” で先程作成した関数名を指定します。
- “ルールの詳細を設定する” で以下の項目を入れてルールを作成します。
- 名前
- 説明
- 状態(これは有効のまま)
30 0 ? * MON-FRI *
以上で、平日の9:30 にビルドサーバが起動するようになりました。 停止は ‘instance.start()’ を ‘instance.stop()’ にすれば可能です。 現在は、平日の21:30に停止するようにしています。
高橋克幸
新卒3年目で脱新人を目指してます。
フロントに興味を持ち始めた今日このごろ。
趣味は 麻雀 プログラミング 音楽。
運動不足を感じているため、ダンスを始めようかと思っています。