RDSの停止が出来るようになったので、
(http://dev.classmethod.jp/cloud/aws/start-stop-db-instance-for-rds/)
開発環境の節約を目指し停止と起動を自動化するスクリプトを書いて見ました。
動作前提
停止/起動したいRDSのインスタンスにタグを設定しておく
Lambdaコード
環境・・・ Nodejs(6.10)
module.export.startが起動用、module.export.stopが停止用のfunctionです。
index.js
'use strict';
const AWS = require('aws-sdk');
let describeDBInstances = (rds, tagQuery) => {
return new Promise((resolve, reject) => {
rds.describeDBInstances({}).promise().then(data => {
let promises = [];
data.DBInstances.forEach(DBInstance => promises.push(describeTagsFromDBInstance(rds,DBInstance)));
return Promise.all(promises);
}).then(results => {
let instance_ids = [];
results.forEach(result => {
for(let tag of result.TagList){
if(tagQuery.Name === tag.Key && tagQuery.Value === tag.Value){
instance_ids.push(result.DBInstanceIdentifier);
return;
}
}
});
if(instance_ids.length===0) reject('対象のインスタンスがありません。');
else resolve(instance_ids);
});
});
};
let describeTagsFromDBInstance = (rds,DBInstance) => {
return new Promise((resolve,reject) => {
rds.listTagsForResource({ResourceName:DBInstance.DBInstanceArn}).promise()
.then(data =>
resolve({
TagList: data.TagList,
DBInstanceIdentifier:DBInstance.DBInstanceIdentifier
})
)
.catch(err => reject(err));
});
};
module.exports.start = () => {
let rds = new AWS.RDS(),
tagQuery = {
Name: process.env.TAG_NAME,
Value: process.env.TAG_VALUE
};
describeDBInstances(rds,tagQuery)
.then(instance_ids => {
let promises = [];
instance_ids.forEach(instance_id => promises.push(rds.startDBInstance({DBInstanceIdentifier: instance_id}).promise()));
return Promise.all(promises);
})
.then(results => console.log(results))
.catch(err => console.log(err));
};
module.exports.stop = () => {
let rds = new AWS.RDS(),
tagQuery = {
Name: process.env.TAG_NAME,
Value: process.env.TAG_VALUE
};
describeDBInstances(rds,tagQuery)
.then(instance_ids => {
let promises = [];
instance_ids.forEach(instance_id => promises.push(rds.stopDBInstance({DBInstanceIdentifier: instance_id}).promise()));
return Promise.all(promises);
})
.then(results => console.log(results))
.catch(err => console.log(err));
};
設定など
- Lambdaの環境変数にて停止したいインスタンスのタグ情報となる「TAG_NAME」と「TAG_VALUE」を設定しておく。
- IAMのロールにて以下のようにRDSの操作ができるようにポリシーを設定する。
{
"Effect": "Allow",
"Action": "rds:*",
"Resource": "*"
}
コードの解説など
1.現在稼働中のRDSインスタンスを全て取得
2.取得したインスタンスに設定されているタグ情報を取得。Lambdaの環境変数に設定したものと一致するかチェック。
3.一致したタグを持つDBインスタンスを起動(停止)
その他
Promiseを利用して見たく勉強がてらふんだんに盛り込みました。