AmazonServiceException:用户无权执行:dynamodb:DescribeTable 状态码:400;错误代码:AccessDeniedException
Posted
技术标签:
【中文标题】AmazonServiceException:用户无权执行:dynamodb:DescribeTable 状态码:400;错误代码:AccessDeniedException【英文标题】:AmazonServiceException: User is not authorized to perform: dynamodb:DescribeTable Status Code: 400; Error Code: AccessDeniedException 【发布时间】:2014-09-06 01:33:33 【问题描述】:我原本以为这个问题是由于区域不匹配造成的,但是在更改区域后,我在尝试此处找到的 Amazon AWS 示例时仍然遇到以下错误:
DynamoDBMapper
AmazonServiceException: User: arn:aws:sts::[My Account
ARN]:assumed-role/Cognito_androidAppUnauth_DefaultRole/ProviderSession
is not authorized to perform: dynamodb:DescribeTable on resource:
arn:aws:dynamodb:us-east-1:[My Account ARN]:table/test_table (Service:
AmazonDynamoDBv2; Status Code: 400; Error Code: AccessDeniedException;
Request ID: BBFTS0Q8UHTMG120IORC2KSASVVV4KQNSO5AEMVJF66Q9ASUAAJG)
一切都或多或少相同,我唯一更改的是将DBclient
区域更改为US_EAST_1
,我的测试表在其中托管,并使用“Amazon Cognito”中的信息修改常量文件根据 Cognito 入门文档生成的 Starter Code 页面。
sdkforandroid-cognito-auth
对于我的Cognito_AndroidAppUnauth_DefaultRole
角色策略,我修改了默认的移动分析和同步服务权限,使其还包括对所有表(无论是否存在)的所有操作的访问:
"Version": "2012-10-17",
"Statement": [
"Sid": "CognitoPolicy",
"Action": [
"mobileanalytics:PutEvents",
"cognito-sync:*"
],
"Effect": "Allow",
"Resource": [
"*"
]
,
"Sid": "DynamoDBPolicy",
"Effect": "Allow",
"Action": [
"dynamodb: *"
],
"Resource": "*"
]
那么为什么在使用正确的区域并且 Unauth 策略应该允许表访问时声称它没有权限?
编辑:调用 DynamoDB 资源(创建表)上的方法时的 Stacktrace,它是否有用
com.amazonaws.AmazonServiceException: User: arn:aws:sts::[My Account ARN]:assumed-role/Cognito_AndroidAppUnauth_DefaultRole/ProviderSession is not authorized to perform: dynamodb:CreateTable on resource: arn:aws:dynamodb:us-east-1:[My Account ARN]:table/test_table (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: AccessDeniedException; Request ID: SDELNSMLO10EV7CM2STC1R9RU3VV4KQNSO5AEMVJF66Q9ASUAAJG)
at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(Unknown Source)
at com.amazonaws.http.AmazonHttpClient.executeHelper(Unknown Source)
at com.amazonaws.http.AmazonHttpClient.execute(Unknown Source)
at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.invoke(Unknown Source)
at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.createTable(Unknown Source)
at com.amazonaws.demo.userpreferencesom.DynamoDBManager.createTable(DynamoDBManager.java:72)
at com.amazonaws.demo.userpreferencesom.UserPreferenceDemoActivity$DynamoDBManagerTask.doInBackground(UserPreferenceDemoActivity.java:99)
at com.amazonaws.demo.userpreferencesom.UserPreferenceDemoActivity$DynamoDBManagerTask.doInBackground(UserPreferenceDemoActivity.java:85)
at android.os.AsyncTask$2.call(AsyncTask.java:288)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
【问题讨论】:
【参考方案1】:与亚马逊工程师合作,发现问题出在策略配置中:
"dynamodb: *"
应该是
"dynamodb:*"
一个空间能做什么真是太神奇了。
【讨论】:
太棒了,正要发布这个 - 太好了,AWS 支持也高度可用 :) 是的,GitHub 问题比 AWS 论坛好得多,至少在使用 Amazon 提供的示例资源方面。如果它是您自己设计的其他一些疯狂的代码,它们可能无济于事,因为它与示例项目无关。经验 @KurtWagner:策略配置在哪里? @AnasAzeem 应该在 IAM 控制台中。 docs.aws.amazon.com/IAM/latest/UserGuide/ManagingPolicies.html【参考方案2】:在我的例子中,我的表名包含一个无效的“/”字符。从表名中删除“/”字符解决了这个问题。
【讨论】:
【参考方案3】:您可以改为将权限分配给 lambda 的角色,如下所示:
【讨论】:
以上是关于AmazonServiceException:用户无权执行:dynamodb:DescribeTable 状态码:400;错误代码:AccessDeniedException的主要内容,如果未能解决你的问题,请参考以下文章