본문 바로가기

카테고리 없음

[Spring, Redis, Infra] Redis 비밀번호 설정, RedisConnectionFailureException, Unable to connect to Redis 에러

현재 관광데이터 활용 공모전에 참가중입니다.
저는 인프라, 백엔드를 맡았습니다.

막바지에 다다르고 있네요 관련해서 포스팅 할게 많은데 끝나고 하겠습니다..ㅎㅎ

오늘 문제는 redis 비밀번호 설정 중 빠뜨린 설정이 있어서 발생한 문제인데 전체적인 비밀번호 설정 과정을 포스팅 하는것이
더 나을것같아서 그렇게 진행하겠습니다.
바쁘신 분들은 문제해결 및 Redis비밀번호 설정 구현 만 보시면 됩니다.

문제

문제는 Redis 비밀번호 설정 중 일어났습니다.

Redis를 이용한 Cache 처리를 하면서 비밀번호 처리를 통해 보안을 강화하고자 했고 그 과정에서 에러가 발생했습니다.

 

Docker logs를 통해 backend 컨테이너의 에러를 파악해본 상태입니다.

RedisConnectionFailureException: Unable to connect to Redis라는 문구를 확인할 수 있습니다.

 

먼저 비밀번호가 제대로 설정되었는지 확인해보았습니다.

# 컨테이너 접속
docker exec -it {Redis 컨테이너 이름} /bin/bash

# CLI 접속
redis-cli

# 테스트
PING

# 비밀번호 입력
AUTH {설정한 Redis 비밀번호}

 


비밀번호가 제대로 설정되어 있다면 다음과 같은 에러가 나옵니다.

비밀번호를 입력해서 설정한 비밀번호가 맞는지 확인해보았습니다.

 

문제 해결 및 Redis 비밀번호 설정 구현

 

환경변수 파일에만 password를 설정하고 RedisConfig에 password 설정을 안해준것이 문제였습니다.

변경된 설정파일만 보여드리기 보다는 Redis에 비밀번호를 설정한 전체 과정을 보여드리겠습니다.

 

1. 비밀번호가 설정된 Redis 컨테이너 띄우기

# redis 컨테이너 실행
docker run -d --name redis --network {사용중인 도커 네트워크} -p 6379:6379 redis --requirepass {사용할 비밀번호}

 

제가 실제 사용한 명령어를 그대로 가져왔습니다.

명령어의 각 옵션은 다음과 같습니다.

  • -d: 컨테이너를 백그라운드에서 실행
  • --name redis: 생성할 컨테이너 이름을 redis로 지정
  • --network {사용중인 네트워크}: 설정한 네트워크 내에서 컨테이너가 서로 통신할 수 있게 합니다. Docker compose로 실행하면 같은 네트워크가 자동으로 할당되는것으로 알고있지만 저는 하나씩 올렸기 때문에 설정해주었습니다.
  • -p 6379:6379: 호스트의 6379포트를 컨테이너의 6379 포트에 매핑합니다. Redis 서버의 기본포트가 6379여서 저도 맞췄습니다.
  • redis: redis 이미지를 사용합니다.
  • --requirepass: 레디스에서 사용할 비밀번호를 설정합니다.

2. application.yml, application.properties 설정

저희 Backend는 SpringBoot 프로젝트입니다.

환경변수 파일에서 redis 관련 변수를 설정해주었습니다.

 

3. RedisConfig

저는 이부분을 빼먹어서 문제가 발생했습니다.

 

환경 변수에서 지정한 host, password, port를 가져옵니다.

 

RedisStandaloneConfiguration는 Redis에서 단일 인스턴스에 redis를 연결하기 위한 설정 정보를 가지고 있는 기본 클래스 입니다.

LettuceConnectionFactory는 Lettuce 클라이언트를 사용하여 Redis와의 연결을 관리합니다. 비동기적으로 Redis에 연결하고 성능이 좋다고 하여 사용했습니다.

 

RedisStandaloneConfiguration을 redisConfig라는 이름으로 생성하고 host, password, port를 설정해주었습니다.

코드로도 올리겠습니다.

@RequiredArgsConstructor
@Configuration
public class RedisConfig {

    @Value("${spring.redis.host}")
    private String host;

    @Value("${spring.redis.password}")
    private String password;

    @Value("${spring.redis.port}")
    private int port;

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        RedisStandaloneConfiguration redisConfig = new RedisStandaloneConfiguration();
        redisConfig.setHostName(host);		// 호스트 이름
        redisConfig.setPort(port);			// 포트
        redisConfig.setPassword(password);	// 비밀번호
        return new LettuceConnectionFactory(redisConfig);
    }
}

 

해당 설정 완료후 백엔드 컨테이너를 다시 빌드하였습니다.

캐시 사용 메서드를 사용하고, 제대로 값이 redis를 사용할 수 있는지 확인하엿습니다.

 

제가 캐시 사용중 키로 설정한 값이 제대로 들어가 있는것을 확인하였습니다.

SpringBoot와 Redis가 설정한 비밀번호를 통해 제대로 연결되었습니다.


초보 개발자의 글이라 부족한 점이 많습니다. 잘못된 점 등을 말씀해주시면 감사히 받겠습니다.