はじめに
先日、AWSの課金を見ていたら、思いのほかRDSの課金が高いなと感じました。対象期間で使用したRDSは作ったらすぐさま消していたので、ちょっとした違和感を覚えたのが始まりだったのですが、よく見てみるとスナップショットに課金されていることがわかりました。なぜスナップショットが残ったままになっているのかを検証するためのこの記事を書いています。
原因
構築したRDSは以下のようにCDKを使って作成していました。
const rdsInstance = new DatabaseInstance(this, 'RDSInstance', { instanceIdentifier: 'MyRDSTestMySQLDB', vpc: vpc, engine: DatabaseInstanceEngine.MYSQL, instanceType: InstanceType.of(InstanceClass.T3, InstanceSize.MICRO), databaseName: 'mysqldb', multiAz: false, subnetGroup: dbSubnetGroup, securityGroups: [rdsSg], });
ここでremovalPolicy
を指定していません。これが今回の原因です。以下ドキュメントにある通り、デフォルト値がRemovalPolicy.SNAPSHOT
となっているため、削除時にスナップショットが作成されたことになります。
料金ページを見ると、DB インスタンス終了後のバックアップストレージの料金は毎月 USD 0.095/GiB です。
という記述があり、ここの部分の課金がされたみたいです。
対処
直接的な対処は、スナップショットを削除すればOKです。
スナップショットを残さないようにするためには、removalPolicy
をRemovalPolicy.DESTROY
のように明示的に指定してあげればOKです。
考察
今回はremovalPolicy
を明示的に指定しなかったばっかりに思わぬ課金が発生したことを事例として紹介しました。removalPolicy
は本番環境などを想定した場合ですと現在のデフォルト値であるRemovalPolicy.SNAPSHOT
は非常に理にかなっているのですが、検証用などの場合はちょっとデフォルト値がマッチしないことになります。
ここらへん課金対象の何かが残っているか否かを簡単にチェックできる仕組みなどがあればいいんですが、なさそうなのがちょっと残念なところ。せめてできることと言えば、課金情報はこまめにチェックするといったところでしょうか。