EC2インスタンス(開発環境)を夜間停止し、さらに祝日にも対応させる
EC2インスタンスを利用しない夜間と祝日は停止させて、平日の朝に起動する
というのをやりたくていろいろググってました。
どっかでcron的なものを回さなければならないんだけど、
どうやらみなさんLambdaを利用しているらしい。
EC2の起動・終了
これだけやれば、夜間停止と朝の起動はできそうだ。
後は祝日対応なんだけど、このスクリプトに付け足していろいろ頑張ってみようと思う。
祝日判定
これ利用すれば良さそう。
DebugMessageをSlackに流したい
これを利用すると良い
最終的なソース
function slack_post(message) { var Slack = require('slack-node'); webhookUri = "__WebHookURL__"; slack = new Slack(); slack.setWebhook(webhookUri); slack.webhook({ channel: "#general", username: "LambdaNotification", text: message, }, function(err, response) { console.log(response); }); }; function holiday_check() { var JapaneseHolidays = require('japanese-holidays'); var today = new Date(); var holiday = JapaneseHolidays.isHoliday(today); if(holiday) { return true; } else { return false; } }; function ec2_start() { var AWS = require('aws-sdk'); AWS.config.update({region: 'ap-northeast-1'}); var ec2 = new AWS.EC2(); var params = { InstanceIds: [ 'INSTANCE_ID', 'INSTANCE_ID' ] }; ec2.startInstances(params, function(err, data) { if (!!err) { console.log(err, err.stack); slack_post(err); } else { console.log(JSON.stringify(data)); slack_post(JSON.stringify(data)); } }); }; exports.handler = function(event, context) { var holiday = holiday_check(); var message = ""; if (holiday) { message = "今日は祝日のため、サーバーの起動は行いません。" console.log(message); slack_post(message) return ; } else { message = "今日は平日です。サーバーの起動を行います。" console.log(message); slack_post(message) ec2_start(); } }
停止する場合は、ec2.startInstances
をec2.stopInstances
に変更するだけで停止処理にできます。
functionの名前も変えて利用してくださいね。
おまけ
沖縄は6/23に慰霊の日というものがあって、その日は祝日になったりします。
(企業さんによっては仕事なんだけど)
japanese-holiday-jsでは、日本の祝日は網羅してあるんだけど、
地方で定められた祝日は対応できないので、どうにかしてがんばってみる。
ソフトウェア/javascript/japanese-holidays - 武内@筑波大
japanese-holiday-jsの開発者さんのページに山の日を追加したときの対応が書かれてて
これなら楽にメンテできそうだったので、uchina-holidays-js
を作成して公開しました。
作成後に気づいたけど、
慰霊の日は普通に仕事だった...(ToT)