DevOps/Automation

[Automation] AWS CLI 이용하여 "EC2 instance 자동으로 켜고 Public IP 받기 자동화"

Background

  • Shell Script 공부 중 Ubuntu instance를 매일 껏다 켰다가 사용중이다.

  • EIP?

    terraform을 통해 구축 실습도 하기때문에 Elastic IP의 사용은 최대한 피할 수 있으면 피한다는 생각이다

  • EC2 instance는 매번 Stopped -> Running으로 올려줄때 Public IP가 변경된다. 이것 때문에 console에 로그인해서 IP를 복사해오는 과정이 귀찮아졌다.

 

Environment

  • AWS CLI 2.1.4
  • ZSH (OH-MY-ZSH) : ZSH에서는 Bash가 호환된다.

 

Step

1. 초기에는 Instance Id를 직접 AWS CLI command에 넣어서 결과값을 받는 형식으로 구현

2. Instance Id를 tag를 이용해서 가져오는 형식으로 구현

3. tag값을 User input으로 받아서 변수에 저장해 사용하는 형식으로 구현

 

Code

#/bin/bash

# Read user tags
read -p "Tag key : " tag_key
read -p "Tag Value : " tag_value

# Get tags { Name=Shell } instance id
instance_id=$(aws ec2 describe-instances --filter="Name=tag:$tag_key,Values=$tag_value" \
  --query "Reservations[].Instances[].InstanceId" --output=text --no-cli-pager)

# start instance
aws ec2 start-instances --instance-ids $instance_id --no-cli-pager
# wait instance state is 'running'
aws ec2 wait instance-running --instance-ids $instance_id
# get ec2 public ip
new_ip=$(aws ec2 describe-instances --instance-ids $instance_id \
    --query 'Reservations[*].Instances[*].PublicIpAddress' \
    --output text --no-cli-pager)
echo $new_ip

Automation Code는 Github에서 관리중입니다. 지속적으로 무언갈 만들거나, 업데이트할 예정입니다.

 

Use

Tag의 Key-Value 설정은 습관적으로!

Learn What?

1. --no-cli-pager 라는 AWS CLI 옵션을 이용하면 AWS CLI 명령의 출력이 새로운 창화면으로(~END로 끝나는) 전환되는 것을 없앨 수 있다.

2. --filter 은 조건 --query 는 조회 느낌이 강한 옵션이다.

3. 초기 Concept이긴하나 마지막에 출력받은 Public IP를 ssh connection에 바로 이용할 수 있도록 자동화를 하고 싶었으나 실패했다. 정확한 원인은 아직 모르겟으나 Shell Script상 연결되는 SSH Connection은 취약성의 문제로 안되거나 Instance에서 ssh config를 따로 설정해 주어야하는 부분이 있을꺼 같기도하다. (미해결)

 

"ssh connection refused" 거절인걸로 보아 remote 설정 문제일지도...? 아시는분 댓글좀..

 

> 자동화하고 싶은 Concept있으시면 댓글부탁드려요. 최대한 구현해보도록 해보겠습니다. 가능한!