🐥

[小ネタ]Auroraクラスターを丸ごと消すshellスクリプト

2023/01/08に公開

やりたいこと

Auroraクラスターを削除する機会があり、

「クラスターStart」
→ (待つ)
→ 「インスタンスを全部消す」
→ (待つ)
→ 「クラスターを消す」

というのが面倒なのでまとめられないかとやってみました。

RDS waitを使う

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/rds/wait/index.html#cli-aws-rds-wait

rdsの状態に応じて待ってくれるコマンドです。完了するまで30秒ごとにポーリングして、対象が完了していたら何も返さず終了します。

今回は、available・deleteを待つコマンドを使っています。

スクリプト

  • cluster=<your_cluster> に対象DB identifier(database-1など)を入力
  • bash delte_cluster.sh などで実行
delete_cluster.sh
cluster=<your_cluster>

# export AWS_DEFAULT_REGION=<not_default_region>

aws rds start-db-cluster --db-cluster-identifier $cluster > /dev/null
echo "Start cluster..."
aws rds wait db-cluster-available --db-cluster-identifier $cluster

delete_protection=$(aws rds describe-db-clusters --db-cluster-identifier $cluster | \
		         jq -r .DBClusters[].DeletionProtection)

if [ "$delete_protection" == "true" ]; then
  echo "Update delete protection..." $cluster
  echo "Try: aws rds modify-db-cluster --db-cluster-identifier" $cluster "--no-deletion-protection"
  exit 1
fi

# If replica cluster, promote and delete
is_replica=$(aws rds describe-db-clusters --db-cluster-identifier $cluster | \
		         jq -r .DBClusters[].ReplicationSourceIdentifier)

if [ "$is_replica" != "null" ]; then
  echo "Promote cluster before delete..." $cluster
  aws rds promote-read-replica-db-cluster --db-cluster-identifier $cluster > /dev/null
  aws rds wait db-cluster-available --db-cluster-identifier $cluster
fi

# Get instance name as list
items=$(aws rds describe-db-clusters --db-cluster-identifier $cluster | \
		    jq -r .DBClusters[].DBClusterMembers[].DBInstanceIdentifier)
SAVEIFS=$IFS   # Save current IFS
IFS=$'\n'      # Change IFS to new line
items=($items) # split to array $items
IFS=$SAVEIFS   # Restore IFS

for db_instance in "${items[@]}"
do
  echo "Delete instance..." $db_instance
  aws rds wait db-instance-available --db-instance-identifier $db_instance
  aws rds delete-db-instance --db-instance-identifier $db_instance --skip-final-snapshot > /dev/null
  aws rds wait db-instance-deleted --db-instance-identifier $db_instance
done

echo "Delete cluster..." $cluster
aws rds delete-db-cluster --db-cluster-identifier $cluster --skip-final-snapshot > /dev/null
aws rds wait db-cluster-deleted --db-cluster-identifier $cluster
echo "Finished."
  • ReadReplicaIdentifiersに入るクロスリージョンレプリカ(CRR)は先に削除します
    • export AWS_DEFAULT_REGION=us-east-2などを最初に入れる
    • CRRのクラスター名を入れて実行する→プロモートしてから消す
  • 失敗したときは途中から開始しても大丈夫(なはず)
  • ClusterのDeletion Protectionがあるときはエラーで止まります
  • SAVEIFS=$IFSらへんは、文字列をリストに変換しています
  • インスタンスは同時に消せますが、ここでは1つずつ消しています。非同期でもできそうですが・・・

Discussion