You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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配置不会自动附加到自定义角色上
解决方案
  1. 修正配置层级
    确认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}"
  1. 修正资源ARN规则
  • 先验证${self:custom.tableName}的取值是否和报错中的目标表名TABLE_NAME完全一致
  • 将ARN中的账户ID通配符*替换为AWS内置变量${AWS::AccountId},自动读取当前部署账号的ID,避免通配符被拦截
  1. 强制同步角色配置
    部署时添加--force参数强制更新IAM角色配置,避免框架跳过角色变更:
sls deploy --stage <替换为你的环境名,如qa/prod> --force
  1. 自定义角色适配
    如果你使用了自定义的Lambda执行角色,手动将上述DynamoDB权限规则添加到自定义角色的权限策略中即可。

内容的提问来源于stack exchange,提问作者TAD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 05:45:11