CDKで作ってすぐに消したRDSに対して思いのほか料金が高かった件

はじめに

先日、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となっているため、削除時にスナップショットが作成されたことになります。

docs.aws.amazon.com

料金ページを見ると、DB インスタンス終了後のバックアップストレージの料金は毎月 USD 0.095/GiB です。という記述があり、ここの部分の課金がされたみたいです。

aws.amazon.com

対処

直接的な対処は、スナップショットを削除すればOKです。

スナップショットを残さないようにするためには、removalPolicyRemovalPolicy.DESTROYのように明示的に指定してあげればOKです。

考察

今回はremovalPolicyを明示的に指定しなかったばっかりに思わぬ課金が発生したことを事例として紹介しました。removalPolicyは本番環境などを想定した場合ですと現在のデフォルト値であるRemovalPolicy.SNAPSHOTは非常に理にかなっているのですが、検証用などの場合はちょっとデフォルト値がマッチしないことになります。

ここらへん課金対象の何かが残っているか否かを簡単にチェックできる仕組みなどがあればいいんですが、なさそうなのがちょっと残念なところ。せめてできることと言えば、課金情報はこまめにチェックするといったところでしょうか。