지난 글에서 ssh 터널링을 도커 백엔드 컨테이너에서 백그라운드로 수행하도록 해서 RDS에 접근했었다. 그러나 기본적으로 ssh는 일정 시간동안 입력이 없으면 연결이 끊어질 수 있고, 그 밖에 다양한 원인으로 인해 연결이 끊길 수 있다.
이렇게 끊기는 상황에서 매번 백엔드 컨테이너를 재시작하는데도 무리가 있어서, SSH연결을 자동으로 갱신해주는 방법이 필요했다. 찾아보니 이런 역할을 대신 해주는 autossh
패키지가 있었다.
이 ssh 작업을 위한 새로운 컨테이너를 만들까 고민을 해봤지만, 도커 빌드하는데 한나절 걸리는 우리 팀원들을 위해서 컨테이너 하나라도 줄여보자 싶어서 우선 백엔드 컨테이너에 설치해보기로 했다.
더 이상의 WSL오류는 사절이다 디버깅 시간을 조금이라도 줄이는 것이 생산성과 직결된다...
사용 중인 백엔드 컨테이너 이미지는 node:16.16
이다.
우선 실행중인 컨테이너에 접속
docker exec -it <container_id> /bin/bash
패키지 설치
apt install autossh
실패.
패키지를 찾을 수 없다고 나오기 때문에 우선 패키지 목록을 업데이트 해주어야 한다.
apt update
apt install autossh
이후에 다시 시도하면 성공!! 처음에 캡쳐를 못해서 한번 더 설치를 했더니 이미 있는 명령어라고 나왔는데 아무튼 설치가 잘 되었다.
이후는 간단하다. 기존 ssh 명령어를 그대로 autossh로 바꿔주면 된다.
autossh -fN -4 -i "${SSH_PEM_KEY}" -L ${MYSQL_PORT}:${RDS_HOST}:${MYSQL_PORT} ${SSH_USER}@${SSH_HOST}
테스트를 위해 EC2를 재부팅해보았다.
즉시 데이터베이스와의 연결이 끊겼다는 오류가 떴다. 그러나 잠시 기다리니 다시 연결이 자동으로 된 것을 볼 수 있었다.
이로써 ssh port forwarding을 통해 배스천 호스트인 EC2를 거쳐 RDS로의 접속 유지에 성공하였다.
그러나... 나의 목표는 우리 팀원들이 docker compose up
명령어 하나로 모든걸 해결할 수 있도록 하는 것이므로 마지막으로 이 명령어를 Dockerfile
에 추가해야 한다.
RUN apt update
RUN apt install autossh
윈도우... 그놈의 윈도우
마지막으로 윈도우에서 테스트 하는 과정에서 못보던 오류를 발견했다.
"/bin/bash^M: bad interpreter: No such file or directory"
ㅎㅎㅎ... 찾아보니 인코딩이 달라서 생기는 문제인 듯 하다. 여기까지 왔는데 이걸 팀원들에게 수동으로 수정하게 하고 싶지 않았으므로 명령어를 찾았다.
CMD sed -i -e 's/\r$//' ./entrypoint.sh
진짜 끝.
Prevent closing of SSH Local Port Forwarding
Bash script – "/bin/bash^M: bad interpreter: No such file or directory"