🐥
[小ネタ]Auroraクラスターを丸ごと消すshellスクリプト
やりたいこと
Auroraクラスターを削除する機会があり、
「クラスターStart」
→ (待つ)
→ 「インスタンスを全部消す」
→ (待つ)
→ 「クラスターを消す」
というのが面倒なのでまとめられないかとやってみました。
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