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

AWS CDK部署不同栈时旧API Gateway资源被删除的问题

问题原因及解决办法

为啥旧API会被删?

CDK是声明式的基础设施代码工具,核心逻辑是:每个栈部署时,会把当前栈代码定义的资源和AWS实际资源对比,删掉代码里没提到的“多余”资源。

你的场景里,API Gateway在独立的BackendApiCloudfrontStack栈中,但每个后端栈都通过createLambdaService直接给这个API添加路径和方法。当部署新后端栈时,新栈的代码只包含自身要添加的API资源,CDK会把之前其他栈添加的资源判定为“代码未定义的多余资源”,进而删除以对齐当前栈的定义。

说白了就是:每个后端栈都在修改同一个API,但CDK默认认为每个栈只能管理自己定义的资源,其他栈添加的都会被当作冗余内容删掉。

怎么解决?

1. 集中管理API资源(最稳妥方案)

把所有API的路径、方法统一放到BackendApiCloudfrontStack栈中定义,后端栈只负责创建Lambda函数,再由API栈完成Lambda与API路径的关联。

具体操作思路:

  • 在API栈中预先定义好所有需要的API路径
  • 后端栈创建Lambda后,用CfnOutput输出Lambda的ARN
  • API栈通过Fn.importValue引用这些ARN,为对应API路径添加Lambda集成

2. 给跨栈API资源加唯一标识

如果必须在多个后端栈中添加API资源,要给每个栈创建的路径、方法加上唯一前缀,保证资源的CDK逻辑ID不重复,让CDK识别这些资源属于各自的后端栈,而非API栈。

修改createLambdaService中的路径创建逻辑:

// 用服务名做前缀,确保不同栈的路径ID不冲突
const uniqueRouteName = `${props.serviceName}-${routeName}`;
const currentPath = api.root.addResource(uniqueRouteName);

3. 临时救急:阻止API资源被删除

如果需要临时避免删除,可以在创建RestApi时添加保留策略,这样即使CDK判定资源冗余,也不会执行删除操作:

this.restApi = new apigateway.RestApi(this, `${gatewayName}-REST-Gateway`, {
  description: gatewayName,
  deployOptions: {
    stageName: 'prod',
  },
  defaultCorsPreflightOptions: { /* 你的CORS配置 */ },
  removalPolicy: cdk.RemovalPolicy.RETAIN // 添加这一行
});

注意:这只是临时方案,长期来看仍需理顺跨栈资源管理逻辑,否则会堆积大量无人维护的API资源。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 00:54:59