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

cha*_*ium 7 java amazon-dynamodb aws-sdk

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

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

cha*_*ium 15

简介:
传递AWSCredentialsProvider(而不是AWSCredentials)AmazonDynamoDBClient构造函数的实例,因为这样可以自动刷新过期AWSCredentials(如果特定AWSCredentialsProvider实现了刷新功能......所有AWS提供的标准都是这种情况).

详细信息:
要解决AWS Java SDK与DynamoDB相关的ExpiredTokenException,其前缀为" 请求中包含的安全令牌已过期(服务:AmazonDynamoDBv2;状态代码:400;错误代码:ExpiredTokenException;请求ID:... "),您必须改变你的代码以提供一个实例AWSCredentialsProvider(并停止使用 - 的实例AWSCredentials- 即没有"Provider"后缀)到AmazonDynamoDBClient构造函数.通过将AmazonDynamoDBClient构造函数的实例交给AWSCredentialsProvider你,你可以让它"自动刷新"凭证"如果/何时AWSCredentials到期(我在此AWS论坛帖子中发现需要帐户访问).

为了在代码中提供一个明确的示例,这里是代码产生的概括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
Run Code Online (Sandbox Code Playgroud)

这里是代码的概括,消除了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
Run Code Online (Sandbox Code Playgroud)

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

  • 感谢您发布此内容. (2认同)