AWS CodeBuildを使って、AWS RDSのインスタンタイプを自動で変更する

クラウドソリューション事業部の倉岡です。

AWSのCodebuildを使ってRDSのスペック変更をボタン一つで行いたいと依頼があったので、やり方を備忘録として記載しておきます。

主に2つ方法がありまして

・S3とCodebuildで実行する
S3にRDSのスペックを変更させるシェルスクリプトを配置してCodebuildで実行する方法です。

・Codebuild単体を使う
Codebuild単体でRDSのスペック変更を行う方法です。

今回は1つ目の「S3とCodebuildで実行する」方法を記載します。

前提条件
RDSはAmazon Aurora
リーダーインスタンス
ライターインスタンスの2台

前提:RDSから作成して実験したい方へ

上の検索欄からRDSと入力しRDSサービスに遷移します。東京リージョンになっていることを確認してください。その後、オレンジの「データベースの作成」を押して以下の設定をします。

標準作成、Amazon Aurosa それ以外の項目は以下のようにして基本触らないでください。

〜〜〜〜〜〜〜〜〜〜〜〜〜〜

テンプレートは「開発/テスト」DBクラスター識別子は「test-database」にします。パスワードは自動生成しておきます。※中に入ることはないのでパスワードは今回控えなくても大丈夫です。

DBインスタンスは「バースト可能クラス」「dbt3.small」にします。リードレプリカは作成しておきます。

接続はデフォルトにします。何も変更点はありません。

各設定が終わったあと一番下の作成を押し、少し置いておきます。

※作成ボタン押した直後2つインスタンスが両方リーダーインスタンスという場合がありますが、利用可能のステータスになるとライターインスタンスとリーダーインスタンスに分かれますのでご安心ください。変わらない場合はページをリロードしてください。

RDSは立ち上がるまで時間がかかるため放置します。利用可能になる間にIAMロールの設定を行いましょう。

1.IAMロールの設定

AWSのCode buildで使うIAMロールの設定を行います。上の検索欄からIAMと入力しIAMサービスに遷移します。

左のメニュー画面のアクセス管理のロールをクリックその後ロールの作成を押します。

サービスの中にcode buildがあるのでクリックします。

次のステップアクセス権限に移行して、「検索窓に」

・AmazonS3FullAccess
・AmazonRDSFullAccess

順に2つを入力して追加していきます。追加したら次に進みタグは設定不要です。最後に名前を「 rds-codebuild-test」にします。

※AmazonS3DataFullAccessなど似ているものがあります。注意してください。
※検証のため付与している権限が強いのです。そのため本番時は必要な権限のみ許可するようにしてください。

左メニューのロールから先ほど作ったIAMロール「rds-codebuild-test」にアクセスしこのように作成できていたらOKです。

2.S3に以下のシェルスクリプトを置く

S3サービスにアクセスしバケットを作成します。オレンジの「バケットを作成」をクリックします。バケット名を「rds-scale-change」にして、東京リージョンになっていることを確認後、あとは何もいじらずにバケットを生成します。

2.1.S3に置くファイルの作成

続いて以下のシェルスクリプトを自身のPC内で

buildspec.yml
rds-scale.sh

の二つのファイルを作ります。ファイルの中身は以下のようになっており

buildspec.yml

version: 0.2
phases:
  #install:
  build:
    commands:
       - sh ./rds-scale.sh ${SPEC}

rds-scale.sh

#!/bin/sh
instance[0]=“ここにライターインスタンス”
instance[1]=“ここに”リーダーインスタンス”

for ((i=0; i<2; i++)) do
  aws rds modify-db-instance \
    --db-instance-identifier ${instance[i]} \
    --db-instance-class ${SPEC} \
    --apply-immediately
    sleep 60
    aws rds wait db-instance-available --db-instance-identifier ${instance[i]}
done

となります。今回はテストでrds作成を行なっていることもあるため

#!/bin/sh
cnt=0
instance[0]="test-database-instance-1"
instance[1]="test-database-instance-1-ap-northeast-1a"

for ((i=0; i<2; i++)) do
  aws rds modify-db-instance \
    --db-instance-identifier ${instance[i]} \
    --db-instance-class ${SPEC} \
    --apply-immediately
  sleep 60
  while [ aws rds describe-db-instances --db-instance-identifier ${instance[i]} --query DBInstances[].[DBInstanceStatus] --output text -eq "available" ]
   do
    sleep 60
    cnt=`expr 1 + $cnt`
    if [ 100 = $cnt ]; then
     break
    fi
  done
done

となります。

※コピペした際に「”」がおかしくなる場合があります。もしShell文でエラーが出た場合はコピペした中の「”」を1度削除して手入力で再度入力してください。

このファイルを作成後、先ほど作成したS3バケットにアップロードします。先ほど作成したバケットにアクセスしてオレンジの「アップロード」を選択後ファイルを追加してください。バケットの中が以下のようになっていればOKです。

3.Codebuildの設定

上の検索欄からCode buildと入力しCode buildサービスに遷移します。東京リージョンになっていることを確認してください。

その後「プロジェクトの作成」を押してプロジェクト名「rds-specup」とします。説明も同様にします。

ソースはAmazon S3を選択しバケットは先ほど作成したrds-scale-changeにします。「S3 オブジェクトキーまたはS3フォルダ」は「/」にします。

環境下はAmazon linux2 ,ランタイムはStandard、イメージは今回は3.0を使用します。バージョンは常に最新のものを使います。サービスロールは既存のサービスロールを選択後先ほど「IAMロール」で作成したrds-codebuild-testを選択します。

環境の下に追加設定という項目が存在しそこの「環境変数」に以下のように記述してください。

あとは何も触ることなく下まで行って作成ボタンを押してください。

4実際に実行!

ビルドプロジェクトからrds-specupを選択してbuildを開始をクリック

あとは待っていると先ほどdb.t3.smallのrdsがライターインスタンスから順にdb.t3.mediumに変更されてると思います。

※ちなみにrdsのスペック変更自体時間がかかるということもあり、コードビルドは進行中のまま5分から10分ほどはそのままになるのでお気になさらず気軽に待ちましょう。

いかがでしょうか。もし戻したい場合は、環境変数をdb.t3.smallなどに変更してあげるとスペックダウンがボタン一つで可能です。ビルドプロジェクトに「rds-specup」「rds-specdown」などのプロジェクトなどを作っておけば、急なrdsスペック変更などにもボタン一つで対応できます。

手作業でスペック変更しなくて良いのは楽ですね。