CDK で Auroraクラスタ を RETAIN 指定したのに cdk destroy で SubnetGroup が削除されて失敗した話と対処法

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 を扱う方の参考になれば幸いです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.