AWSのEC2をLambdaでスケジュール設定して決まった曜日や時間だけ稼働させる方法
移転しました。
stagingのEC2インスタンスはデバッグ用にしか使っていないので、土日とか真夜中の時間帯は眠らせて、朝になったら起きる設定にした。その作業メモ。
こういうのを365日24時間稼働させておかないで、要らない時には眠らせておくとAWS様に支払う金額が割安にできる。そこで「本来なら**ドルもかかってるサーバーコストがオレ様の設定で低価格で済んでるんだぜ」と雇用主に言って、その差額分をボーナスとして貰ってください。
指定の日時にスタートする方とストップする方と2種類の設定が必要。2つとも大して違いはないけど、まずはスタートする方から。
1
Lambdaを出す。(もし使っているリージョンにLambdaが無ければ別リージョンへ移動する)
Create a Lambda functionのボタンを押す
2
Select blueprintはスキップする
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の設定画面へ飛ぶ
6
Roleを設定する
Role Nameにわかりやすい名前を設定
Policy Documentを表示してEditボタンを押す。
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」を押す
8
内容に間違いがないか確認して「Create function」を押す
9
「Test」ボタンを押すことで、止まっているインスタンスが動くことを確認する。
10
Event sourcesタブのAdd event sourceを押す
11
Event source typeでCloudWatch Events - Scheduleを選択する
スケジュール設定は「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 パターン別構築・運用ガイド 一番大切な知識と技術が身につく
- 作者: NRIネットコム株式会社,佐々木拓郎,林晋一郎,小西秀和,佐藤瞬
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2015/03/25
- メディア: Kindle版
- この商品を含むブログを見る
Amazon Web Services クラウドネイティブ・アプリケーション開発技法 一番大切な知識と技術が身につく (Informatics&IDEA)
- 作者: NRIネットコム株式会社,佐々木拓郎,佐藤瞬,石川修,高柳怜士,佐藤雄也,岸本勇貴
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2016/04/20
- メディア: 単行本
- この商品を含むブログ (1件) を見る