매일같이 ssh 를 이용해 EC2에 접속하는 아래 과정이 매우 귀찮았다.

  1. AWS Console Login
  2. EC2 List 조회
  3. 접속을 원하는 EC2 선택
  4. Public IP 복사하기
  5. 터미널에서 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 에 접속하는 용도로도 쓰기 좋을 것이다.