AWS Lambda调用DynamoDB Scan报AccessDeniedException权限错误如何解决?
问题排查结论
IAM策略变更通常为秒级生效,无需长时间等待,你遇到的权限报错可按以下优先级排查原因:
可能原因及修复方案
- 策略绑定对象错误
先确认你添加的AmazonDynamoDBFullAccess以及自定义策略,是绑定到了报错信息中明确给出的执行角色上:arn:aws:sts::021517822274:assumed-role/CodeStar-tt-api-subjects-Execution/awscodestar-tt-api-subjects-lambda-HelloWorld,不要误绑定到其他测试角色、用户组或者其他服务的执行角色上。 - 存在更高优先级的显式拒绝规则
IAM权限判定逻辑中显式拒绝优先级高于所有允许规则,你可以检查三类规则是否存在DynamoDB操作的拒绝配置:- 当前Lambda执行角色绑定的其他策略
- 角色配置的权限边界规则
- 账号层级的服务控制策略(SCP)
- 资源ARN匹配不完整
如果你调用Scan操作时访问了表的二级索引,当前自定义策略只配置了表本身的权限,没有覆盖索引资源,需要在自定义策略的Resource数组中补充索引ARN规则:arn:aws:dynamodb:*:*:table/tt-subjects/index/*;同时确认你的DynamoDB表名完全匹配tt-subjects,没有大小写偏差或前后缀。 - 平台配置覆盖了手动修改的权限
你使用了CodeStar部署Lambda,CodeStar的部署模板默认会管理Lambda执行角色的权限,手动在IAM控制台添加的策略可能会在下次CodeStar部署时被自动清除,可以直接在CodeStar的项目模板中添加DynamoDB相关权限规则,避免被覆盖。
快速验证方法
可以直接使用AWS IAM控制台的策略模拟器工具:选择对应Lambda执行角色,模拟操作选dynamodb:Scan,资源ARN填写报错中的arn:aws:dynamodb:us-east-1:021517822274:table/tt-subjects,模拟结果会直接给出权限允许/拒绝的原因,以及具体是哪条策略导致的判定结果。
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

