LoginSignup
8
8

More than 5 years have passed since last update.

AWS RDSを起動/停止できるLambda Functionを書いて見た

Posted at

RDSの停止が出来るようになったので、
(http://dev.classmethod.jp/cloud/aws/start-stop-db-instance-for-rds/)
開発環境の節約を目指し停止と起動を自動化するスクリプトを書いて見ました。

動作前提

停止/起動したいRDSのインスタンスにタグを設定しておく

スクリーンショット 2017-06-13 12.12.09.png

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」を設定しておく。

スクリーンショット 2017-06-13 12.24.35.png

  • IAMのロールにて以下のようにRDSの操作ができるようにポリシーを設定する。
{
  "Effect": "Allow",
  "Action": "rds:*",
  "Resource": "*"
}

コードの解説など

1.現在稼働中のRDSインスタンスを全て取得
2.取得したインスタンスに設定されているタグ情報を取得。Lambdaの環境変数に設定したものと一致するかチェック。
3.一致したタグを持つDBインスタンスを起動(停止)

その他

Promiseを利用して見たく勉強がてらふんだんに盛り込みました。

8
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8