- Got an Spring Boot Project which uses spring-session-data-redis.
- Locally everything works out of the box. (localhost:6397)
- On the "upper" stages we are using Redis in AWS with one Configuration-Endpoint
- Problem: It's using AWS IAM.
- My task is to integrate AWS-IAM Credentials into my spring-session-data-redis-Project.
Solution I tried:
- Created this LettuceConfig as described in https://lettuce.io/core/5.3.7.RELEASE/reference/index.html
public class LettuceConfig {
@Value("${redis.host}")String redisHost;@Value("${redis.port}")int redisPort;@Value("${redis.userid}")String userId;@Value("${redis.replication.group.id}")String replicationGroupId;@Value("${redis.region}")String region;@Bean(destroyMethod = "shutdown")ClientResources clientResources() { return DefaultClientResources.create();}@Bean(destroyMethod = "shutdown")@PrimaryRedisClient redisClient(ClientResources clientResources) { RedisURI redisURI = RedisURI.builder() .withHost(redisHost) .withPort(redisPort) .withSsl(true) .withAuthentication(getCredentialsProvider()) .build(); return RedisClient.create(clientResources, redisURI);}@Bean(destroyMethod = "close")StatefulRedisConnection<String, String> connection(RedisClient redisClient) { log.info("Redis-Host in LettuceConfig:" + redisHost); return redisClient.connect();}public RedisCredentialsProvider getCredentialsProvider() { AwsCredentialsProvider awsCredentialsProvider = DefaultCredentialsProvider.create(); IAMAuthTokenRequest iamAuthTokenRequest = new IAMAuthTokenRequest(this.userId, this.replicationGroupId, this.region); // Create a Redis credentials provider using IAM credentials. return new RedisIAMAuthCredentialsProvider( this.userId, iamAuthTokenRequest, awsCredentialsProvider);}
Doesnt really works it creates the connection BUT spring-session-data-redis doesn't inject it in my opinion
The other really is more effective and is taken from https://github.com/spring-projects/spring-data-redis/issues/2769I still have problem with it..
@Configurationpublic class ClusterSessionConfig extends AbstractHttpSessionApplicationInitializer { @Value("${redis.host}") String redisHost; @Value("${redis.port}") int redisPort; @Value("${redis.userid}") String userId; @Value("${redis.replication.group.id}") String replicationGroupId; @Value("${redis.region}") String region; @Bean public LettuceConnectionFactory lettuceConnectionFactory() { RedisURI redisURI = RedisURI.builder() .withHost(redisHost) .withPort(redisPort) .withSsl(true) .withTimeout(Duration.ofSeconds(10)) .build(); LettuceClientConfiguration lettuceClientConfiguration = LettuceClientConfiguration.builder().redisCredentialsProviderFactory(new IAMCredentialsProviderFactory(userId,replicationGroupId,region)).commandTimeout(Duration.ofSeconds(30)).build(); return new LettuceConnectionFactory(LettuceConnectionFactory.createRedisConfiguration(redisURI),lettuceClientConfiguration); }}
So with this code I am running in a command timeout.Regarding infrastructure the security group is set. And I can also connect through vpn through redis-cli. But not through the dev-environment.
Maybe someone can help me?