如何配置serverless-plugin-split-stacks降低根栈资源数量?
解决serverless-plugin-split-stacks根栈资源过多的问题
问题原因分析
你遇到的根栈资源反而增加的情况,本质是每个嵌套栈本身会在根栈中生成一个AWS::CloudFormation::Stack资源。当调大nestedStackCount或开启perFunction: true时,子栈数量暴增,根栈里新增的Stack资源数量超过了迁移出去的资源数,最终导致根栈资源总量上升。
可行解决方案
1. 优化插件核心配置,平衡子栈数量与迁移效率
优先采用perType分组策略,配合适中的nestedStackCount,避免子栈数量爆炸:
splitStacks: perType: true # 同类型资源打包到同一个子栈,减少子栈数量 nestedStackCount: 10 # 控制子栈总数,避免根栈新增过多Stack资源 perFunction: false perGroupFunction: false
这个配置会把所有同类型资源(比如所有Lambda函数、所有DynamoDB表)分别打包到对应子栈,既迁移大量资源,又不会让根栈新增太多子栈资源。
2. 自定义规则强制迁移根栈残留资源
插件默认不会迁移部分资源(比如IAM角色、Lambda层),可以通过customize规则强制指定这些资源迁移到子栈:
splitStacks: perType: true customize: # 把所有IAM角色迁移到专门的子栈 - resourceType: AWS::IAM::Role destination: IAMResourcesStack # 把所有Lambda层迁移到专门的子栈 - resourceType: AWS::Lambda::LayerVersion destination: LambdaLayersStack
3. 手动拆分嵌套栈
如果插件自动拆分效果有限,可以直接在serverless.yml中手动定义嵌套栈,将大资源组直接隔离:
resources: # 根栈只保留最核心的全局资源(比如域名、全局输出) Resources: AppDomain: Type: AWS::Route53::RecordSet # ... 配置内容 # 手动定义嵌套栈,拆分不同资源组 NestedStacks: AllLambdaFunctions: Type: AWS::CloudFormation::Stack Properties: TemplateURL: ./lambda-resources.yml # 单独文件存放所有Lambda相关资源 DatabaseResources: Type: AWS::CloudFormation::Stack Properties: TemplateURL: ./db-resources.yml # 单独文件存放数据库、存储类资源
4. 清理冗余资源
检查你的serverless.yml和相关配置,删除未使用的资源、重复的IAM权限、冗余的输出项等,从根源减少资源总数,这是最直接的降本手段。
5. 调整插件默认迁移规则
插件默认有部分资源不会被迁移(比如AWS::CloudFormation::WaitCondition),可以查看插件的配置文档,修改migrateDefault规则,或者自定义资源的包含/排除列表,将更多根栈资源迁移到子栈。
内容的提问来源于stack exchange,提问作者Kristóf Vass
相关产品推荐
相关产品推荐

