CI/CD 설정에 의해 자동으로 생성된 AutoScalingGroup(ASG)의 인스턴스(private subnet)들은
배포 시 마다 새로운 인스턴스로 교체되기 때문에
접속 설정을 저장하고 사용하기 어렵습니다.
인스턴스 내의 로그를 확인하거나 긴급 점검을 하는 경우
쉽게 해당 인스턴스에 접속할 수 있도록
autossh를 이용한 Shell script를 작성해 봤습니다.
※ autossh: https://www.harding.motd.ca/autossh/
※ Autossh Port Forwarding: https://medium.com/@gary4est/autossh-port-forwarding-23088d948787
#! /bin/bash
if [ ! ${1} ] || [ ! ${2} ]; then
echo "tunneling.sh {PRIVATE_IP} {LOCAL_PORT}"
exit 1
fi
SSH_PID=$(lsof -ti tcp:${2})
if [ ${SSH_PID} ]; then
AUTOSSH_PID=$(ps -o ppid -p ${SSH_PID} | tail -1)
echo "killing the process of autossh:${2}"
kill -9 ${AUTOSSH_PID}
echo "killing the process of TCP:${2}"
kill -9 ${SSH_PID}
fi
echo "tunneling by autossh..."
autossh -f -N -M 0 -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" \
-L ${2}:${1}:22 -i "{{Bastion_키_페어_파일}}" {{Bastion_사용자}}@{{Bastion_호스트}}
sleep 3
echo "removing ssh key of localhost:${2}"
nohup ssh-keygen -R "[localhost]:${2}" > /dev/null 2>&1
echo "connecting ${1}"
ssh -i "{{원격_키_페어_파일}}" {{원격_사용자}}@localhost -p ${2}
{{Bastion_키_페어_파일}} | Bastion host 키 페어 파일 |
{{Bastion_사용자}} | Bastion host 의 로그인 USER |
{{Bastion_호스트}} | Bastion host의 IP/도메인 |
{{원격_키_페어_파일}} | 접속할 원격 인스턴스의 키 페어 파일 |
{{원격_사용자}} | 접속할 원격 인스턴스의 로그인 USER |
예) 로컬의 9222 포트를 이용하여 원격 Host 234.234.234.234 에 접속하려는 경우
./{쉘_파일명} 234.234.234.234 9222
위와 같이 쉘 스크립트를 실행하면
1) 9222 포트로 실행 중인 프로세스 있는지 확인
2) 프로세스가 있다면 해당 프로세스를 실행시킨 autossh의 프로세스를 확인하여 종료
3) 9222 포트 프로세스 종료
4) autossh를 이용하여 로컬 9522 포트 통한 Tunneling 실행
5) 해당 로컬 포트로 등록된 ssh-key 삭제
6) 지정한 로컬 포트를 통해 원격 인스턴스에 접속
의 단계로 실행됩니다.
실제로 위와 같이 쉘을 실행하면
새로운 ssh-key를 통해 접속을 계속할 거냐고 묻는 화면이 나오고
yes를 선택하면 원격 호스트에 접속할 수 있습니다.