CDK部署后栈立即创建又删除的异常问题求助
AWS CDK子栈部署后立即被删除的问题排查与解决
问题现象
执行cdk deploy -c env=prod --all时,嵌套在父栈中的StatelessStack和StatefullStack创建后会立即被删除,仅父栈(含CDKMetadata)保留;单独部署一个子栈时行为正常,但部署第二个子栈时第一个会被自动删除;移除子栈实例化时的props和context参数后,资源可正常保留。
核心原因
你错误地将嵌套栈定义为普通Stack类,并且在实例化时传递了包含env的完整栈属性,导致CDK将这些子栈识别为独立的根栈而非父栈的嵌套资源,进而触发了错误的资源清理逻辑:
- 嵌套栈应继承
NestedStack而非Stack,普通Stack类会被CDK视为独立根栈。 - 给子栈传递独立的
env属性后,CDK将其判定为与父栈平级的根栈,多个根栈共享同一部署环境时,会引发资源冲突或异常清理行为。 - 移除
props参数后,子栈自动继承父栈的环境配置,被正确识别为嵌套栈,因此行为恢复正常。
修复方案
步骤1:将子栈基类改为NestedStack
修改StatelessStack和StatefullStack的继承类,并调整构造函数的属性类型:
修改后的StatelessStack代码
import { NestedStack, NestedStackProps } from "aws-cdk-lib"; import { Construct } from "constructs"; import { CDKContext } from "../types"; import * as lambda from "aws-cdk-lib/aws-lambda"; export class StatelessStack extends NestedStack { constructor( scope: Construct, id: string, props?: NestedStackProps, context?: CDKContext, ) { super(scope, id, props); const suffix = context?.suffix || "no-suffix"; const env = context?.env || "dev"; const hello = new lambda.Function(this, "HelloHandler", { runtime: lambda.Runtime.NODEJS_16_X, code: lambda.Code.fromAsset("lambda"), handler: "hello.handler", functionName: `${env}-hello-${suffix}`, }); } }
修改后的StatefullStack代码
import { aws_dynamodb, RemovalPolicy, NestedStack, NestedStackProps } from "aws-cdk-lib"; import { Construct } from "constructs"; import { CDKContext } from "../types"; export class StatefullStack extends NestedStack { constructor( scope: Construct, id: string, props?: NestedStackProps, context?: CDKContext, ) { super(scope, id, props); const suffix = context?.suffix || "no-suffix"; const env = context?.env || "dev"; const OrderTable = new aws_dynamodb.Table(this, "OrderTable", { tableName: `${env}-order-management-${suffix}`, partitionKey: { name: "orderId", type: aws_dynamodb.AttributeType.STRING, }, billingMode: aws_dynamodb.BillingMode.PAY_PER_REQUEST, timeToLiveAttribute: "ttl", removalPolicy: RemovalPolicy.DESTROY, }); } }
步骤2:调整父栈中子栈的实例化逻辑
在父栈中实例化子栈时,无需传递包含env的完整属性,嵌套栈会自动继承父栈的环境配置。仅在需要自定义嵌套栈属性(如标签)时传递NestedStackProps:
// 父栈CdkTsWorkshopStack构造函数中 new StatelessStack(this, "StatelessStack", undefined, context); new StatefullStack(this, "StatefullStack", undefined, context); // 如需自定义属性,例如添加标签: // new StatelessStack(this, "StatelessStack", { tags: { "Layer": "Stateless" } }, context);
步骤3:验证修复效果
- 执行
cdk synth -c env=prod检查生成的CloudFormation模板,确认嵌套栈被正确定义为父栈的嵌套资源。 - 执行
cdk deploy -c env=prod --all,验证子栈及Lambda、DynamoDB资源可正常保留。
补充说明
NestedStack是CDK专门用于实现嵌套栈的类,会自动关联父栈的环境,无需单独指定env。- 独立根栈需明确指定
env,而嵌套栈若指定env会被CDK误判为根栈,引发部署逻辑混乱。 - 同一环境下部署多个独立根栈时,CDK的资源跟踪逻辑会出现异常,导致错误的资源清理。
内容的提问来源于stack exchange,提问作者jkalivas
相关产品推荐
相关产品推荐

