短版
作为Facebook用户登录,我使用我的oAuth令牌来假设IAM在AWS中的作用。它返回看起来是有效的凭据,例如,有一个与我们的主键长度相似的AccessKeyId,SecretAccessKey。
当我尝试使用这些凭据访问DynamoDB表时,我得到两个例外之一:
"The remote server returned an error: (400) Bad Request.";或"The security token included in the request is invalid."。我正在使用AWS C# SDK版本1.5.25.0
长版本
如前所述,我正试图使用DynamoDB身份授权的AmazonSecurityTokenServiceClient提供的凭据访问AWS上的这个AWS指南表,如这个AWS指南中所述。
我创建的IAM角色的策略是:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"dynamodb:BatchGetItem",
"dynamodb:PutItem",
"dynamodb:Query",
"dynamodb:Scan",
"dynamodb:UpdateItem"
],
"Sid": "Stmt1372350145000",
"Resource": [
"*"
],
"Effect": "Allow"
}
]
}如何获得凭据::
AmazonSecurityTokenServiceClient.AssumeRoleWithWebIdentity来承担IAM角色。如何使用这些凭据:
然后使用返回的凭据,尝试访问AWS DynamoDB资源。
using (var client = new AmazonDynamoDBClient(AWSCredentials.AccessKeyId, AWSCredentials.SecretAccessKey, AWSCredentials.SessionToken, RegionEndpoint.USEast1))
{
var context = new DynamoDBContext(client);
var data = context.Scan<SomeData>();
}这将在尝试对表进行"The remote server returned an error: (400) Bad Request."时返回Scan。
这是异常消息的变化所在;如果我从上面的AWSCredentials.SessionToken中省略了该AmazonDynamoDBClient
using (var client = new AmazonDynamoDBClient(AWSCredentials.AccessKeyId, AWSCredentials.SecretAccessKey, RegionEndpoint.USEast1))
{
var context = new DynamoDBContext(client);
var data = context.Scan<SomeData>();
}这将在尝试对表进行"The security token included in the request is invalid."时返回Scan。
问题
此时,我无法判断是什么错了,凭据是否无效,或者我并没有将所有需要传递给AWS的内容都传递给AWS。
有人能提供任何关于哪里出了问题或者我如何进一步调试的洞察力吗?
发布于 2013-07-02 09:44:49
我在AWS论坛上交叉发布了我的问题,并从亚马逊的工程师那里得到了答案。
https://forums.aws.amazon.com/message.jspa?messageID=465057
DynamoDBContext对象调用目标表上的DescribeTable (并缓存该数据,因此为了获得最佳性能,您希望尽可能长时间地保持上下文对象,因此每个目标表只进行一次调用)。修改策略如下:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"dynamodb:BatchGetItem",
"dynamodb:PutItem",
"dynamodb:Query",
"dynamodb:Scan",
"dynamodb:UpdateItem",
"dynamodb:DescribeTable"
],
"Sid": "Stmt1372350145000",
"Resource": [
"*"
],
"Effect": "Allow"
}
]
}https://stackoverflow.com/questions/17402889
复制相似问题