Ctrl + Shift + ESC

Redis 500 No route to host 에러 - 2편 본문

Cloud/AWS

Redis 500 No route to host 에러 - 2편

단축키실행해보세요 2025. 7. 28. 02:56

이전 글

https://ctrl-shit-esc.tistory.com/198

 

Redis 500 No route to host 에러 - 1편

최근 스노로즈 서버의 프리 티어가 만료되어 새로운 AWS 계정으로 이전하는 작업을 진행했다.그런데 그 뒤로 자꾸 로그인 시 500 에러가 발생했다.ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - Servlet.service() fo

ctrl-shit-esc.tistory.com

해당 글의 3번 방법으로 아예 연결되지 않던 문제는 해결했으나, 일부 시점마다 Redis에서 500 에러가 발생했다.

임시 조치로

ps -ef | grep java
kill <PID>
. /home/ubuntu/app/scripts/start.sh

 

를 통해 재부팅을 실행했다.

 

문제 해결 과정

백엔드에서 main에 머지되어 DEV 서버에 배포될 때마다 로그인 문제가 발생하는 것으로 추정되었다.

따라서 문제가 발생했을 때 printenv 명령어나 jinfo 명령어로 정보를 출력해 보았다.

해당 로그에 애플리케이션에 대한 정보가 적혀 있어 전문을 올리지는 못하겠지만 REDIS_HOST 값을 찾아볼 수 없었다.

현재 애플리케이션은 Parameter Store에 저장된 REDIS_HOST 값을 받아와 해당 값을 바탕으로 연결하므로 문제 발생 원인을 애플리케이션이 처음 실행될 때 REDIS_HOST 값을 받아오지 않아서라고 생각했다.

 

그래서 해당 내용을 바탕으로 패치했음에도 동일한 문제가 발생했다.

그래서 다시 ps -ef | grep java 명령어로 확인해 보았다.

이전 PR에서 -Dspring.redis.host="${REDIS_HOST}”를 추가해서 이번부터는 redis.host의 값도 확인할 수 있었다.

root@ip-10-0-13-22:~# ps -ef | grep java
ubuntu    155219       1 21 08:32 ?        00:01:04 java -Dnetworkaddress.cache.ttl=0 -Dnetworkaddress.cache.negative.ttl=0 -Dspring.datasource.url=jdbc:mysql://snorose-dev.c3e4em0egivo.ap-northeast-2.rds.amazonaws.com/snorose_prod?rewriteBatchedStatements=true -Dspring.datasource.username=admin -Dspring.datasource.password=snorosePWD0409!RDS -Dspring.redis.host=master.for-redis-use.rrdvw9.apn2.cache.amazonaws.com -Duser.timezone=Asia/Seoul -jar server-0.0.1-SNAPSHOT.jar
root      155770  155736  0 08:37 pts/0    00:00:00 grep --color=auto java

 

java가 -Dspring.redis.host=master.for-redis-use.rrdvw9.apn2.cache.amazonaws.com을 받아오고 있다는 사실을 확인할 수 있었다. 여기서 경악을 금치 못했다. 왜냐하면...

 

REDIS_HOST의 첫 번째 버전의 값이었기 때문이다!

 

이를 확인하기 위해 codedeploy-agent.log를 S3로 내보내서 확인해 보았다.

2025-07-26T08:31:56 WARN  [codedeploy-agent(665)]: InstanceAgent::Plugins::CodeDeployPlugin::HookExecutor: Script at specified location: scripts/start.sh is not executable.  Trying to make it executable.

 

start.sh의 실행 권한이 없다는 것을 확인할 수 있었다.

따라서 해당 내용을 반영해 다시 PR을 올려 패치했으나 500 에러는 해결되지 않았다.

 

그래서 이번에는 전체 권한을 살펴보았다.

root@ip-10-0-13-22:/home/ubuntu/app/scripts# ls -al
total 28
drwxr-xr-x 2 ubuntu ubuntu 4096 Jul 26 12:37 .
drwxr-xr-x 6 ubuntu ubuntu 4096 Jul 26 12:37 ..
-rwxr-xr-x 1 ubuntu ubuntu  128 Jul 26 12:36 after-install.sh
-rwxr-xr-x 1 ubuntu ubuntu 2316 Jul 26 12:36 ssm.sh
-rwxr-xr-x 1 ubuntu ubuntu 1066 Jul 26 12:36 start.sh
-rwxr-xr-x 1 ubuntu ubuntu  547 Jul 26 12:36 stop.sh
-rwxr-xr-x 1 root   root    557 Jul 19 15:02 test_env.sh

 

스크립트 파일과 관련된 권한은 문제가 없는 것을 확인했다.

 

root@ip-10-0-13-22:/home/ubuntu/app/scripts# namei -l /home/ubuntu/app/scripts/ssm.sh
f: /home/ubuntu/app/scripts/ssm.sh
drwxr-xr-x root   root   /
drwxr-xr-x root   root   home
drwxr-x--- ubuntu ubuntu ubuntu
drwxr-xr-x ubuntu ubuntu app
drwxr-xr-x ubuntu ubuntu scripts
-rwxr-xr-x ubuntu ubuntu ssm.sh

 

하지만 ubuntu 폴더에 others 실행 권한이 없는 것을 확인할 수 있었다.

chmod o+x /home/ubuntu 명령어로 ubuntu 폴더에 실행 권한을 추가하여 문제를 해결했다!

 

그럼 실행은 어떻게 된 거에요?

사실 처음에는 좀비 프로세스인 줄 알았다. 첫 배포부터 나와 함께한...

 

하지만 deploy.log를 살펴봤을 때

Sat Jul 26 08:32:26 2025 > /home/ubuntu/app/server-0.0.1-SNAPSHOT.jar 파일 복사
Sat Jul 26 08:32:26 2025 > /home/ubuntu/app/server-0.0.1-SNAPSHOT.jar 파일 실행
Sat Jul 26 08:32:26 2025 > 실행된 프로세스 아이디 155219 입니다.

 

마지막으로 확인했던 이전 Redis 주소를 가져온 Java 프로세스(PID: 155219)가 다시 시작된 지 얼마 안 되었다는 점에서 좀비 프로세스는 아닌 것 같았다.

 

root@ip-10-0-13-22:# grep -r 'master.for-redis-use.rrdvw9.apn2.cache.amazonaws.com' /home/ubuntu/
/home/ubuntu/.bashrc:export REDIS_HOST=master.for-redis-use.rrdvw9.apn2.cache.amazonaws.com

 

이전에 export REDIS_HOST=master.for-redis-use.rrdvw9.apn2.cache.amazonaws.com 를 추가한 것이 /home/ubuntu/.bashrc에 남아 문제를 발생시킨 것 같았다.

.bashrc는 bash 환경파일로, ubuntu 사용자로 로그인하거나 셸이 실행될 때마다 자동으로 실행된다.

 

정리해보자면 다음과 같다.

  1. 과거의 내가 export REDIS_HOST=master.for-redis-use.rrdvw9.apn2.cache.amazonaws.com 추가
  2. CodeDeploy가 runas: ubuntu로 start.sh를 실행하기 위해 ubuntu 사용자의 셸을 연다.
  3. 이 셸이 열리는 순간, 시스템은 /home/ubuntu/.bashrc를 먼저 읽어 과거의 REDIS_HOST 값을 환경 변수로 설정한다.
  4. start.sh가 실행되고, 그 안의 . ssm.sh 명령이 실행된다.
  5. 하지만 권한 문제로 ssm.sh는 실패하고, REDIS_HOST 값을 가져와 환경 변수를 덮어쓰지 못한다.
  6. java -jar 명령어는 셸에 남아있던 과거의 REDIS_HOST 값을 그대로 상속받아 실행된다.

결론

권한을 잘 보자... 특히 배포와 관련된 파일들은 others에서도 실행될 수 있도록 권한을 꼼꼼히 살펴보자.

그리고 export 같은 명령어는 함부로 사용하지 말자...