経緯
大量の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: スナップショット名
以下、引数で指定したファイルの中身になります。
作成した個数分、インスタンス名を記載してください。
aurora_db_test_1
aurora_db_test_2
aurora_db_test_3
・
・
・
シャルスクリプト
#!/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}
#!/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の再起動を行っています。