用户无权执行:dynamodb:PutItem on resource

Posted

技术标签:

【中文标题】用户无权执行:dynamodb:PutItem on resource【英文标题】:User is not authorized to perform: dynamodb:PutItem on resource 【发布时间】:2016-04-19 11:55:08 【问题描述】:

我正在尝试从部署在 AWS ElasticBeanStalk 上的 Node 应用程序访问 DynamoDB。我收到一个错误

User is not authorized to perform: dynamodb:PutItem on resource

它在本地运行良好,但是当我部署到 AWS 时它停止运行。

【问题讨论】:

代码:'AccessDeniedException',状态代码:400, 【参考方案1】:

dynamoDB 访问被拒绝通常是一个策略问题。检查您正在使用的 IAM/角色策略。快速检查是添加

AmazonDynamoDBFullAccess 

通过转到 AWS 控制台中的“权限”选项卡,您的角色中的策略。如果它在此之后工作,则意味着您需要创建一个正确的访问策略并将其附加到您的角色。

【讨论】:

虽然AmazonDynamoDBFullAccess 应该可以工作,但最好只为您希望调用的函数授予权限,在本例中为dynamodb:PutItem。这可以帮助避免意外的呼叫和后果。 Here 是可能权限的完整列表。 @DanSalo 阅读发帖者的评论,我认为他是说添加 FullAccess 以查看是否解决了问题。如果确实如此,那么您就知道这是一个权限问题,然后可以适当地调整您的权限。 在我的情况下需要的角色是AWSLambdaInvocation-DynamoDB【参考方案2】:

在 AWS 上的 Node 应用程序中检查您用于连接到 DynamoDB 的访问密钥。此访问密钥将属于在 IAM 中没有必要权限的用户。因此,找到 IAM 用户,创建或更新适当的策略,您应该会很好。

对于 Beanstalk,您需要在发布时设置用户策略。查看the official docs here。

查看the example from here too,由@Tirath Shah 提供。

【讨论】:

相同的访问密钥在本地完美运行。我还创建了一个与本地类似的用户,具有类似的权限,甚至没有工作 您是否使用 dynamodb-local 进行本地开发?您是否将密钥硬编码到应用程序中?还是你从环境中得到它们?如果它们没有硬编码,请尝试显式硬编码。看看您是否可以验证密钥和秘密是否完全符合您的预期。其他操作是否有效,例如 GetItem 等? 目前它被硬编码在 ~/.aws/credentials 文件中。我还没有尝试从应用程序中获取 getItem 。但我在同一台机器的命令行上尝试了它,我是能够从数据库中获取所有项目 将其硬编码到您的应用程序中并给它一个 bash。我有一种直觉,凭据没有进入您的节点应用程序。 我知道这些凭据通常是从 ~/.aws/credentials 中提取的。我不确定在哪里硬编码应用程序可以提取凭据【参考方案3】:

就我而言(出于实验目的,我尝试通过 SageMaker Notebook 写入 DynamoDB 表),完整的错误如下所示:

ClientError: An error occurred (AccessDeniedException) when calling the UpdateItem operation: User: arn:aws:sts::728047644461:assumed-role/SageMakerExecutionRole/SageMaker is not authorized to perform: dynamodb:UpdateItem on resource: arn:aws:dynamodb:eu-west-1:728047644461:table/mytable

我需要去 AWS 控制台 -> IAM -> 角色 -> SageMakerExecutionRole,并附加这两个策略:

AmazonDynamoDBFullAccess
AWSLambdaInvocation-DynamoDB

不过,在现实世界的场景中,我建议遵循最少权限原则,并应用允许 put item 方法通过的策略,以避免发生意外(例如,从表中删除记录) .

【讨论】:

【参考方案4】:

不建议使用 aws 托管策略 AmazonDynamoDBFullAccess 授予完全 dynamodb 访问权限,这不是最佳做法。 尝试在角色策略 json 的策略中的资源键中添加表 arn。

"Resource": "arn:aws:dynamodb:<region>:<account_id>:table:/dynamodb_table_name"

【讨论】:

以上是关于用户无权执行:dynamodb:PutItem on resource的主要内容,如果未能解决你的问题,请参考以下文章

用户无权执行:ce:GetCostAndUsage

Terraform 错误创建主题:googleapi:错误 403:用户无权执行此操作

AccessDeniedException:用户无权对资源执行 dynamodb BatchWriteItem:表

AWS API Gateway:用户匿名无权执行 API

AmazonServiceException:用户无权执行:dynamodb:DescribeTable 状态码:400;错误代码:AccessDeniedException

创建发布者主题时“用户无权执行此操作”