📦
AWS CLIでRDSのDBインスタンスをリストア・待機・削除
業務にて、
- Fargate上でシェルスクリプトを実行
- スナップショットからDBを立ち上げて
- 処理を行ったあと
- DBを削除する
という流れの処理を行う必要がありました。
シェルスクリプトでAWS CLIを利用してDBのリストア・待機・削除する方法を記しておきます。
環境変数はECSタスク定義内のコンテナ定義に記述しています。
DBのリストア
スナップショットからの立ち上げは
restore-db-instance-from-db-snapshot
# --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が利用可能になるまで待機することができます。
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
で削除します。
# --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