我有一个运行时间长的AWS Java SDK DynamoDB应用程序,该应用程序在启动时会正常运行。但是,经过几个小时(大约12个小时)之后,我开始通过对DynamoDB API的ANY调用一遍又一遍地接收到相同的Exception。如果我重新启动服务器,则Exception消失了……仅稍后再次出现。

确切的ExpiredTokenException错误文本为:
请求中包含的安全 token 已过期(服务:AmazonDynamoDBv2;状态代码:400;错误代码: ExpiredTokenException ;请求ID:DEMTN0Q5BMPH5IQD9TUQMNO5SFVV4KQNSO5AEMVJF66Q9ASUAAJG)

最佳答案

摘要:
AWSCredentialsProvider 的实例(而不是 AWSCredentials )传递给 AmazonDynamoDBClient 的构造函数,因为这可以自动刷新过期的 AWSCredentials(如果特定的 AWSCredentialsProvider 已经实现了刷新功能……这是所有标准 AWS 提供的情况)。

详细信息:
要解决与 AWS Java SDK DynamoDB 相关的 ExpiredTokenException 以前缀“请求中包含的安全 token 已过期(服务:AmazonDynamoDBv2;状态代码:400;错误代码:ExpiredTokenException;请求 ID:...”开头),您必须更改您的代码为 AWSCredentialsProvider 的构造函数提供 AWSCredentials 的实例(并停止使用 AmazonDynamoDBClient 的实例 - 即没有“Provider”后缀)。通过将 AmazonDynamoDBClient 的构造函数传递给 AWSCredentialsProvider 的实例,您可以赋予它如果/当 AWSCredentials 过期(我在这个 AWS forum thread 中发现它需要一个帐户才能访问)时,“自动刷新凭据”。

为了在代码中提供一个明确的示例,这里是代码生成 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

这是消除 ExpiredTokenException 的代码的概括:
AWSCredentialsProvider aWSCredentialsProvider =
  new SystemPropertiesCredentialsProvider();
    //substitute the above line for any valid *Provider implementation
AmazonDynamoDBClient amazonDynamoDBClient =
  new AmazonDynamoDBClient(aWSCredentialsProvider);
    //the above line is now passing an instance of AWSCredentialsProvider
    //as opposed to AWSCredentials
...
amazonDynamoDBClient.listTables();
  //the above line is now enabled, via the AWSCredentialsProvider, to
  //automatically refresh the AWSCredentials if/when they have expired

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

10-06 07:30