Javascript로 RDS 시작 및 중지를 제어하고 절약

한 일 요약



RDS 시작 및 중지 스크립트를 작성하여 cron에서 영업 시간 동안만 시작하도록 제어합니다.

왜 하려고 했는가?



개발 환경을 업무 시간 이외의 시간에 가동시키면 돈이 아깝다
react를 공부하고 javascript가 생각했던 것보다 재미 있었기 때문에 뭔가를 만들고 싶었습니다.

시도한 소감



dash 라는 스니펫 툴로 과금하면 공식 문서를 간단하게 볼 수 있어 문언으로 검색할 수 있었던 것이 몹시 편리하고 문서를 찾는 수고가 꽤 없었기 때문에 살아났습니다


자바 스크립트를 작성하는 방법을 이해하지 못했지만 앞으로 react를 만지는 과정에서 익숙해지기를 원합니다.

구현한 내용



사전 준비



※ RDS를 제어 가능한 권한을 가진 iam 자격 증명을 사용합니다.

~/.aws/credential
[プロファイル名]
aws_access_key_id = xxxxxx
aws_secret_access_key = xxxxxx

aws-sdk 및 @slack/web-api 설치
$yarn add @slack/web-api @slack/events-api
$yarn add aws-sdk

crontab 샘플



이것을 cron 로 기동시와 종료시를 지정해 호출하고 있습니다


PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed

#開発環境のDBを平日(月 ~ 金の 8時 ~ 19時)稼働制御
## dev01-03(jty)
00 8 * * 1,2,3,4,5 root node <配置したディレクトリパス>/dev-rds-controler.js start <RDS識別子>
00 19 * * 1,2,3,4,5 root node <配置したディレクトリパス>/dev_rds_controler.js stop <RDS識別子>


node의 구현 샘플



const AWS = require('aws-sdk');
const { WebClient } = require('@slack/web-api')

//#### Slack
const slackNotifiCation = async (message) => {
  const token = '<SlackのトークンID>'
  const channel = '<通知するチャンネル名>'

  const client = new WebClient(token)
  const params = {
    channel: channel,
    text: message
  }
  const response = await client.chat.postMessage(params)
  //console.log(response)
}

const credentials = new AWS.SharedIniFileCredentials({profile: 'プロファイル名'});
AWS.config.credentials = credentials;

//利用する環境のリージョンを指定する
AWS.config.update({region: '<利用するリージョンを指定する>'}); // 東京とか→「ap-northeast-1」

// Create RDS object
const rds = new AWS.RDS({apiVersion: '2014-10-31'})


// RDS AZを停止する
const fetch_rds_az = {
  // RDSパラメータ定義
  params:{
    DBInstanceIdentifier: ''
  },
  dbInstanceParams:"",
  // RDS の情報を取得
  getRdsStatus: async function(){
    await rds.describeDBInstances(this.params).promise()
      .then(data => {
          this.dbInstanceParams = data.DBInstances[0]
        }
      ).catch(err => {
        console.log(err)
      })
  },
  fetchRdsParams: async function(){
    await this.getRdsStatus()
    await console.log(this.dbInstanceParams.DBInstanceStatus)
  },
  rdsController: async function(commandParam){
    await this.fetchRdsParams()
    switch (commandParam){
      case 'start':
        if(this.dbInstanceParams.DBInstanceStatus === 'available'){
          slackNotifiCation(`${this.dbInstanceParams.DBInstanceIdentifier}は起動中だよ!`)
          break
        }
        rds.startDBInstance(this.params).promise()
          .then(data => {
            slackNotifiCation(`${this.dbInstanceParams.DBInstanceIdentifier}を起動するよ!`)
          }).catch( err => {
            slackNotifiCation(`【test】起動処理中にエラー発生 message:${err}`)
            slackNotifiCation(`【test】起動処理中にエラー発生 message:${this.dbInstanceParams.DBInstanceStatus}`)
          }
        )
        break

      case 'stop':
        console.log('stop')
        if(this.dbInstanceParams.DBInstanceStatus === 'stopped'){
          slackNotifiCation(`${this.dbInstanceParams.DBInstanceIdentifier}は停止中だよ!`)
          break
        }
        rds.stopDBInstance(this.params).promise()
          .then(data => {
            slackNotifiCation(`${this.dbInstanceParams.DBInstanceIdentifier}を停止するよ!`)
          }).catch( err => {
            slackNotifiCation(`【test】停止処理中にエラー発生 message:${err}`)
            slackNotifiCation(`【test】停止処理中にエラー発生 message:${this.dbInstanceParams.DBInstanceStatus}`)
          }
        )
        break

      case 'watch': // RDS の AZ を監視するためのメソッド
        await this.getRdsStatus()
        const currentAz = this.dbInstanceParams.AvailabilityZone
        const rdsInstance = this.dbInstanceParams.DBInstanceIdentifier
        await slackNotifiCation(`【test】${rdsInstance}${currentAz}で稼働しています`)
        break


      default:
        console.log('arg params is Inappropriate ')
        slackNotifiCation(`残念でしたー、コマンド実行時の引数に誤りがあります${commandParam}`)
        break
    }
  }
}

//##>> コマンド引数を取得する( $node env-dev-rds-controller watch |start | stop)
const commandParam = process.argv[2].toString()

//##>> 起動、停止するDBのインスタンス情報を指定する
const targetRds = process.argv[3].toString()
fetch_rds_az.params.DBInstanceIdentifier = targetRds


//##>> 起動・停止するRDSの指定をオブジェクト内として実行
fetch_rds_az.rdsController(commandParam)



좋은 웹페이지 즐겨찾기