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

DynamoDB细粒度访问控制:用Cognito邮箱标识为何授权失败?

Fixed: DynamoDB UpdateItem AccessDenied with Cognito & Custom IAM Policy

我之前也踩过类似的坑,你的自定义IAM策略里有几个容易忽略的问题,直接导致了AccessDeniedException,咱们一步步来排查修复:

1. Cognito身份凭证的email属性未正确映射

默认情况下,Cognito身份池生成的临时STS凭证不会自动携带用户池的email属性。你得先在身份池里完成属性映射配置:

  • 打开AWS控制台的Cognito身份池,找到目标池
  • 进入「身份验证提供者」→ 选择你的用户池并点击「编辑」
  • 在「属性映射」区域,把用户池的email属性映射到身份池的email(或自定义属性如custom:email)
  • 保存后,新生成的凭证才会包含这个属性,策略里的${cognito-identity.amazonaws.com:email}才能正确取值

2. 条件操作符使用错误:ForAllValues:StringEquals不适合单值场景

ForAllValues:StringEquals是用来匹配多值集合的(比如批量操作的多个键),而UpdateItem只会指定单个分区键(LeadingKey),这里应该换成普通的StringEquals:

"Condition": {
  "StringEquals": {
    "dynamodb:LeadingKeys": [ "${cognito-identity.amazonaws.com:email}" ]
  },
  // 其他条件保持
}

3. 策略JSON语法不完整

你给出的调整后策略最后缺少了闭合的}]},这会导致策略无法被正确解析直接失效。完整的正确策略示例:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "dynamodb:UpdateItem",
      "Resource": "arn:aws:dynamodb:us-east-1:123456789123:table/history",
      "Condition": {
        "StringEquals": {
          "dynamodb:LeadingKeys": [ "${cognito-identity.amazonaws.com:email}" ]
        },
        "ForAllValues:StringEquals": {
          "dynamodb:Attributes": [ "email", "utc", "updated", "isNew" ]
        }
      }
    }
  ]
}

4. 确认UpdateItem请求的属性范围

dynamodb:Attributes条件会严格限制可修改的属性,确保你的UpdateItem请求里的UpdateExpression只涉及email, utc, updated, isNew这几个属性,不能修改未列出的属性,否则会被拒绝。

终极排查:用CloudTrail看细节

如果调整后还是报错,建议开启AWS CloudTrail,查看对应的UpdateItem事件详情。CloudTrail会明确告诉你哪个条件不满足(比如变量未取值、属性超出范围等),这是定位IAM策略问题的最有效工具。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:16:41