繁体   English   中英

如何在访问 Amazon SQS 时自动刷新 AWS STS 临时安全凭证?

[英]how to auto-refresh AWS STS Temporary security credentials when it expires while accessing Amazon SQS?

我有 spring 引导应用程序,使用 QueueMessagingTemplate 作为客户端使用临时安全凭证 (STS) 访问 Amazon SQS。 使用 STS-AssumeRole 获取临时令牌。 你能帮我如何刷新/自动刷新 session 令牌过期吗?

错误:com.amazonaws.services.sqs.model.AmazonSQSException:请求中包含的安全令牌已过期

这是代码:

@Configuration
@Slf4j
public class QueueConfig {

    @Bean
    public QueueMessagingTemplate queueMessagingTemplate(@Autowired BasicSessionCredentials sessionCredentials) {
            log.info("queueMessagingTemplate refresh");
            return new QueueMessagingTemplate(amazonSQSAsync(sessionCredentials));
    }

    @Bean
    @Primary
    public AmazonSQSAsync amazonSQSAsync(BasicSessionCredentials sessionCredentials) {
            return AmazonSQSAsyncClientBuilder
                    .standard()
                    .withRegion(Regions.US_WEST_1)
                    .withCredentials(new AWSStaticCredentialsProvider(sessionCredentials))
                    .build();
    }
}

这是 AWS STS cred 的代码

@Configuration
@Slf4j
public class AwsRoleCredentials {

    @Bean(name = "sessionCredentials")
    public BasicSessionCredentials sessionCredentials(){
        try {
            String roleArn = "XXXX";
            String roleSessionName = "XXX";
            Region region = Region.US_WEST_1;

            StsClient stsClient = StsClient.builder()
                    .region(region)
                    .build();

            AssumeRoleRequest roleRequest = AssumeRoleRequest.builder()
                    .roleArn(roleArn)
                    .roleSessionName(roleSessionName)
                    .build();

            AssumeRoleResponse roleResponse = stsClient.assumeRole(roleRequest);
            Credentials myCreds = roleResponse.credentials();


            BasicSessionCredentials sessionCred = new BasicSessionCredentials(
                    myCreds.accessKeyId(),
                    myCreds.secretAccessKey(),
                    myCreds.sessionToken());
            return sessionCred;

        } catch (StsException e) {
            log.error("ERROR while get token:"+ e.getMessage());
        }
        return null;
    }
}
    

我正要自己实现它,然后我发现在 sdk 的版本 2 中它已经存在,您可以使用StsAssumeRoleCredentialsProvider ,它负责在令牌即将过期时刷新令牌。 我不知道旧的 SDK 中是否有等效的东西。

但是您也可以很容易地为较旧的 SDK 实现它,只需存储到期时间并在即将到期时发出另一个 assumeRole 请求

编辑-我很困惑,因为您将 v1 sdk 用于 SQS,但您确实将 V2 SDK 用于 STS,因此您可以简单地使用 StsAssumeRoleCredentialsProvider。 另外,我建议使用 V1 或 V2,但不能同时使用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM