이전 글
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 사용자로 로그인하거나 셸이 실행될 때마다 자동으로 실행된다.
정리해보자면 다음과 같다.
- 과거의 내가 export REDIS_HOST=master.for-redis-use.rrdvw9.apn2.cache.amazonaws.com 추가
- CodeDeploy가 runas: ubuntu로 start.sh를 실행하기 위해 ubuntu 사용자의 셸을 연다.
- 이 셸이 열리는 순간, 시스템은 /home/ubuntu/.bashrc를 먼저 읽어 과거의 REDIS_HOST 값을 환경 변수로 설정한다.
- start.sh가 실행되고, 그 안의 . ssm.sh 명령이 실행된다.
- 하지만 권한 문제로 ssm.sh는 실패하고, REDIS_HOST 값을 가져와 환경 변수를 덮어쓰지 못한다.
- java -jar 명령어는 셸에 남아있던 과거의 REDIS_HOST 값을 그대로 상속받아 실행된다.
결론
권한을 잘 보자... 특히 배포와 관련된 파일들은 others에서도 실행될 수 있도록 권한을 꼼꼼히 살펴보자.
그리고 export 같은 명령어는 함부로 사용하지 말자...