「自動増量」は便利だが、一度増えたら戻せない。その盲点にやられた。
Cloud SQLにはストレージの自動増量(Storage Auto Increase)という機能がある。ディスク使用率が一定の閾値を超えると自動でストレージを拡張してくれる安全装置だ。便利な機能だと思って、管理するCloud SQLインスタンス全てに設定していた。
問題が起きたのは、ある検証作業がきっかけだった。本番データの統計を取るために、バックアップから本番環境のデータを本番のCloud SQLインスタンスに一時的にフルインポートした。インポート中にディスク使用量が急増し、自動増量が何度か走ってストレージが100GBから400GBに拡張された。作業が終わってインポートしたデータを削除すると、ディスク使用量は元の30GB程度に戻った。
「では400GBのディスクを元に戻そう」と思ってGCPコンソールを確認すると、縮小のボタンがない。ドキュメントを読むと「Cloud SQLのストレージは縮小できない」と書いてある。縮小したければデータをエクスポートして新しいインスタンスを作り、インポートし直すしかない。本番環境でそれをやるには相応のメンテナンス時間が必要で、ダウンタイムを許容できるタイミングまで待つしかなかった。
Cloud SQLのストレージ料金は$0.17/GB/月だ。300GBの余剰ストレージが毎月$51(約7,000円)の無駄になり続けた。それが6ヶ月続いて累計4万円超えの損失になった。同じことが複数のインスタンスで起きており、全部合わせると無視できない金額になっていた。
自動増量には「最大ストレージサイズ」の上限を設定するオプションがある。デフォルトでは上限なしで際限なく拡張されるが、上限を設定すればそれ以上は増えない。実際の最大データ量を見積もって、上限をその1.5〜2倍程度に設定しておくべきだった。
また、一時的な大量データの処理は本番インスタンスで直接やらないルールも作った。検証や一括処理専用のCloud SQLインスタンスを別途起動して、処理が終わったらインスタンスごと削除する方式にした。Terraformで管理していればterraform destroyで綺麗に消せる。Cloud SQLインスタンスを新規作成するときのチェックリストに「自動増量の上限を設定する」「ストレージは必要最小限から始める」の2項目を追加した。設定を一度見直すだけで防げる問題だったのに、気づくまでに時間とコストがかかった。こういう「仕様を読んでいれば防げた」系の失敗が一番悔しい。