You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CDK部署后栈立即创建又删除的异常问题求助

AWS CDK子栈部署后立即被删除的问题排查与解决

问题现象

执行cdk deploy -c env=prod --all时,嵌套在父栈中的StatelessStack和StatefullStack创建后会立即被删除,仅父栈(含CDKMetadata)保留;单独部署一个子栈时行为正常,但部署第二个子栈时第一个会被自动删除;移除子栈实例化时的props和context参数后,资源可正常保留。

核心原因

你错误地将嵌套栈定义为普通Stack类,并且在实例化时传递了包含env的完整栈属性,导致CDK将这些子栈识别为独立的根栈而非父栈的嵌套资源,进而触发了错误的资源清理逻辑:

  1. 嵌套栈应继承NestedStack而非Stack,普通Stack类会被CDK视为独立根栈。
  2. 给子栈传递独立的env属性后,CDK将其判定为与父栈平级的根栈,多个根栈共享同一部署环境时,会引发资源冲突或异常清理行为。
  3. 移除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:验证修复效果

  1. 执行cdk synth -c env=prod检查生成的CloudFormation模板,确认嵌套栈被正确定义为父栈的嵌套资源。
  2. 执行cdk deploy -c env=prod --all,验证子栈及Lambda、DynamoDB资源可正常保留。

补充说明

  • NestedStack是CDK专门用于实现嵌套栈的类,会自动关联父栈的环境,无需单独指定env。
  • 独立根栈需明确指定env,而嵌套栈若指定env会被CDK误判为根栈,引发部署逻辑混乱。
  • 同一环境下部署多个独立根栈时,CDK的资源跟踪逻辑会出现异常,导致错误的资源清理。

内容的提问来源于stack exchange,提问作者jkalivas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 00:37:47