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)
Reference
이 문제에 관하여(Javascript로 RDS 시작 및 중지를 제어하고 절약), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/y-tkbridge/items/f8ff67effd942b4da256
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
[プロファイル名]
aws_access_key_id = xxxxxx
aws_secret_access_key = xxxxxx
$yarn add @slack/web-api @slack/events-api
$yarn add aws-sdk
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識別子>
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)
Reference
이 문제에 관하여(Javascript로 RDS 시작 및 중지를 제어하고 절약), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/y-tkbridge/items/f8ff67effd942b4da256텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)