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件) を見る