Serverless配置dynamodb:BatchWriteItem权限后Lambda仍被拒绝访问如何解决
问题原因
- iamRoleStatements配置层级错误:如果将权限规则写在
functions节点下,而非provider根节点下,规则不会自动附加到Serverless默认生成的Lambda执行角色上。 - 资源匹配校验不通过:
${self:custom.tableName}的实际取值和你代码中操作的DynamoDB表名TABLE_NAME不一致- 资源ARN中用
*通配符匹配AWS账户ID的写法,被你账号的组织权限策略拦截,不允许通配符匹配核心资源的账户ID字段
- IAM角色未同步更新:上次部署时Serverless框架跳过了IAM角色的变更更新,本地新增的权限没有同步到云端角色
- 使用了自定义Lambda角色:如果在
provider或function配置中指定了role字段使用自定义角色,默认的iamRoleStatements配置不会自动附加到自定义角色上
解决方案
- 修正配置层级
确认iamRoleStatements配置放在provider根节点下,正确结构示例:
provider: name: aws runtime: nodejs18.x # 替换为你实际用的运行时版本 region: us-east-1 # iamRoleStatements必须在provider节点下 iamRoleStatements: - Effect: Allow Action: - dynamodb:Query - dynamodb:Scan - dynamodb:GetItem - dynamodb:PutItem - dynamodb:UpdateItem - dynamodb:DeleteItem - dynamodb:BatchWriteItem - dynamodb:BatchReadItem Resource: "arn:aws:dynamodb:${self:provider.region}:${AWS::AccountId}:table/${self:custom.tableName}"
- 修正资源ARN规则
- 先验证
${self:custom.tableName}的取值是否和报错中的目标表名TABLE_NAME完全一致 - 将ARN中的账户ID通配符
*替换为AWS内置变量${AWS::AccountId},自动读取当前部署账号的ID,避免通配符被拦截
- 强制同步角色配置
部署时添加--force参数强制更新IAM角色配置,避免框架跳过角色变更:
sls deploy --stage <替换为你的环境名,如qa/prod> --force
- 自定义角色适配
如果你使用了自定义的Lambda执行角色,手动将上述DynamoDB权限规则添加到自定义角色的权限策略中即可。
内容的提问来源于stack exchange,提问作者TAD
相关产品推荐
相关产品推荐

