Para publicar mensajes en SNS, necesito asumir el rol correcto, por lo que cuando uso AWS SDK, creo un bean de AmazonSNS como este:
@Bean public AmazonSNS amazonSnsClient( @Value("${cloud.aws.credentials.accessKey}") String accessKey, @Value("${cloud.aws.credentials.secretKey}") String secretKey, @Value("${cloud.aws.role.publisherArn}") String publisherRoleArn ) { AWSSecurityTokenService stsClient = AWSSecurityTokenServiceClientBuilder.standard() .withRegion(EU_CENTRAL_1) .withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretKey))) .build(); STSAssumeRoleSessionCredentialsProvider credentialsProvider = new STSAssumeRoleSessionCredentialsProvider .Builder(publisherRoleArn, SESSION_NAME) .withStsClient(stsClient) .build(); return AmazonSNSClientBuilder.standard() .withRegion(EU_CENTRAL_1) .withCredentials(credentialsProvider) .build(); }Estoy tratando de hacer lo mismo con Spring Cloud AWS Messaging & Autoconfiguration pero hasta ahora no encontré ninguna información sobre el tema. Mi aplicación.yml se ve así
cloud: aws: credentials: accessKey: *** secretKey: *** instanceProfile: true region: static: eu-central-1¿Es compatible con Spring y simplemente no logré encontrarlo o debería limitarme a AWS SDK?
Parece que no hay una solución lista para usar para eso. La solución más sencilla es crear su propio bean AWSCredentialsProvider
@Configuration public class AwsCredentials { private static final String SESSION_NAME = "TestConsumer"; @Bean @Primary public AWSCredentialsProvider credentialsProvider( @Value("${cloud.aws.credentials.accessKey}") String accessKey, @Value("${cloud.aws.credentials.secretKey}") String secretKey, @Value("${cloud.aws.role}") String role ) { AWSSecurityTokenService stsClient = AWSSecurityTokenServiceClientBuilder.standard() .withRegion(EU_CENTRAL_1) .withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretKey))) .build(); return new STSAssumeRoleSessionCredentialsProvider .Builder(role, SESSION_NAME) .withStsClient(stsClient) .build(); } }