SQS ExpiredToken:请求中包含的安全令牌为过期状态码:

时间:2019-05-05 12:10:48

标签: amazon-web-services amazon-sqs

我要在遵循规则后尝试连接到AWS sqs,并且在一小时后收到过期的安全令牌错误,如何自动刷新连接?

@Bean
    public QueueMessagingTemplate queueMessagingTemplate(){
        return new QueueMessagingTemplate(amazonSQSAsync());
    }

    private AmazonSQSAsync amazonSQSAsync(){
        try {
            logger.info("Start amazonSQSAsync");

            AWSSecurityTokenService stsClient = AWSSecurityTokenServiceClientBuilder.standard()
                    .withCredentials(new DefaultAWSCredentialsProviderChain())
                    .withRegion(AWS_REGION)
                    .build();
            logger.info("stsClient created successfully");
            AssumeRoleRequest roleRequest = new AssumeRoleRequest()
                    .withRoleArn(ROLE_ARN)
                    .withRoleSessionName(ROLE_SESSION_NAME)
                    .withDurationSeconds(3600);
            AssumeRoleResult assumeRoleResult = stsClient.assumeRole(roleRequest);
            logger.info("assumeRoleResult created successfully");
            BasicSessionCredentials basicSessionCredentials = new BasicSessionCredentials(
                    assumeRoleResult.getCredentials().getAccessKeyId(),
                    assumeRoleResult.getCredentials().getSecretAccessKey(),
                    assumeRoleResult.getCredentials().getSessionToken());
            logger.info("basicSessionCredentials created successfully");
            AmazonSQSAsync amazonSQSAsync = AmazonSQSAsyncClientBuilder.standard()
                    .withCredentials(new AWSStaticCredentialsProvider(basicSessionCredentials))
                .withRegion(AWS_REGION).build();
//                    .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(SQS_URL,"us-east-2"))
            logger.info("amazonSQSAsync created successfully");
            return amazonSQSAsync;
        } catch (Exception e){
            logger.error("Failed to create Amazon sqs client", e);
            throw e;
        }
    }

1 个答案:

答案 0 :(得分:0)

您可以从STSAssumeRoleSessionCredentialsProvider获取自动续订凭据:

AWSSecurityTokenService stsClient 
    = AWSSecurityTokenServiceClientBuilder.defaultClient();

STSAssumeRoleSessionCredentialsProvider assumedRoleCredentialsProvider
    = new STSAssumeRoleSessionCredentialsProvider.Builder(ROLE_ARN, SESSION_ID)
      .withStsClient(stsClient)
      .build();

AmazonSQS sqsClient 
    = AmazonSQSClientBuilder.standard()
      .withCredentials(assumedRoleCredentialsProvider)
      .build();

请注意,在使用派生客户端时,无法关闭stsClient。根据AWS的建议,创建一个可以持续整个程序生命周期的单例实例。