LoginSignup
11
5

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-07-24

経緯

大量の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の再起動を行っています。

11
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
5