はじめに
最近CDKを触っていて、cdk destroy
でスタックを削除したにも関わらず、料金が発生していることがありました。
原因は、スタック削除後にもリソースが残ってしまっていたことでしたので、今回はその対応について記載をしていきます。
今回対応したリソースはS3とRDSになります。
1. S3
以下のようにデフォルト値でS3バケットを作成すると、スタックを削除してもS3バケットは残る設定となっています。
※DeletionPolicyが Retain
のため
new s3.Bucket(this, 'Bucket', {
});
スタック削除時にバケットも削除するには以下のようにパラメータを追加します。
これにより、DeletionPolicyが Delete
に変更され、スタック削除時にバケットも削除する挙動となります。
new s3.Bucket(this, 'Bucket', {
removalPolicy: cdk.RemovalPolicy.DESTROY,
});
ただし、S3バケットはバケット内のオブジェクトが空でないと削除ができません。
そのため、スタックが削除される際に、すべてのオブジェクトを自動的に削除されるようautoDeleteObjects
パラメータを追加します。
new s3.Bucket(this, 'Bucket', {
removalPolicy: cdk.RemovalPolicy.DESTROY,
autoDeleteObjects: true,
});
2. RDS
デフォルト値でRDSのデータベースを作成すると、スタックを削除時に最終スナップショットが取得され、料金が発生します。
※DeletionPolicyが Snapshot
となっているため。
スナップショットを取得せずに削除するには、以下のようにremovalPolicyをDESTROY
に設定します。
new rds.DatabaseInstance(this, 'RdsInstance', {
removalPolicy: cdk.RemovalPolicy.DESTROY, // default: SNAPSHOT
engine: rds.DatabaseInstanceEngine.mysql({
version: rds.MysqlEngineVersion.VER_8_0_40,
}),
vpc: props.vpc,
vpcSubnets: {
subnetType: ec2.SubnetType.PRIVATE_ISOLATED,
},
});
これによりDeletionPolicyが Delete
に変更され、スタック削除時にスナップショットを取得せずにRDSインスタンスが削除されるようになります。
まとめ
CDKは、少ない記述量でリソースを設定できるだけでなく、リソース間の権限を自動的に適切な設定を行ってくれるため、細かく記述する手間を省ける点が便利です。
一方で、コードに明示的に記述していないリソースが生成されることもあり、その把握が難しいと感じることがあります。
今回の対応についてはCloudFormationの仕様に関する部分が大きかったですが、ナレッジを蓄えられてよかったです。