如何统计CloudFormation及AWS SAM模板构建/部署时实际创建的资源数量?
遇到堆栈资源限制确实头疼,尤其是SAM模板会自动生成很多隐式资源(比如每个Lambda关联的API网关方法、集成、权限,还有默认的日志组、IAM角色等),导致实际资源数远多于模板里定义的数量。这里有几个实用的方法帮你提前统计,顺便给你优化模板的建议:
方法1:用SAM CLI展开模板,直接统计资源数
SAM的transform命令会把你的SAM模板转换成纯CloudFormation模板,里面包含所有SAM自动生成的隐式资源。你可以用这个命令生成展开后的模板,再快速统计资源数量:
# 生成展开后的CloudFormation JSON模板 sam transform --template-file template.yaml > expanded-template.json # 用jq统计Resources节点下的资源总数(需先安装jq工具) jq '.Resources | length' expanded-template.json
这个方法最直接,不仅能得到准确的资源总数,你还可以打开expanded-template.json查看具体生成了哪些资源,方便排查资源数激增的原因(比如是不是每个函数都自动创建了独立的IAM角色)。
方法2:通过变更集预览资源数量
使用SAM或CloudFormation的变更集功能,在实际部署前预览所有要创建的资源,还能看到每个资源的类型:
用SAM CLI创建变更集
sam deploy --template-file template.yaml --stack-name your-stack-name --no-execute-changeset
执行后,SAM会创建一个变更集但不会实际部署。你可以登录AWS控制台,进入CloudFormation服务找到对应堆栈,点击"变更集"查看详情——顶部会显示资源总数,列表里能看到每个资源的具体信息。
用AWS CLI统计变更集资源数
如果偏好命令行,可以用以下命令直接获取数量:
# 先创建变更集(替换占位符为你的堆栈名) aws cloudformation create-change-set --stack-name your-stack-name --change-set-name preview-resources --template-body file://template.yaml --change-set-type CREATE # 等待变更集创建完成后,统计资源数 aws cloudformation describe-change-set --stack-name your-stack-name --change-set-name preview-resources | jq '.Changes | length'
方法3:优化模板减少不必要的资源(解决你资源过多的核心问题)
从你的示例模板来看,每个AWS::Serverless::Function都没有指定Role属性,SAM会自动为每个函数创建一个独立的IAM角色——这就额外增加了193个IAM资源!你可以在Globals里统一指定共用的LambdaRole,让所有函数共用一个角色,大幅减少资源数:
修改你的Globals部分:
Globals: Function: Timeout: 5 Role: !GetAtt LambdaRole.Arn # 添加这行,统一使用共用角色 VpcConfig: SecurityGroupIds: - sg-041f2xxxd921e8e SubnetIds: - subnet-03xxxb2d - subnet-c4dxxxcb
另外,如果你不需要每个函数都生成独立的日志组,可以在Globals里指定共用日志组(不过通常不建议禁用自动日志组,除非你有统一的日志管理方案):
Globals: Function: LoggingConfig: LogGroup: !Ref SharedLogGroup # 指定共用日志组 # 其他配置...
这样优化后,你的资源数量会大幅降低,也能避免触发堆栈资源限制。
内容的提问来源于stack exchange,提问作者PeakGen

