배스천 호스트(Bastion Host)를 통해 Private Subnet ElastiCache를 접속할 수 있도록 설정한 상황입니다.
- 비용절감을 위해 ElastiCache Serverless 구성
- 테스트를 진행하기 위해서는 Bastion 서버에 Redis-Cli 설치가 선행되어야 합니다.
AWS 설치 링크 를 통해 Redis-Cli 를 설치할 수 있습니다.
EC2에서 테스트 시 주의사항으로 설치 대상 서버의 인스턴스 유형을 t.smail 이상으로 설정해야 합니다.
그렇지 않은 경우 OOM(Out Of Memory)가 발생하여 설치 중 서버가 다운될 수 있습니다.
ElastiCache Serverless 구성하면 접속 테스트 시 주의사항이 있습니다.
그 이유는 암호화 옵션이 default 로 활성화 적용되어 있습니다. (설정 변경 불가)
그로 인해 redis-cli 통한 접속 시 --tls 옵션이 필수입니다.
# ssh 설정을 통해 redis port를 6379 -> 56379 로 설정
redis-cli -h localhost -p 56379 --tls
localhost:56379> ping
PONG
localhost:56379>
1. 오류원인
Redis 암호화 옵션이 활성화 되어, TLS 옵션을 활성화 해야 합니다.
그러나 applicaion.yml 파일에서 TLS 옵션을 활성화 시켜도 빌드 시 Redis 접속 오류가 발생합니다.
spring:
redis:
host: localhost
port: 56379 # SSH 설정하여 포트 6379 -> 56379로 변경
ssl: true # TLS 사용 활성화
로그는 아래와 같습니다.
org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to localhost:56379
2. 해결책
Lettuce 라이브러리는 disablePeerVerification() 옵션을 적용한 후 Config 파일을 구성해야 합니다.
가이드 문서 링크 - https://lettuce.io/core/release/reference/#ssl
예제 코드는 아래를 참고해주세요
@Configuration
@RequiredArgsConstructor
public class RedisConfig {
private final RedisProperties redisProperties;
private static LettuceConnectionFactory getLettuceConnectionFactory(RedisProperties redisProperties) {
RedisStandaloneConfiguration redisConfig = new RedisStandaloneConfiguration(redisProperties.getHost(), redisProperties.getPort());
LettuceClientConfiguration lettuceConfig = LettuceClientConfiguration.builder()
.useSsl()
.disablePeerVerification()
.build();
return new LettuceConnectionFactory(redisConfig, lettuceConfig);
}
@Bean
@Primary
public RedisConnectionFactory cacheConnectionFactory() {
return getLettuceConnectionFactory(redisProperties);
}
...
}
읽어주셔서 감사합니다.
레퍼런스
반응형
최근댓글