📦

AWS CLIでRDSのDBインスタンスをリストア・待機・削除

2021/04/30に公開

業務にて、

  1. Fargate上でシェルスクリプトを実行
  2. スナップショットからDBを立ち上げて
  3. 処理を行ったあと
  4. DBを削除する
    という流れの処理を行う必要がありました。

シェルスクリプトでAWS CLIを利用してDBのリストア・待機・削除する方法を記しておきます。

環境変数はECSタスク定義内のコンテナ定義に記述しています。

DBのリストア

スナップショットからの立ち上げは
restore-db-instance-from-db-snapshot
https://awscli.amazonaws.com/v2/documentation/api/latest/reference/rds/restore-db-instance-from-db-snapshot.html

# --db-instance-identifier
# 立ち上げ後のDBインスタンス名
# --vpc-security-group-ids
# 設定するセキュリティグループid
# --db-subnet-group-name
# どのサブネット内にインスタンスを立ち上げるか指定
restore_db_instance_from_snapshot() {
  # コマンドの出力を他のコマンドの引数に使用すると終了ステータスは無視されてしまう
  # localコマンドと変数への代入を分けることでエラーを無視させないようにできる
  local snapshot_identifier
  snapshot_identifier=`find_latest_snapshot_identifier`

  echo "[start]restore db instance $DB_INSTANCE_IDENTIFIER from snapshot $snapshot_identifier"

  local security_group_id
  security_group_id=`find_security_group_id`

  aws rds restore-db-instance-from-db-snapshot \
    --db-instance-identifier "$DB_INSTANCE_IDENTIFIER" \
    --db-snapshot-identifier "$snapshot_identifier" \
    --vpc-security-group-ids "$security_group_id" \
    --db-subnet-group-name "$DB_SUBNET_GROUP_NAME"

  echo "[end]restore db instance $DB_INSTANCE_IDENTIFIER from snapshot $snapshot_identifier"
}

# --snapshot_type
# スナップショットはRDSによって自動で作成されるよう設定したり、手動で作成したりできる
# どの方法によって作成されたものを取得するのかを設定できる
# --query
# 取得の仕方やどの項目を取得するか設定できる
# 作成日時の昇順を逆転させた一番目、つまり最新のもの1件を取得し、
# そのDBSnapshotIdentifierを取得している
find_latest_snapshot_identifier() {
  local snapshot_type="automated"

  local identifier
  identifier=`aws rds describe-db-snapshots \
    --db-instance-identifier $HOGE_DB_INSTANCE_IDENTIFIER \
    --snapshot-type $snapshot_type \
    --query 'reverse(sort_by(DBSnapshots,&InstanceCreateTime))[0].DBSnapshotIdentifier'`
  echo "$identifier" | sed 's/"//g'
}

find_security_group_id() {
  local security_group_id
  security_group_id=`aws ec2 describe-security-groups \
    --group-names $RDS_SECURITY_GROUP_NAME \
    --query SecurityGroups[0].GroupId`
  echo "$security_group_id" | sed 's/"//g'
}

DB立ち上げ待機

restore_db_instance_from_snapshotでDBを立ち上げることはできますが、立ち上がって接続ができる状態になるまでは待ってくれません。
このまま後続の処理を実行すると接続できずにエラーが出てしまします。
それをwait db-instance-availableで、DBが利用可能になるまで待機することができます。
https://awscli.amazonaws.com/v2/documentation/api/latest/reference/rds/wait/db-instance-available.html

wait_db_instance_available() {
  echo "[start]wait db instance $DB_INSTANCE_IDENTIFIER available"
  aws rds wait db-instance-available --db-instance-identifier "$DB_INSTANCE_IDENTIFIER"
  echo "[end]wait db instance $DB_INSTANCE_IDENTIFIER available"
}

DB削除

delete-db-instanceで削除します。
https://awscli.amazonaws.com/v2/documentation/api/latest/reference/rds/delete-db-instance.html

# --skip-final-snapshot
# 削除前にスナップショットを残さないようにする
delete_db_instance() {
  echo "[start]delete db instance $DB_INSTANCE_IDENTIFIER"
 
  aws rds delete-db-instance \
    --db-instance-identifier "$DB_INSTANCE_IDENTIFIER" \
    --skip-final-snapshot

  echo "[end]delete db instance $DB_INSTANCE_IDENTIFIER"
}

Discussion