【发布时间】:2017-12-28 14:02:45
【问题描述】:
我在 AWS DynamoDB 上遇到错误,提示:
[请求处理失败;嵌套异常是 com.amazonaws.services.dynamodbv2.model.AmazonDynamoDBException: 请求中包含的安全令牌无效。 (服务: 亚马逊DynamoDBv2;状态码:400;错误代码: 无法识别的客户端异常;请求编号: VJ8R07B81ANC1047P1ANEDS4CRVV4KQNSO5AEMVJF66Q9ASUAAJG)] 带根 导致com.amazonaws.services.dynamodbv2.model.AmazonDynamoDBException: 请求中包含的安全令牌无效。 (服务: 亚马逊DynamoDBv2;状态码:400;错误代码: 无法识别的客户端异常;请求编号: VJ8R07B81ANC1047P1ANEDS4CRVV4KQNSO5AEMVJF66Q9ASUAAJG)
使用在 EC2 实例中运行的实际 DynamoDB 端点。但是,当我运行应用程序并将其指向我的本地 DynamoDB 时,它可以工作。
有人对此有解决方案吗?谢谢。
这是我在 DynamoDB 上的配置
@Configuration
@EnableDynamoDBRepositories(basePackages = "**.****.***.repository")
public class DynamoConfig {
@Value("${aws.secret.key}")
private String awsSecretKey;
@Value("${aws.access.key}")
private String awsAccessKey;
@Value("${aws.dynamodb.endpoint}")
private String awsDynamoDBEndpoint;
@Value("${aws.region}")
private String awsRegion;
@Bean
public AmazonDynamoDB amazonDynamoDB() {
AmazonDynamoDBClientBuilder amazonDynamoDB = AmazonDynamoDBClientBuilder.standard()
.withCredentials(new AWSStaticCredentialsProvider(amazonAWSCredentials()))
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(awsDynamoDBEndpoint, awsRegion));
// amazonDynamoDB.setSignerRegionOverride(Regions.fromName(awsRegion).getName());
// if (!StringUtils.isEmpty(awsDynamoDBEndpoint)) {
// amazonDynamoDB.setEndpoint(awsDynamoDBEndpoint);
// }
return amazonDynamoDB.build();
}
@Bean
public AWSCredentials amazonAWSCredentials() {
return new BasicAWSCredentials(awsAccessKey, awsSecretKey);
}
}
P.S 我也尝试运行指向实际 DynamoDB 端点的应用程序,我遇到了同样的错误。
【问题讨论】:
-
您能告诉我们您用来调用 Dynamo 的代码吗?
-
嗨,我已经编辑了我的帖子,让您查看我的配置。
-
您的代码看起来不错,您是否在创建凭据时检查了访问密钥和保密密钥是否正常?如 aws 文档中所述,如果访问密钥 ID 或安全令牌无效,您将收到 UnrecognizedClientException。
-
我也读过这个。我忘了提到他们在我运行我的应用程序的实例中使用 DynamoDB 中的 IAM 角色。这意味着他们告诉我不需要声明访问密钥 ID 和密钥,因此我将其留空。虽然我不确定会对它产生什么影响,因为我只是 AWS 的新手。
-
如果您为您的 ec2 实例配置了角色,您可以删除 withCredentials 方法调用
标签: spring amazon-ec2 amazon-dynamodb aws-sdk