[アップデート] Amazon RDS でスナップショットリストア時のストレージ初期化進捗が確認できるようになりました
いわさです。
Amazon RDS でスナップショットからリストアすると、バックグラウンドで S3 からデータブロックをストレージボリュームにダウンロードする初期化処理が走ります。
この初期化が完了する前でもインスタンスには接続してクエリを実行できるのですが、まだダウンロードされていないブロックへアクセスするとその都度 S3 から取得が発生するので(lazy loading と呼ばれます)、I/O レイテンシーが通常より高くなる可能性があります。
この仕様の課題なのですが、初期化中もインスタンスのステータスは available なんですよね。
これまではストレージの初期化がいつ完了するかを直接知る手段がなく、パフォーマンスがいつ安定するかの判断が難しかったようです。
先日のアップデートで、DescribeDBInstances API のレスポンスに StorageOperationStatus と StorageOperationPercentProgress フィールドが追加され、ストレージボリュームの初期化進捗をリアルタイムで確認できるようになりました。
なお、ストレージの最適化(Optimization)については 2023 年 7 月にプログレスインジケーターが追加[1]されていましたが、今回のアップデートで初期化(Initialization)についても同じフィールドで進捗が確認できるようになっています。
今回こちらを確認してみたので紹介します。
実際に確認してみる
東京リージョンで検証します。
検証用の DB インスタンスのスナップショットを取得し、そこからリストアしてみます。
aws rds restore-db-instance-from-db-snapshot \
--db-instance-identifier hoge-restored-db \
--db-snapshot-identifier hoge-snapshot \
--db-instance-class db.t3.micro \
--no-multi-az \
--no-publicly-accessible
リストア直後の状態
リストアが開始された直後、コンソールを見ると画面上部にバナーで「ストレージの初期化が進行中」と表示されています。
設定タブのプライマリストレージセクションにも「ストレージオペレーションのステータス: 初期化中です」「ストレージオペレーションの進行状況: 0%」が確認できます。

CLI で describe-db-instances を叩いてみても同様です。
aws rds describe-db-instances \
--db-instance-identifier hoge-restored-db \
--query 'DBInstances[0].{Status:DBInstanceStatus,StorageOperationStatus:StorageOperationStatus,StorageOperationPercentProgress:StorageOperationPercentProgress}'
{
"Status": "creating",
"StorageOperationStatus": "Initializing",
"StorageOperationPercentProgress": 0
}
インスタンスのステータスがまだ creating の段階から StorageOperationStatus に Initializing が出ていますね。
available になっても初期化は続いている
しばらく待つとインスタンスのステータスが「利用可能」に変わりますが、初期化のバナーはまだ残っています。

CLI でも確認してみます。
{
"Status": "available",
"StorageOperationStatus": "Initializing",
"StorageOperationPercentProgress": 0
}
ここがまさに今回のアップデートのポイントですね。
従来は available になった時点で初期化が終わっているのかどうかを判断する手段がなかったのですが、StorageOperationStatus を見ることで「available だけどストレージの初期化はまだ終わっていない」状態を把握できるようになりました。
初期化完了後
公式ドキュメントによると、初期化が完了するとこれらのフィールドはレスポンスから消えるみたいです。
During initialization, StorageOperationStatus is set to Initializing, and both fields are absent when initialization is complete.
実際にしばらく経ってからコンソールを見ると、バナーもプライマリストレージセクションのステータス表示も消えています。

CLI でも確認します。
aws rds describe-db-instances \
--db-instance-identifier hoge-restored-db \
--query 'DBInstances[0].{Status:DBInstanceStatus,AllocatedStorage:AllocatedStorage,StorageOperationStatus:StorageOperationStatus,StorageOperationPercentProgress:StorageOperationPercentProgress}'
{
"Status": "available",
"AllocatedStorage": 20,
"StorageOperationStatus": null,
"StorageOperationPercentProgress": null
}
StorageOperationStatus と StorageOperationPercentProgress が返らなくなっています(--query で指定しているので null として表示)。
これが「初期化完了」の合図ということですね。
ストレージスケールアップで Optimizing を確認する
同じフィールドでストレージの最適化(Optimization)進捗も確認できます。
元のインスタンスのストレージを 20GB から 30GB にスケールアップしてみます。
aws rds modify-db-instance \
--db-instance-identifier hoge-source-db \
--allocated-storage 30 \
--apply-immediately
しばらく待ってから確認すると、こちらは Optimizing ステータスとパーセンテージが表示されます。
aws rds describe-db-instances \
--db-instance-identifier hoge-source-db \
--query 'DBInstances[0].{Status:DBInstanceStatus,StorageOperationStatus:StorageOperationStatus,StorageOperationPercentProgress:StorageOperationPercentProgress}'
{
"Status": "storage-optimization",
"StorageOperationStatus": "Optimizing",
"StorageOperationPercentProgress": 4
}
こちらはインスタンスのステータス自体も storage-optimization に遷移しています。
StorageOperationPercentProgress で最適化の進捗パーセンテージが確認できますね。初期化の方は Initializing、最適化の方は Optimizing と、同じフィールドで用途ごとに値が使い分けられています。
通常のインスタンスではフィールドが存在しない
スナップショットからのリストアでもストレージ変更でもないインスタンスでは、これらのフィールドは返されません。
aws rds describe-db-instances \
--db-instance-identifier hoge-source-db \
--query 'DBInstances[0].{AllocatedStorage:AllocatedStorage,StorageType:StorageType,StorageOperationStatus:StorageOperationStatus,StorageOperationPercentProgress:StorageOperationPercentProgress}'
{
"AllocatedStorage": 20,
"StorageType": "gp2",
"StorageOperationStatus": null,
"StorageOperationPercentProgress": null
}
--query で指定しているので null として表示されていますが、実際のフル JSON レスポンスにはフィールド自体が含まれていません。
なるほどね。ストレージ操作が進行中のときだけフィールドが出現し、完了すると消える。シンプルな設計です。
さいごに
本日は Amazon RDS にストレージボリューム初期化の可視性が追加されたので確認してみました。
available になってもストレージの初期化が完了していない、という状況がリストア後に存在し得ることは今回の検証で確認できました。
それが API やコンソールで判断できるようになったので、デプロイメントパイプラインで初期化完了をポーリングしてからトラフィックを切り替える、といった制御がやりやすくなりそうです。
今回 20GB の小さなストレージで検証したため StorageOperationPercentProgress は 0% のまま初期化が完了してしまいました。
大容量ストレージの場合は進捗の変化がもっと見えるのかもしれないです。







