我正在尝试在 EC2 机器上托管的应用程序上使用 AWS SNS Java SDK。对于 SNS SDK,提供凭证的方式不同于其他 SDK,如 S3。我没有指定任何凭据链机制,在我的本地机器上,它似乎默认从 .aws/credentials 文件中提取凭据。
我已从位于 ~/.aws/credentials 的 EC2 机器上更新了我的凭据。但是,在 EC2 上运行我的应用程序时,尝试将消息发布到 SNS 时出现以下错误:
software.amazon.awssdk.services.sns.model.SnsException:请求中包含的安全令牌无效。(服务:Sns,状态码:403,请求 ID:3177217e-e32d-5df5-ab2a-783f74fb6209,扩展请求 ID:null)
到目前为止我尝试过的事情:
- 我已授予 .aws 文件夹 777 权限。
- 检查 $HOME 变量,它输出:/home/ec2-user。对我来说这似乎没问题。
- 尝试从代码中硬编码 AWS 凭证,但 SDK 似乎不允许指定会话令牌。
- 我必须提到我在使用 S3 时遇到了同样的问题,但是 SDK 允许我从代码中完全指定凭据。
我已按如下方式导入了 SNS SDK:
pom.xml
...
<dependencyManagement>
<dependencies>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>bom</artifactId>
<version>2.16.29</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
...
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>sns</artifactId>
</dependency>
最低限度的 SNS Java 代码:
SnsClient client = SnsClient.builder()
.region(Region.US_EAST_1)
.build();
try {
PublishRequest request = PublishRequest.builder()
.message("message")
.topicArn("topicName")
.build();
PublishResponse result = client.publish(request);
System.out.println("Published: " + message + " " + result.messageId() + " Message sent. Status was " + result.sdkHttpResponse().statusCode());
} catch (SnsException e){
e.printStackTrace();
}
你知道会发生什么吗?谢谢!