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
相关产品推荐
相关产品推荐

