用户未被授权执行dynamodb:PutItem操作的资源。

52

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

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

本地运行正常,但是当我部署到AWS后它就无法正常运行了。


代码:'AccessDeniedException', 状态码:400, - Tirath Shah
5个回答

54

通常 DynamoDB 访问被拒绝是由于策略问题引起的。请检查您正在使用的 IAM/角色策略。一个快速的检查方法是添加

AmazonDynamoDBFullAccess 

要在AWS控制台中为您的角色设置权限,请转到“权限”选项卡。如果此后可以正常工作,则表示您需要创建正确的访问策略并将其附加到您的角色。


4
虽然 AmazonDynamoDBFullAccess 应该可以使用,但最好只授予你期望调用的函数所需的权限,本例中是 dynamodb:PutItem。这样可以避免意外的调用和后果。这里是可能权限的完整列表。 - Dan Salo
10
阅读发帖者的评论,我认为他是在建议添加FullAccess以查看是否解决了问题。如果成功了,你就知道这是一个权限问题,然后可以适当调整你的权限。 - Thom
4
我的情况需要的角色是 AWSLambdaInvocation-DynamoDB - JJ Roman

2

使用AWS托管策略AmazonDynamoDBFullAccess授予完全的dynamodb访问权限不被推荐,也不是最佳实践。 尝试将您的表ARN添加到角色策略JSON中的资源键中。

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

2
检查在您的AWS Node应用程序中连接DynamoDB时使用的访问密钥。该访问密钥属于IAM中没有必要特权的用户。因此,请查找IAM用户,创建或更新适当的策略,然后您就可以轻松解决问题。
对于Beanstalk,您需要在发布时设置用户策略。请查看这里的官方文档
还请查看这里的示例,由@Tirath Shah提供。

相同的访问密钥在本地运行得非常完美。我还创建了一个类似于本地用户的用户,拥有类似的权限,但即使如此也无法工作。 - Tirath Shah
你在本地开发中使用dynamodb-local吗?你是否将密钥硬编码到应用程序中?还是从环境中获取它们?如果它们没有被硬编码,请尝试显式地将它们硬编码。看看你能否验证密钥和秘密是否与你预期完全一致。其他操作是否有效,例如GetItem等? - smcstewart
我知道这些凭证通常从~/.aws/credentials中获取。但我不确定在哪里硬编码应用程序可以提取凭据。 - Tirath Shah
你在Beanstalk上运行的节点应用程序是使用哪个用户?当你发布到Beanstalk时,你将设置一个角色。这个角色需要具有PutItem等策略权限。 - smcstewart
嘿,你好吗?你能否回答这个问题吗?http://stackoverflow.com/questions/35811483/dynamodb-updateitem-deep-within-an-object - Tirath Shah
显示剩余8条评论

0

登录到IAM > 角色,选择服务名称。确保DynamoDB资源正确。


0
在我的情况下(我尝试通过SageMaker笔记本将数据写入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方法通过的策略,以避免意外情况(例如从您的表中删除记录)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接