Serverless部署遇IAM角色策略超限及CloudFormation循环依赖问题
问题1:IAM角色策略大小超限解决方法
- 精简冗余的IAM权限配置,你当前的
iamRoleStatements存在大量重复配置:已经声明cloudformation:*就不需要单独加cloudformation:DescribeStacks等同服务下的细粒度操作,apigateway:*也已经覆盖了后续的execute-api相关操作,同时Resource字段里的*已经覆盖了其余ARN条目,删除冗余内容可直接降低策略体积。
优化后的配置示例:
iamRoleStatements: - Effect: "Allow" Action: - "cloudformation:*" - "codecommit:*" - "apigateway:*" - "cloudwatch:*" - "ec2:Describe*" - "kms:ListAliases" - "iam:Get*" - "iam:List*" - "lambda:*" - "logs:DescribeLogGroups" - "states:Describe*" - "states:List*" - "tag:GetResources" - "xray:*" Resource: "*"
- 拆分全局IAM角色,不要所有Lambda共用同一个执行角色,
serverless-plugin-custom-roles插件可以给每个Lambda生成独立角色,每个角色的策略体积会远低于10KB限制。 - 若精简后仍超限,可将内联策略替换为AWS托管策略,直接引用托管策略ARN即可,无需在配置内写内联策略:
provider: iamManagedPolicies: - "arn:aws:iam::aws:policy/AmazonAPIGatewayInvokeFullAccess" - "arn:aws:iam::aws:policy/AWSLambdaFullAccess" # 补充其他需要的托管策略ARN
- 若优先使用
serverless-plugin-split-stacks插件,可调整拆分规则,将IAM角色单独拆分到独立嵌套栈,避免所有权限堆叠到同一个角色上:
custom: splitStacks: perFunction: true perType: true stackMap: IAMRole: iam-stack
问题2:CloudFormation循环依赖解决方法
该问题核心是两个插件的资源拆分逻辑冲突,加上全局IAM权限引用栈内资源导致依赖闭环,解决步骤如下:
- 不要同时启用
serverless-plugin-split-stacks和serverless-plugin-custom-roles,确定选用一个插件后就把另一个从plugins列表移除,避免跨栈引用产生循环依赖。 - 调整IAM策略的资源声明,不要在全局IAM角色里引用当前栈要创建的APIGW、Lambda等资源的逻辑ID或ARN,若需要给单个Lambda授予对应资源权限,写到对应Lambda的单独配置里,不要放在全局配置。
- 若必须同时使用两个插件,给
serverless-plugin-custom-roles添加配置避免自动生成的策略引用栈内资源:
custom: customRoles: defaultPolicyStatements: [] rolePerFunction: true
- 若上述方案仍无效,可提前在AWS控制台创建好Lambda执行角色,在配置里直接指定每个Lambda的role ARN,跳过插件自动生成角色的逻辑:
functions: generateOtpDoc: handler: handler.generateOtpDoc role: "arn:aws:iam::你的账号ID:role/你提前创建的Lambda角色名" # 其余Lambda配置同理
内容的提问来源于stack exchange,提问作者Onkar Sawant
相关产品推荐
相关产品推荐

