CDK で Auroraクラスタ を RETAIN 指定したのに cdk destroy で SubnetGroup が削除されて失敗した話と対処法
AWS CDK を使って Aurora Serverless v2(PostgreSQL)クラスタを構築していた際、
スタック削除時に クラスタの依存するDB サブネットグループ が削除され、cdk destroy
が異常終了する事象が発生しました。
今回はその原因と、削除ポリシーの適切な設定で解決した方法について共有します。
背景と構成
$ npx cdk --version
2.1013.0 (build 054afef)
AWS CDK(TypeScript)で、以下のような Aurora Serverless v2 構成を定義していました:
- Aurora Serverless v2 for PostgreSQL
- DB サブネットグループ は CDK により自動生成
- 誤削除を防ぐため、Aurora クラスタには
removalPolicy: RETAIN_ON_UPDATE_OR_DELETE
を設定
new rds.DatabaseCluster(this, "MyCluster", {
+ removalPolicy: RemovalPolicy.RETAIN_ON_UPDATE_OR_DELETE,
engine: rds.DatabaseClusterEngine.auroraPostgres({
version: rds.AuroraPostgresEngineVersion.VER_16_1,
}),
defaultDatabaseName: "defaultdb",
vpc,
+ vpcSubnets: {
+ subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS,
+ },
securityGroups: [dbSg],
serverlessV2MaxCapacity: 1,
serverlessV2MinCapacity: 0,
credentials: rds.Credentials.fromSecret(dbSecret),
writer: rds.ClusterInstance.provisioned("writer", {
autoMinorVersionUpgrade: true,
}),
});
※ 一部変数(vpc,dbSg,sbSecret など)の詳細を書いていませんが本筋と関係ないので略
発生した問題
この構成で cdk destroy を実行したところ、以下の問題が発生しました:
-
Aurora クラスタは
RETAIN_ON_UPDATE_OR_DELETE
により削除されず、想定通り残存 -
自動生成された DB サブネットグループ が削除対象となり、Aurora クラスタからの参照が残っていたため削除に失敗
-
CloudFormation スタックは
DELETE_FAILED
状態に遷移し、cdk destroy
全体が異常終了
原因
DatabaseCluster
が削除されず残っている状態で、関連リソースである DB サブネットグループが削除されようとしたため、依存関係の不整合が発生し削除失敗につながりました。
CDK が自動生成する DB サブネットグループには削除ポリシーが明示されず、デフォルトでは DESTROY
となるため、このような矛盾が生じたようです。
解決策:DBSubnetGroup を明示的に定義し、削除ポリシーを揃える
自動生成に任せず、DB サブネットグループを自前で定義し、Aurora クラスタと同じ削除ポリシーRETAIN_ON_UPDATE_OR_DELETE
を設定することで、Aurora クラスタと同様に保護されるようにしました。
+ const dbSubnetGroup = new rds.SubnetGroup(this, 'DbSubnetGroup', {
+ removalPolicy: RemovalPolicy.RETAIN_ON_UPDATE_OR_DELETE,
+ description: 'Subnet group for Aurora Serverless v2',
+ vpc,
+ vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS },
});
new rds.DatabaseCluster(this, 'MyCluster', {
removalPolicy: RemovalPolicy.RETAIN_ON_UPDATE_OR_DELETE,
engine: rds.DatabaseClusterEngine.auroraPostgres({
version: rds.AuroraPostgresEngineVersion.VER_16_1,
}),
defaultDatabaseName: "defaultdb",
vpc,
- vpcSubnets: {
- subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS,
- },
+ subnetGroup: dbSubnetGroup,
securityGroups: [dbSg],
serverlessV2MaxCapacity: 1,
serverlessV2MinCapacity: 0,
credentials: rds.Credentials.fromSecret(dbSecret),
writer: rds.ClusterInstance.provisioned("writer", {
autoMinorVersionUpgrade: true,
}),
});
まとめ
-
Aurora Serverless v2 を
RETAIN_ON_UPDATE_OR_DELETE
に設定する際、その設定が依存するリソースにも同じ削除ポリシーを設定する必要がある -
自動生成されるリソースは
removalPolicy
が明示されていないため、手動で定義・設定することがトラブル回避につながる -
削除ポリシーの不整合は、
cdk destroy
時のスタック削除失敗の原因となる
以上、Aurora Serverless v2 環境における CDK 利用時の削除ポリシー設計に関する注意点のご紹介でした。
本記事が CDK を扱う方の参考になれば幸いです。