🐿️

RDS Waiterが期待通りに動作しないときに

に公開

本題

以下のようなRDSの運用スクリプトを書いていました。

# インスタンスクラスを変更する
aws rds modify-db-instance --db-instance-identifier $instance_id --db-instance-class $taget_instance_class --apply-immediately
# インスタンスがavailable状態になるまで待つ
aws rds wait db-instance-available --db-instance-identifier $instance_id
# 後続の処理
...

RDSインスタンスの変更を行い、available状態になるのを待ってから後続の処理に移るというものです。

実はこのスクリプトは期待通りに動作しません。
なぜかというとModifyDBinstanceのAPI Callが送信されてからステータスがavailableからmodifyingになるまで一定の遅延があるため、変更処理を待たずしてWaiterが終了するからです。

どうすればよいかというと、追加の状態遷移を追跡する必要があります。つまり、
modifying -> available
ととらえていたものを、
available -> modifying -> available
という順序で遷移することを保証すればよいです。modifyingになるまで待つWaiterはCLIにないため、untilで実装します。

# available -> modifying
until [ $(aws rds describe-db-instances --db-instance-identifier $instance_id --query DBInstances[0].DBInstanceStatus --output text) == "modifying" ]
do
  sleep 2s
done
# modifying -> available
aws rds wait db-instance-available --db-instance-identifier $instance_id

補足

当初はsleepで一定時間待つような実装を考えていました。
10秒まてばほとんどのケースでmodifying状態に遷移しますが、より厳密にするなら上記のような対応が必要になると考えます。
RDSインスタンスの状態については下記を参照しました。
https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/accessing-monitoring.html
以上です。

Discussion