오늘은 Redis 서버의 외부접근 허용에 대해 다뤄보겠습니다.
현재 프로젝트에서 refresh 토큰, 캐시, 휘발성 데이터 등을 효율적으로 관리하기 위해 Redis 서버를 구축하게 되었습니다.
하지만 계속 연결이 되지 않아 이유를 찾아보니, redis 관련 설정 파일을 작성하지 않으면 기본값으로 local주소만 허용한다는 것을 알게 되어, 해결한 내용을 기록해두려 합니다.
AWS에 Amazon ElastiCache
라는 서비스도 존재하지만, 비용이 조금 비싼것으로 보여서 직접 EC2 인스턴스에 서버를 구성해 보았습니다.
먼저, 저는 EC2(Amazone Linux) 인스턴스의 도커 컨테이너 위에 Redis를 실행시킨 환경입니다.
인스턴스 및 도커 환경은 미리 구성되어 있다고 판단하고 진행하겠습니다!
먼저 기본적인 redis 서버 실행입니다.
docker pull redis:latest
redis 최신 이미지를 내려받고,
docker run -{options} {이미지 이름}
컨테이너를 실행시키면, 간편하게 서버를 실행하실 수 있습니다.
3번 째 라인을 보시면 , Warning: no config file specified, using the default config. 라는 로그가 보입니다.
앞서 말씀드린대로, 별도의 설정파일 없이 서버를 구동한다면 bind 옵션(허용주소)의 기본값이 로컬주소인 127.0.0.1로 설정되어 실행되기 때문에, 외부에서는 레디스 서버에 접근할 수 없게 됩니다.
로컬에서만 사용하실 예정이라면 여기까지만 진행하셔도 됩니다.
하지만 저는 외부 접근 주소를 허용해야 하므로, 설정파일을 작성해 보겠습니다.
로그 내용을 끝까지 읽어보시면, 친절하게도 설정 파일의 경로를 입력하여 실행하라는 구체적인 방법까지 알려주고 있습니다ㅎㅎ
먼저 본인이 원하는 디렉토리에 redis.conf 파일을 만들어줍니다.
저는 그냥 홈 디렉토리에 생성했습니다.
bind 0.0.0.0
port 6379
생성한 redis.conf 파일에 위 내용을 작성해줍니다.
저는 모든 IP주소를 허용하기 위해 0.0.0.0으로 설정했고, 포트는 그대로 6379를 사용했습니다.
daemonize (yes/no) 옵션도 있는 것으로 보이나, 저는 어차피 도커 컨테이너로 실행할 것이기 때문에 생략했습니다.
이외에도 다양한 옵션이 존재하는데, 본인의 환경에 필요한 옵션들만 별도로 커스텀해주면 될 것 같습니다.
간단하게 설정파일 작성이 끝났습니다.
이제 서버를 실행할 때 , redis-server {redis.conf파일의 경로} 만 추가해주면 설정파일을 로드하여 서버가 실행됩니다.
하지만, 현재 설정파일은 호스트에만 존재하고 컨테이너 내부에는 존재하지 않습니다.
따라서 docker run 옵션으로 -v(볼륨)을 활용하거나, cp 명령어로 파일을 옮기시는 것도 하나의 방법일 것 같습니다.
저는 겸사겸사 도커파일을 작성했습니다.
FROM redis:latest
COPY ["redis.conf","/data/redis.conf"]
EXPOSE 6379
ENTRYPOINT ["redis-server","/data/redis.conf"]
도커파일을 빌드해줍니다.
정상적으로 빌드되었는지 확인합니다.
컨테이너를 실행합니다.
컨테이너가 정상적으로 실행되고 있는지 확인해봅니다. (docker ps)
redis-cli 명령어로, 정상적으로 서버가 구동되는 것 까지 확인해 보았습니다. (docker exec)
마지막으로, 로그를 확인하여 기본 설정으로 서버를 실행했을때와 비교해보겠습니다.
3번째 라인을 보시면, Configuration loaded 라는 로그가 찍혀있습니다.
기본값으로 실행했을 때는 설정파일이 없다는 메시지가 출력되었는데, 지금은 설정파일을 정상적으로 읽어온 것을 확인하실 수 있습니다.
이상으로 Docker 컨테이너에 Redis 서버를 구동시키는 방법에 대해 알아보았습니다.
다음에는 이번에 다루지 못했던 다른 설정 옵션들을 공부해볼 생각입니다.
감사합니다!