如何修复导致 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 文档和他们提供的示例(我自己的大部分代码都基于这些示例)上爬了多少,我一次都没有注意到这个特定的细微差别叫道。因此,我为那些追随我的人(可能包括我自己,大声笑)提供了非常详细的答案。
我有一个很长的 运行 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 文档和他们提供的示例(我自己的大部分代码都基于这些示例)上爬了多少,我一次都没有注意到这个特定的细微差别叫道。因此,我为那些追随我的人(可能包括我自己,大声笑)提供了非常详细的答案。