BFT名古屋 TECH BLOG

日々の業務で得た知識を所属するエンジニアたちがアウトプットしていきます。

【AWS】RDSをスクリプトで制御してみた

はじめに

こんにちは、沖縄大好きBFT名古屋支店 マカビです!
AWS RDSのDBインスタンスの起動状態を管理するスクリプトを作成したのでご紹介します!

作成までの経緯

検証用にDBインスタンスを作成しましたが、業務時間外など使用しない場合は毎回AWSマネジメントコンソールを経由してDBインスタンスを停止していました。また、DBインスタンスは停止から7日後に自動起動するので状態確認を行うことも同じ手順で行っていました。
しかし、マネジメントコンソールに毎回アクセスして起動や停止を行うことは大変だったのでスクリプトを作成することになりました。

前提条件

  • 作業PC(Windows10)にAWS CLIv2がインストールされていること
     ※AWS CLIのインストール手順についてはこちら
  • AWS RDSを操作できるロールのプロファイルが作成されていること
     ※AWS CLIのスイッチロールについてはこちら
  • DBインスタンスが存在すること

使用コマンド

スクリプト内で使用するAWS CLIのコマンドをご紹介します。
※各コマンドをクリックすると公式リファレンスにアクセスします。

コマンド 説明
describe-db-instances DBインスタンスに関する情報を出力する
start-db-instance 停止中のDBインスタンスを起動する
stop-db-instance 起動中のDBインスタンスを停止する

スクリプト

今回作成したスクリプトは大きく分けて3つの構成となります。

  1. 変数 :プロファイルやDBインスタンス名などを変数に格納している部分
  2. 関数 :DBインスタンスの起動や停止などの処理を関数にした部分
  3. 主処理:作成した関数を合わせた部分
1.変数
#AWS RDSを操作できるロールにスイッチするプロファイル名
$CliPrf = "<プロファイル名>"
#ターゲットとなるDBインスタンス名
$TgtRDS = "<DBインスタンス名>"

$DscRDS = aws rds describe-db-instances --profile $CliPrf --output text --db-instance-identifier $TgtRDS | select -First 1
$RDSAry = $DscRDS.Split("`t")
$RDSNam = $RDSAry[10]
$RDSSts = $RDSAry[11]
2.関数

2-1. 初期状態をメッセージボックスで表示する関数

function InitialSts {
    Add-Type -Assembly System.Windows.Forms
    [System.Windows.Forms.MessageBox]::Show("状態変更しますか?`r`nRDS:$RDSNam`r`nステータス:$RDSSts", "RDS状態","YesNo","Question","Button2")
}

2-2. DBインスタンスを起動する処理関数
停止させる場合は、下記関数の文言や変数名、コマンドを変更し作成します。

function StartRDS {
    Add-Type -AssemblyName System.Windows.Forms
    $YesNoStt = [System.Windows.Forms.MessageBox]::Show("RDSの起動を実行しますか?`r`n※注意:ステータスが「stopped」の場合のみ、「Yes」を押してください。`r`nRDS:$RDSNam`r`nステータス:$RDSSts","RDS起動","YesNo","Question","Button2")

    IF ($YesNoStt -eq "Yes"){
       #停止の場合は以下のコマンドを変更する
        aws rds start-db-instance --db-instance-identifier $TgtRDS --profile $CliPrf
        while ($true) {
            $DscRDSStt = aws rds describe-db-instances --profile $CliPrf --output text --db-instance-identifier $TgtRDS | select -First 1
            $RDSAryStt = $DscRDSStt.Split("`t")
            $RDSNamStt = $RDSAryStt[10]
            $RDSStsStt = $RDSAryStt[11]

      #停止の場合は条件が"Stopped"となる
            IF ($RDSStsStt -eq "Available"){
                Add-Type -AssemblyName System.Windows.Forms
                [System.Windows.Forms.MessageBox]::Show("RDSインスタンス停止完了`r`nRDS:$RDSNamStt`r`nステータス:$RDSStsStt","RDS停止確認")
                break
            }
            Write-Host "RDSインスタンス停止待機中`r`nRDS:$RDSNamStt`r`nステータス:$RDSStsStt`r`n"
            Start-Sleep -Seconds 60
        }

    }Else{
        Add-Type -AssemblyName System.Windows.Forms
        [System.Windows.Forms.MessageBox]::Show("処理が中断されました。","処理中断","OK","Asterisk","Button1")
    }

}

※DBインスタンスのステータスについて詳細はこちら

2-3. 最終状態をメッセージボックスで表示する関数

function LatestSts {
    $DscRDSLst = aws rds describe-db-instances --profile $CliPrf --output text --db-instance-identifier $TgtRDS | select -First 1
    $RDSAryLst = $DscRDS.Split("`t")
    $RDSNamLst = $RDSAry[10]
    $RDSStsLst = $RDSAry[11]

        Add-Type -Assembly System.Windows.Forms
        [System.Windows.Forms.MessageBox]::Show("現在の状態です。`r`nRDS:$RDSNamLst`r`nステータス:$RDSStsLst", "RDS最新状態","OK","None","button1")
}
3.主処理

作成した関数を使用したものが主処理となります。

$Initrst = InitialSts
    IF ($Initrst -eq "Yes"){
       IF ($RDSSts -eq "Stopped"){
            StartRDS
            LatestSts
       }
       ELSE{
            StopRDS
            LatestSts
       }
    }
    ELSE{
           LatestSts
    }

おわりに

DBインスタンスの起動状態を管理するスクリプトを作成しました。
あまりこのようなスクリプトを作成したことはなかったので、良い機会だったと感じています。
今回はメッセージボックスにYes/Noを答えて制御するものですが、そこを改良すればタスクスケジューラやcronで定期的に起動状態を制御することも可能になると思います。