如何修复导致 ExpiredTokenException 的 AWS Java SDK DynamoDB 调用?

How do I cure a call to the AWS Java SDK DynamoDB resulting in an ExpiredTokenException?

我有一个很长的 运行 AWS Java SDK DynamoDB 应用程序,它在我启动时运行正常。然而,在几个小时后(大约 12 小时),我开始通过对 DynamoDB API 的任何调用一遍又一遍地收到相同的 Exception。如果我重新启动服务器,Exception 就会消失......只是稍后再次出现。

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

总结:
AWSCredentialsProvider 的实例(与 AWSCredentials 相对)传递给 AmazonDynamoDBClient 的构造函数,因为这可以自动刷新过期的 AWSCredentials(如果特定的 AWSCredentialsProvider 具有实现了刷新功能......所有标准 AWS 提供的都是这种情况)。

详情:
解决 AWS Java SDK DynamoDB 相关的 ExpiredTokenException 以前缀“请求中包含的安全令牌已过期(服务:AmazonDynamoDBv2;状态代码:400;错误代码:ExpiredTokenException;请求 ID : ...",您必须更改您的代码以提供 AWSCredentialsProvider 的实例(并停止使用 AWSCredentials 的实例 - 即没有 "Provider" 后缀)以AmazonDynamoDBClient 的构造函数。通过将 AmazonDynamoDBClient 的构造函数传递给 AWSCredentialsProvider 的实例,您赋予它 "automatically refresh the credentials" if/when [=13] 的能力=] 过期(我在这个 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 Java 文档和他们提供的示例(我自己的大部分代码都基于这些示例)上爬了多少,我一次都没有注意到这个特定的细微差别叫道。因此,我为那些追随我的人(可能包括我自己,大声笑)提供了非常详细的答案。