AWS本地DynamoDB:请求中包含的安全令牌无效。

10
我是AWS的新手,正在尝试从Java程序中对本地DynamoDB执行CRUD操作。Java程序是AWS的示例。
我已安装了AWS CLI,并设置了以下配置-根据AWS文档,我不需要真实的AWS访问密钥和秘密密钥来使用本地DynamoDB。
我通过在AWS CLI中运行aws configure来设置了以下值:~/.aws/config和~/.aws/credentials。
[default]
aws_access_key_id = ''
aws_secret_access_key = ''
[default]
region = ap-south-1

我已经使用本地DYnamoDB JAR运行了这个。

java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb

我尝试运行的代码如下。

https://github.com/aws-samples/aws-dynamodb-examples/blob/master/src/main/java/com/amazonaws/codesamples/datamodeling/ObjectPersistenceCRUDExample.java

然而,我遇到了这个异常。

AmazonDynamoDBException:请求中包含的安全令牌无效。

完整的堆栈信息如下。

    Exception in thread "main" com.amazonaws.services.dynamodbv2.model.AmazonDynamoDBException: The security token included in the request is invalid. (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: UnrecognizedClientException; Request ID: UPGRD2BRNUN6S1702EN6N6S8RJVV4KQNSO5AEMVJF66Q9ASUAAJG)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1695)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1350)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1101)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:758)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:732)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:714)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:674)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:656)
    at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:520)
    at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.doInvoke(AmazonDynamoDBClient.java:4192)
    at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.invoke(AmazonDynamoDBClient.java:4159)
    at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.executeUpdateItem(AmazonDynamoDBClient.java:3868)
    at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.updateItem(AmazonDynamoDBClient.java:3835)
    at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper$SaveObjectHandler.doUpdateItem(DynamoDBMapper.java:854)
    at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper$2.executeLowLevelRequest(DynamoDBMapper.java:594)
    at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper$SaveObjectHandler.execute(DynamoDBMapper.java:733)
    at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper.save(DynamoDBMapper.java:623)
    at com.amazonaws.services.dynamodbv2.datamodeling.AbstractDynamoDBMapper.save(AbstractDynamoDBMapper.java:123)
    at com.stackroute.Main.testCRUDOperations(Main.java:60
    at com.stackroute.Main.main(Main.java:17)

任何帮助都将不胜感激。先行致谢。
4个回答

13

据我所知,引用代码中没有指向DynamoDB本地实例的内容。看起来这是指向正式的DynamoDB。

你需要将端点更改为本地版本。请查看这个页面。它有一个将端点更改为localhost:8080的示例。


10
上面的链接现在是404错误。这是官方文档链接:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tools.CLI.html#UsingWithDDBLocal。请查看。 - Scott McAllister
谢谢Scott。我用你提供的URL修复了我的帖子。不知道为什么我没有早点这样做,因为我是修复文档的人。所以再次感谢你! - NoSQLKnowHow
请查看以下内容:https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-endpoints.html#endpoints-service-specific-table用于在本地全局配置特定服务的端点。 - undefined

2

对于使用大于1.23或2.0.0版本的DynamoDBLocal的用户,必须将ACCESS_KEY_ID值设置为字母数字字符,即严格限定在[A-Z, a-z]和[0-9]之间。

例如:

dummy-key-123 -> 不起作用。

dummyKey123 -> 起作用。

请参考官方文章这里


2
作为 Martín C 的评论的更新,这是我解决问题的方法。
DynamoDbClient dynamoDbClient =
                DynamoDbClient.builder()
.region(Region.US_EAST_1)
.endpointOverride(URI.create("http://localhost:8000"))
.credentialsProvider(EnvironmentVariableCredentialsProvider.create())
.build();

您可以将端口更改为您本地托管的DynamoDB使用的任何端口。


1
准确地说,问题似乎确实指向了 AWS 上的 DynamoDB 而不是本地的一个,尽管我无法验证原始评论是否如此,因为链接现在已经失效,至少对我来说是这样的。
解决方案是明确连接到本地的 DynamoBD(需要安装) 以下是实现它的代码:
AmazonDynamoDBClientBuilder.standard().withEndpointConfiguration(
            // we can use any region here
            new AwsClientBuilder.EndpointConfiguration("http://localhost:8000", "us-west-2"))
            .build();

这是之前评论中提到的示例类的链接,该类已被删除(您需要单击“Load Diff”以获取DynamoDBLocalFixture.java类): https://github.com/aws-samples/aws-dynamodb-examples/commit/461b0e85bfad58f4a62c63f38426c650896fb870#diff-b331539c5e8b0398d9bbb85c5b87a4cdfa32efbefb27f68f3402c223b243b178


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