Redis로 바꾸고 배포해보니….
토큰의 저장소를 Redis로 바꾸게 되면서 EC2 인스턴스에 Redis를 설정,설치하고 다음과 같이 dev 프로파일에 저장하고 머지를 시켰다.
spring:
redis:
host: localhost
password:
port: 6379
로컬에서 dev 프로파일로 잘 동작하는 것을 확인했으니 아무 문제가 없겠지 하고 테스트해본 결과
500 에러가 떨어졌다. 😂
황급하게 로그를 확인하니 Redis에 접속을 못하고 있었던 것…
왜일까 생각하다가 스프링을 도커로 띄운다는 사실을 알게되었다. 스프링이 띄워져있는 도커의 IP를 확인해보니 localhost(127.0.0.1)와 전혀다른 IP가 떨어진다는 것을 확인할 수 있다.
이 문제로 미루어봤을 때 도커 컨테이너는 네트워크 IP를 하나 가지고 있는 독립적인 서버이며 해당 localhost는 스프링이 띄워져있는 도커 컨테이너의 IP를 가르키게 된다.
즉, EC2의 localhost와 도커 컨테이너의 localhost가 다르기 때문에 접속이 안되는 것이였다. ( 무작정 좋다고 쓰다가 이런 꼴 납니다…)
그럼 어떻게 해결해야할까?
해결방안
1. redis도 docker로 띄운다
redis도 docker로 띄운 뒤 redis:port
와 같은 방법으로 바인딩해준다.
docker-compose를 사용하면 모든 컨테이너가 동일한 네트워크 영역대를 사용하기 때문에 컨테이너간의 통신이 가능하며 서비스 이름이 해당 컨테이너를 지칭하는 DNS가 된다!
하지만 현재 docker-compose를 사용할 때 완전히 꺼버리고 다시 띄우기 때문에 영향이 간다고 생각해 다른 방법을 찾아보았다.
2. docker 컨테이너안에서 호스트 localhost 접속하기
먼저 docker-compose 파일을 수정해줘야 한다.
extra_hosts:
- "host.docker.internal:host-gateway"
다음과 같이 추가해줘서 host.docker.internal
을 열어준다.
이후 스프링의 redis host 설정에 host.docker.internal
를 입력해주게 되면 도커 컨테이너에서 외부 호스트에 접근할 수 있게 된다.
설정해준 뒤 실행하게 되면 다음과 같이 잘 동작하는 것을 볼 수 있다.
결론
무슨 기술을 쓰던 기본이 중요하다는 것을 다시 한번 깨닭게 되었다.
컨테이너마다 독립적인 ip를 가진다는 것을 알지 못하여 생기게 된 트러블 슈팅이기 때문에 기본을 알았다면 헤매지 않았을 것이다.
그래도 지금이라도 알았으니 다행이라는 마음을 가지고 있다.
댓글