stgingで使っているEC2を停止するのを忘れてしまうということがよくありました。(主な犯人は僕です)手動で毎回止めるのもだるいし、人間は忘れっぽい生き物ですのでEC2のスケジュール停止をlambdaで実現しました。
設定の流れ
- EC2を停止するlambda関数を作成
- EC2をlambdaから停止・起動するためのIAMのロールを作成
- node.js で関数を実装
- テスト
- CloudWatch Eventsでスケジュール設定
EC2を停止するlambda関数を作成
「一から作成」で新規関数を作成します。
lambdaからEC2の起動・停止をするにあたり、IAMのロールを作成します。
ポリシーを編集します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents",
"ec2:StartInstances",
"ec2:StopInstances"
],
"Resource": [
"arn:aws:logs:*:*:*",
"arn:aws:ec2:*"
]
}
]
}
EC2を停止するための関数コードを入力します。
const INSTANCE_ID = '*****';
var AWS = require('aws-sdk');
AWS.config.region = '******'; // 東京リージョン: ap-northeast-1
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');
});
};
この段階で「テスト」を実行して以下のようになれば成功です。
CloudWatch Eventsでスケジュール設定
トリガータブで新規のトリガーを追加します。
こんな感じで18時に自動で止まるようにします。
cronの設定はUTCで時間を設定する必要があるので cron(0 9 * * ? *)
です。
平日だけなどのパターンは以下に記載されているので参考にしてください。
まとめ
これでヒューマンエラー・めんどくさい作業なしでEC2が止まるようになりました。
参考にしたLambdaのScheduleイベントでEC2を自動起動&自動停止してみたのパクリになってしまいましたが、AWSのUIが変わっていたりしていたので、新しいUIのキャプチャでも貼っておくかということで手順をまとめてみました。