如何解决对AWS Java SDK DynamoDB的调用导致ExpiredTokenException?

时间:2015-08-27 17:54:18

标签: java amazon-dynamodb aws-sdk

我有一个长期运行的AWS Java SDK DynamoDB应用程序,当我启动它时它会正常运行。但是,经过几个小时(大约12小时)后,我开始一遍又一遍地接收相同的Exception并重新调用DynamoDB API。如果我重新启动服务器,Exception消失...只会稍后再次出现。

确切的ExpiredTokenException错误文字是:
包括在请求安全令牌过期(服务:AmazonDynamoDBv2;状态码:400;错误代码:的 ExpiredTokenException ;请求ID:DEMTN0Q5BMPH5IQD9TUQMNO5SFVV4KQNSO5AEMVJF66Q9ASUAAJG)

1 个答案:

答案 0 :(得分:14)

<强>要点:
AWSCredentialsProvider(而不是AWSCredentials)的实例传递给AmazonDynamoDBClient的构造函数,因为这样可以自动刷新过期的AWSCredentials(如果特定{{1}已实现刷新功能......所有标准AWS提供的功能都是如此)。

<强>详细信息:
解决AWS Java SDK与DynamoDB相关的ExpiredTokenException,它以前缀&#34; 开头。请求中包含的安全令牌已过期(服务:AmazonDynamoDBv2;状态代码:400;错误代码:ExpiredTokenException;请求ID:.. 。&#34;,您必须更改代码以提供AWSCredentialsProvider的实例(并停止使用AWSCredentialsProvider的实例 - 即没有&#34;提供商&#34;后缀转到AWSCredentials的构造函数。通过将AmazonDynamoDBClient的构造函数交给AmazonDynamoDBClient的实例,您可以让它自动刷新凭据&#34; if {when {when}何时到期(我在此AWS forum thread中找到,需要帐户才能访问)。

为了在代码中提供一个明确的示例,这里概括了代码生成AWSCredentialsProvider的内容:

AWSCredentials

以下是消除ExpiredTokenException

的代码的概括
AWSCredentialsProvider aWSCredentialsProvider =
  new SystemPropertiesCredentialsProvider();
    //the above line may be substituted for any valid
    //*Provider implementation
AWSCredentials aWSCredentials =
  aWSCredentialsProvider.getCredentials();
AmazonDynamoDBClient amazonDynamoDBClient =
  new AmazonDynamoDBClient(aWSCredentials);
...
amazonDynamoDBClient.listTables();
  //the above line is where the ExpiredTokenException is eventually thrown

鉴于我在AWS Java SDK Javadocs及其提供的示例(基于我自己的大部分代码)上攀爬了多少,我没有注意到这个特定的细微差别。因此,我为那些追随我的人提供了非常详细的答案(可能包括我自己,LOL)。