0

我正在尝试在 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();
    }

你知道会发生什么吗?谢谢!

4

1 回答 1

0

在 EC2 实例上使用 SNS 服务时,您可以尝试查看它是否有效的一件事是设置环境变量。当我将 Web 应用程序部署到使用 SNS Java V2 API 的 EC2 实例(使用 Elastic Beanstalk)上时,我已经做到了,并且运行良好。

private SnsClient getSnsClient() {

    Region region = Region.US_WEST_2;
    SnsClient snsClient = SnsClient.builder()
            .credentialsProvider(EnvironmentVariableCredentialsProvider.create())
            .region(region)
            .build();

    return snsClient;
 }
于 2021-06-14T18:30:04.807 回答