【AWS】全自動で52台のAurora DBをスナップショットから作成した話

# 経緯
大量のAurora DBをスナップショットから作成された経験がある方、
Auroraは1度に複数の作成できないため、非常に多くの時間がかかったことでしょう。

私の場合は、業務で52台のAurora DBを作成しました。
もし、AWS Consoleから作業をしていたら、1台最低5分、52台で260分かかります。
また、DBインスタンス作成後、パラメータグループの変更や、masterユーザのパスワード変更などの作業もしていましたので、合計で1.5人日の作業工数が予想されていました。

単純作業の繰り返しのため精神的負担があり、なにより、台数が多いためヒューマンエラーの発生リスクもあります。


そこで、Aurora DBの作成をAWS CLIで行い、
尚且つ、シェルスクリプト で任意の台数分を並列処理するようにしました。

# 実行コマンド
```
$ sh ./main.sh rds_instance_list.txt [スナップショット名]
```
引数1: DBインスタンス名を記載したファイル名
引数2: スナップショット名

以下、引数で指定したファイルの中身になります。
作成した個数分、インスタンス名を記載してください。

``` rds_instance_list.txt
aurora_db_test_1
aurora_db_test_2
aurora_db_test_3
・
・
・
```

# シャルスクリプト

``` main.sh
#!/bin/bash

rds_list=$1
snapshot=$2

echo "rds_list: ${rds_list}"
echo "snapshot: ${snapshot}"

log_dir="logs"
mkdir -p ${log_dir}

while read rds_instance
do

  echo ======================================================
  echo "rds_instance: ${rds_instance}"

  cmd="sh ./create_aurora_db.sh ${rds_instance} ${snapshot}"
  echo ${cmd}
  ${cmd} >> ${log_dir}/${rds_instance}.log &

done < ${rds_list}
```

``` create_aurora_db.sh
#!/bin/bash

# set the profile
profile="[プロファイル名]"

# set the RDS cluster parameter
rds_cluster=`echo $1`-cluster
snapshot=$2
db_subnet_group_name="[サブネットグループ名]"
vpc_security_group_ids="[セキュリティグループ名]"
db_cluster_parameter_group_name="[DB clusterパラメータグループ]"
master_user_password="[masterユーザー パスワード]"

# set the RDS instance parameter
rds_instance=$1
db_instance_class="[インスタンスサイズ]"
availability_zone="ap-northeast-1a"
db_parameter_group_name="[DBパラメータグループ]"

# create the RDS cluster
cmd="aws --profile ${profile} rds restore-db-cluster-from-snapshot --engine aurora --db-cluster-identifier ${rds_cluster} --snapshot-identifier ${snapshot} --db-subnet-group-name ${db_subnet_group_name} --vpc-security-group-ids ${vpc_security_group_ids}"
echo ${cmd}
${cmd}

  # wait until the cluster's status changed into available
  while true
  do
    sleep 600
    cmd="aws --profile ${profile} rds describe-db-clusters --filters Name=db-cluster-id,Values=${rds_cluster}"
    echo ${cmd}
    rds_status=`${cmd} | jq -r '.DBClusters[0].Status'`
    echo "status: ${rds_status}"
    if [ "${rds_status}" == "available" ];then
        break
    fi
  done

# modify the cluster's parameter group and master user password
cmd="aws --profile ${profile} rds modify-db-cluster --db-cluster-identifier ${rds_cluster} --db-cluster-parameter-group-name ${db_cluster_parameter_group_name} --master-user-password ${master_user_password}"
echo ${cmd}
${cmd}

# create the RDS instance
cmd="aws --profile ${profile} rds create-db-instance --engine aurora --db-cluster-identifier ${rds_cluster} --db-instance-identifier ${rds_instance} --db-instance-class ${db_instance_class} --availability-zone ${availability_zone} --db-parameter-group-name ${db_parameter_group_name} --no-multi-az --no-publicly-accessible"
echo ${cmd}
${cmd}

  # wait until the instance's status changed into available
  while true
  do
    sleep 600
    cmd="aws --profile ${profile} rds describe-db-instances --filters Name=db-instance-id,Values=${rds_instance}"
    echo ${cmd}
    rds_status=`${cmd} | jq -r '.DBInstances[0].DBInstanceStatus'`
    echo "status: ${rds_status}"
    if [ "${rds_status}" == "available" ];then
        break
    fi
  done

# reboot the RDS instance
cmd="aws --profile ${profile} rds reboot-db-instance --db-instance-identifier ${rds_instance}"
echo ${cmd}
${cmd}
```

# シェルスクリプトの説明

Auroraのスナップショットの実態はclusterになります。
なので、AWS CLIで行う場合は、
まずDB clusterを作成してから、DB instanceを作成する手順になります。

clusterのストレージ量にもよりますが、cluster作成に1時間以上を要します。
そのため、cluster作成後は、作成完了するまで無限ループをしています。

また、clusterの設定パラメータの変更（modify-db-cluster）が、即時反映されない場合もありましたので、
instanceの再起動を行っています。