AWS EC2에 SSH 쉽게 접속하기
매일같이 ssh
를 이용해 EC2에 접속하는 아래 과정이 매우 귀찮았다.
- AWS Console Login
- EC2 List 조회
- 접속을 원하는 EC2 선택
- Public IP 복사하기
- 터미널에서 ssh 명령어로 접속하기
EC2를 리스트로 출력하고 숫자만 쳐도 ssh
로 접속할 수 있는 간단한 script 를 작성하기로 했다.
결과 먼저 보기
소스코드(?)라고 하기에는 민망한 코드는 여기 있다.
https://github.com/stevenshim/easy-ssh-ec2
$ zz <--- 접속 명령
Num IP Name ID Type
1 54.111.111.111 my-test-server i-05477041111111111 m5.large
2 54.111.222.222 jenkins-build i-0655cbe1111111111 t3.small
3 54.111.123.123 nginx-server i-0efffb71111111111 t3.micro
Enter Server Numer: 1 <--- 숫자 선택
...
...
Welcome to Ubuntu 18.04.2 LTS (GNU/Linux 4.15.0-1032-aws x86_64)
ubuntu@ip-172-16-1-205:~$ <--- 접속 완료
Prerequisites (사전 준비)
ssh
접속용key pair
를~/.ssh/id_rsa
에 위치한다. (~/.ssh/id_rsa 에 위치하지 않으려면 zz.sh 의 ssh 에 -i your-key.pem 처럼 추가하면 된다.)- Local machine 에
awscli
를 설치한다. - Local machine 에
aws configure
를 통해access key pair
를 지정한다. - 위에 설정한
access key pair
는 EC2를 조회할 수 있는 권한이 있어야 한다.
EC2 List 조회하기
먼저 EC2 List 를 조회해서 EC2정보 일부를 추출해보자.
아래는 Running 중인 EC2에서 Public IP, Name, Instance-ID, Instance-Type 정도만 조회한다.
아래 내용을 ec2.sh
파일로 작성 한다.
EC2_LIST=~/.ec2_list
aws ec2 describe-instances \
--query 'Reservations[].Instances[].[PublicIpAddress, Tags[?Key==`Name`]|[0].Value, InstanceId, InstanceType]' \
--filters "Name=instance-state-code,Values=16" \
--output text | grep -v None > $EC2_LIST
awscli
를 이용해 EC2를 조회한다.
-
--filters "Name=instance-state-code,Values=16"
는 Running(Values=16) 중인 EC2 만 조회한다.- 상태 코드 참고
- 0 : pending
- 16 : running
- 32 : shutting-down
- 48 : terminated
- 64 : stopping
- 80 : stopped
- 상태 코드 참고
-
--query
부분은 EC2의 많은 정보 중 필요한 정보만 조회하도록 한다.
위에서 조회된 EC2 List 는 ~/.ec2_list
경로에 저장된다.
잘 나오는지 출력 한번 해보자.
$ cat ~/.ec2_list
54.111.111.111 my-test-server i-05477041111111111 m5.large
54.111.222.222 jenkins-build i-0655cbe1111111111 t3.small
54.111.123.123 nginx-server i-0efffb71111111111 t3.micro
숫자로 접속 하는 코드 작성
awscli
로 가져온 결과를 바로 쓰기보다 나눠서 쓰기로 생각했다.
이유는,
awscli
결과를 손 쉽게rownum
숫자를 붙이는게 까다로웠다.awscli
호출 시 마다 약간의 기다림이 필요하다. 게다가 기존의 EC2 정보는 자주 변하지 않는다.
저장된 파일을 읽어서 rownum
을 달아 출력하고, 숫자를 입력받아 접속하도록 해보자.
아래 내용을 zz.sh
파일로 작성 한다.
#!/bin/bash
EC2_LIST=~/.ec2_list
USER=ubuntu
LINE_NUM=1
ARRAY=()
echo -e "Num \t IP \t\t Name \t\t ID \t\t\t Type"
while read LINE
do
echo -e "$LINE_NUM \t $LINE"
LINE_NUM=$(( $LINE_NUM+1 ))
IP=$(echo $LINE | awk '{print $1}' )
ARRAY+=($IP)
done < $EC2_LIST
echo ""
echo -n "Enter Server Numer: "
read READ_NUM
echo -n "Enter ssh user (default: ubuntu) or 'enter' to use default. : "
read READ_USER
if [ ! -z $READ_USER ]
then
USER=$READ_USER
fi
echo "ssh $USER@${ARRAY[$READ_NUM-1]}"
ssh $USER@${ARRAY[$READ_NUM-1]}
alias 로 등록하기
아무때나 명령어 처럼 사용하도록 alias로 등록해보자.
아래 alias는 bash_profile 같은데 넣어놔도 된다.
alias ec2=/home/steven/script/ec2_list.sh
alias zz=/home/steven/scrtip/zz.sh
마무리
코드도 변경도 없을 것 같고, 후딱 만들어 재사용도 고려하지 않았다.
적당히 수정하면 Bastion Host -> Target ec2 에 접속하는 용도로도 쓰기 좋을 것이다.