我打算将消息发送到SNS,然后找到了AmazonSNSClient。我试过了

AWSCredentials credentials = new DefaultAWSCredentialsProviderChain()
  .getCredentials();
AmazonSNSClient client = new AmazonSNSClient(credentials);

我让我的服务实例持有该客户端以使其永远存活,但是在某个时候,错误开始发生。
com.amazonaws.AmazonServiceException:
The security token included in the request is expired
(Service: AmazonSNS; Status Code: 403; Error Code: ExpiredToken;
Request ID: d4bf427c-5b60-568b-a91c-0ea88356bc69)

显然,这是因为AmazonSNSClient并非旨在保持生命并且可以多次使用。 AmazonSNSAsyncClient似乎适合这种用法。

我的问题是AmazonSNSAsyncClient是线程安全的吗?且AmazonSNSAsyncClient有望在 token 请求未过期的情况下被多次使用?

谢谢您阅读此篇。

我问AWS在DynamoDB上是否支持类似问题,我说必须使用AWSCredentials代替AWSCredentialsProvider。尽管这不是有关SNSClient的答案,但我认为它可能会起作用。

最佳答案

通过使用“new DefaultAWSCredentialsProviderChain()。getCredentials()”,您将在那时获取AWS凭证的快照并将其提供给SNS客户端。如果您发现在某个时间点之后收到ExpiredToken错误,则很有可能取决于EC2角色提供的轮换凭证。

而不是将AWSCredentials传递到SNS客户端,请尝试传递DefaultAWSCredentialsProviderChain的实例。这应注意在凭据过期时自动刷新凭据。

异步客户端也会遇到相同的问题。

10-08 17:23