awsのlambdaとcron(lamron[ラムロン])を使用して、指定した時間にEC2インスタンスを起動&停止する処理を作成します。
起動と停止をするEC2インスタンスの指定は、EC2のタグで判定します。
準備
以下の設定を行っている前提です。
- IAMでLambdaにec2関連APIの使用許可を設定
- EC2インスタンスに起動と停止を判定するタグを設定(後述するスクリプトに記載してあるタグ)
Lambdaに起動&停止Functionを作成
lambdaに起動&停止のFunctionを以下のスクリプトを参考に作成してください。
lambdaFunctionを作成するときは、
- 各自起動&停止したい時間のcronを設定
- 今回はスクリプト作成にnode.jsを使用
- 実行する関数名は「handler」
起動スクリプト
// 起動するec2インスタンスのタグ設定 // この場合、キー名が「lambda:start」、値が「default-first」 var targetInstanceParam = { Filters: [ { Name: 'tag-key', Values: ['lambda:start']// ec2インスタンスに設定するキー名 }, { Name: 'tag-value', Values: ['default-first']// ec2インスタンスに設定する値 }, ] }; var AWS = require('aws-sdk'); AWS.config.region = 'ap-northeast-1'; // 各自の環境に合わせてリージョンを設定 function ec2Start(cb){ var ec2 = new AWS.EC2(); var targetInstanceIds = []; // 指定したタグが設定されているec2インスタンスを取得 ec2.describeInstances(targetInstanceParam, function(err, data) { if (err) console.log(err, err.stack); else if(data.Reservations.length === 0) { console.log("don't find ec2"); } else { // 取得できた場合、そのec2インスタンスのidを取得し起動 for (var index in data.Reservations) { var instance = data.Reservations[index].Instances[0]; console.log("instanceId = " + instance.InstanceId); targetInstanceIds.push(instance.InstanceId); } var params = { InstanceIds: targetInstanceIds }; 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'); // ec2インスタンス起動処理 ec2Start(function() { context.done(null, 'Started Instance'); }); };
停止スクリプト
// 停止するec2インスタンスのタグ設定 // この場合、キー名が「lambda:stop」、値が「default-first」 var targetInstanceParam = { Filters: [ { Name: 'tag-key', Values: ['lambda:stop']// ec2インスタンスに設定するキー名 }, { Name: 'tag-value', Values: ['default-first']// ec2インスタンスに設定する値 }, ] }; var AWS = require('aws-sdk'); AWS.config.region = 'ap-northeast-1'; // 各自の環境に合わせてリージョンを設定 function ec2Start(cb){ var ec2 = new AWS.EC2(); var targetInstanceIds = []; // 指定したタグが設定されているec2インスタンスを取得 ec2.describeInstances(targetInstanceParam, function(err, data) { if (err) console.log(err, err.stack); else if(data.Reservations.length === 0) { console.log("don't find ec2"); } else { // 取得できた場合、そのec2インスタンスのidを取得し停止 for (var index in data.Reservations) { var instance = data.Reservations[index].Instances[0]; console.log("instanceId = " + instance.InstanceId); targetInstanceIds.push(instance.InstanceId); } var params = { InstanceIds: targetInstanceIds }; 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'); // ec2インスタンス停止処理 ec2Start(function() { context.done(null, 'Stoped Instance'); }); };