we are currently sending/receiving messages from SQS queues. Loading credentials from the .aws/credentials
file which provides access_key, secret_access_key, session_token. After a few hours the credentials expire, so I am wondering how to refresh those without having to manually intervene.
AWS SQS Config:
@Configuration
public class AwsSqsConfig {
@Value("${spring.cloud.aws.region.static}")
private String region;
@Value("${spring.cloud.aws.sqs.endpoint}")
private String endpoint;
@Value("${spring.cloud.aws.credentials.profile.name}")
String profileName;
@Bean
public AwsCredentialsProvider awsCredentialsProvider() {
return ProfileCredentialsProvider
.builder()
.profileName(profileName)
.build();
}
@Bean
SqsAsyncClient sqsAsyncClient(AwsCredentialsProvider awsCredentialsProvider) throws URISyntaxException {
return SqsAsyncClient.builder()
.endpointOverride(new URI(endpoint))
.region(Region.of(region))
.credentialsProvider(awsCredentialsProvider)
.build();
}
@Bean
public SqsTemplate sqsTemplate(SqsAsyncClient sqsAsyncClient) {
return SqsTemplate.builder().sqsAsyncClient(sqsAsyncClient).build();
}
}
SQS Message Listener:
@Component
@AllArgsConstructor
public class SQSMessageListener {
private static final Logger log = LoggerFactory.getLogger(SQSMessageListener.class);
private ThreadPoolTaskScheduler threadPoolTaskScheduler;
private SqsTemplate sqsTemplate;
@SqsListener("check-event-status")
public void receiveCheckEventStatusMessage(String message) {
log.trace("Received check event status message: {}", message);
// Logic below...
}
@SqsListener("update-service")
public void receiveUpdateServiceMessage(String message) {
log.trace("Received update service message: {}", message);
// Logic below...
}
@SqsListener("creation")
public void receiveCreationMessage(String message) {
log.trace("Received creation message: {}", message);
// Logic below...
}
@SqsListener("execution")
public void receiveExecutionMessage(String message) {
log.trace("Received execution message: {}", message);
// Logic below...
}
}
Creation Task:
@Component
@AllArgsConstructor
public class CreationTask implements Runnable {
private static final Logger log = LoggerFactory.getLogger(CreationTask.class);
private SqsTemplate sqsTemplate;
@Override
public void run() {
log.trace("Running CreationTask");
log.trace("Sending payload-1");
String payload1 = Status.SCHEDULED.name() + ":1";
sqsTemplate.send(sqsSendOptions -> sqsSendOptions.queue("execution").payload(payload1));
log.trace("Sending payload-2");
String payload2 = Status.INPROGRESS.name() + ":2";
sqsTemplate.send(sqsSendOptions -> sqsSendOptions.queue("execution").payload(payload2));
log.trace("Sending payload-3");
String payload3 = Status.CLOSED.name() + ":3";
sqsTemplate.send(sqsSendOptions -> sqsSendOptions.queue("execution").payload(payload3));
}
}