【问题标题】:AWS Java SDK - invalid security tokenAWS Java SDK - 无效的安全令牌
【发布时间】:2021-08-30 15:46:12
【问题描述】:

我正在尝试在 EC2 机器上托管的应用程序上使用 AWS SNS Java 开发工具包。对于 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();
    }

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

【问题讨论】:

    标签: amazon-web-services amazon-ec2 aws-credentials


    【解决方案1】:

    在 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;
     }
    

    【讨论】:

    • 您是否在您的开发机器上测试了 Java 主要示例中的凭据以确保它们有效?
    • 是的,它有效。在 EC2 上,我从 ~/.bash_profile 设置了环境变量。至少它可以说安全令牌已过期..
    • 所以您的凭据在本地开发人员上有效,但在 EC2 上无效 - 即使使用环境变量?
    • 是的。如果这有什么不同,则本地开发人员上的系统使用 Windows。该应用程序部署为 Payara 下的 Web 存档。 web-archive 是建立在本地开发机器上的,但同样,我看不出这会以任何方式影响..
    • 今天我将在一台新的 EC2 机器上尝试同样的事情。另外,有没有办法记录 SDK 尝试使用的凭据?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    • 2021-04-23
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    • 2019-09-01
    • 2021-11-02
    相关资源
    最近更新 更多