已通过身份验证的 Cognito 用户访问 DynamoDB 表的 AWS IAM 策略问题
Posted
技术标签:
【中文标题】已通过身份验证的 Cognito 用户访问 DynamoDB 表的 AWS IAM 策略问题【英文标题】:AWS IAM policy issue for DynamoDB table access by authenticated Cognito users 【发布时间】:2019-06-20 23:31:01 【问题描述】:我在通过成功通过身份验证的 Cognito 用户访问新 DynamoDB 表时遇到问题。
尝试扫描表(使用 AWS javascript 开发工具包)时,我收到以下 AccessDeniedException:
Unable to scan. Error:
"message": "User: arn:aws:sts::MY-ACCOUNT-NUM:assumed-role/Cognito_VODStreamTestAuth_Role/CognitoIdentityCredentials
is not authorized to perform: dynamodb:Scan on resource: arn:aws:dynamodb:us-east-1:MY-ACCOUNT-NUM:table/VideoCatalog",
"code": "AccessDeniedException",
"time": "2019-01-27T02:25:27.686Z",
"requestId": "blahblah",
"statusCode": 400,
"retryable": false,
"retryDelay": 18.559011800834146
已通过以下 DynamoDB 部分扩展了经过身份验证的 Cognito 用户策略:
"Sid": "AllowedCatalogActions",
"Effect": "Allow",
"Action": [
"dynamodb:BatchGetItem",
"dynamodb:GetItem",
"dynamodb:Scan",
"dynamodb:Query",
"dynamodb:UpdateItem"
],
"Resource": [
"arn:aws:dynamodb:us-east-2:MY-ACCOUNT-NUM:table/VideoCatalog"
]
只要我像上面那样指定表资源,这是否足以让经过身份验证的 Cognito 用户访问我可能创建的任何 DynamoDB 表?还是我也需要在表格的“访问控制”选项卡下添加"Fine-grained access control"?
我可以说我在我的非根管理员 IAM 角色(上面由 MY-ACCOUNT-NUM 表示)下创建了 VideoCatalog DynamoDB 表。那是问题吗? (在尝试移动到 DynamoDB 表之前,我使用 S3 上的 JSON 文件作为视频目录。)
我很困惑!
【问题讨论】:
【参考方案1】:查看来自 AWS 的错误消息和您提供的政策文档,我可以看到这里有两个不同的区域。
AWS 说您的用户无权访问 aws:dynamodb:us-east-1:MY-ACCOUNT-NUM:table/VideoCatalog,而您的政策文档提供了对 aws 的访问权限:dynamodb:us-east-2:MY-ACCOUNT-NUM:table/VideoCatalog.
您是否可能错误地将资源配置在两个不同的区域?
【讨论】:
本身不是错误的......但感谢您注意到这一点!该表肯定位于 us-east-2 区域,而 Cognito 用户池位于 us-east-1。看到当我尝试以编程方式(使用 AWS JavaScript SDK)扫描 VideoCatalog 表时我没有指定区域,它必须假设它在同一区域中。我没有理由不能将 DynamoDB 表与我的 Cognito 用户池放在同一区域。所以我会这样做并报告! 你说的很对。很容易错过 us-east-1 与 -2 的比赛,但现在我知道首先要考虑区域问题!谢谢!!以上是关于已通过身份验证的 Cognito 用户访问 DynamoDB 表的 AWS IAM 策略问题的主要内容,如果未能解决你的问题,请参考以下文章
如何允许 cognito 身份验证的用户获得对 s3 存储桶的公共访问权限
如何配置 AWS 用户 cognito 身份验证流程以在 Java sdk 后端生成身份令牌、访问令牌?
如何使用带有 iOS SDK 的 Facebook 身份验证通过 DynamoDB 和 Cognito 存储用户信息
通过 Lambda 到 GetObject 的 Cognito 身份验证角色 - 调用 GetObject 操作时发生错误 (AccessDenied):访问被拒绝
“没有当前用户”:是不是甚至可以通过 Amplify 使用身份验证类型 AMAZON_COGNITO_USER_POOLS 对 AWS AppSync 进行未经身份验证的调用?