Amazon EC2 User Data & AWS CLI for Automation

  • Scale Out vs Scale Up
  • Amazon EC2 - User Data
  • AWS Command Line Interface

 

2022.03.04 - [AWS] - Amazon EC2 - Web Server 만들기

 

Amazon EC2 - Web Server 만들기

EC2에 웹 서버를 올리고 웹 서비스를 서비스해보도록 할게요. 지금까지 포스팅한 거 짜깁기 EC2 instance 생성 웹 서버 설치 SG / NACL 설정 EC2 instance 생성 / 삭제 Free Tier 적용 범위 이미 EC2 instance를..

xodwkx2.tistory.com

 

이 전 포스트에서 t2.micro 크기의 EC2 instance를 하나 만들고 웹 서버를 올렸는데 이 사이트가 소문이 나서 사람이 많이 몰리기 시작했어요. 그래서 웹 서버가 열심히 일을 해도 사용자들에게 충분히 쾌적한 서비스를 제공할 수 없게 되었어요. 그래서 업그레이드?를 해야 할 필요를 느꼈어요. 이때 우리는 두 가지 선택을 할 수 있어요. 같은 크기의 EC2 instance를 하나 더 만들거나 기존 인스턴스는 삭제하고 더 성능이 좋은 인스턴스를 새로 하나 만드는 거예요. 그럼 클라우드 컴퓨팅에서 자주 등장하는 그리고 정말 중요한 이 두 가지 개념에 대해서 먼저 알아볼게요.

 

Scale Out vs Scale Up

- Scale Up

우리가 웹 서버를 만들 때 사용한 프리 티어 사용자에겐 무료인 이 t2.micro는 1 core vCPU에 1 GiB 메모리를 제공하는 인스턴스예요. 이 인스턴스를 2 core / 4 GiB의 t2.medium 인스턴스로 바꾼다면 사용자들에게 조금 더 쾌적한 서비스를 제공할 수 있겠네요. 

 

이렇게 인스턴스의 성능을 올리는 것을 Scale UP, 우리 말로 수직적 확장이라고 해요. 크게 신경 쓸 부분도 없고 가장 쉽게 성능을 올릴 수 있는 방법이에요. 이와 반대로 인스턴스의 성능을 줄이는 것을 Scale Down이라고 해요.

 

그럼 이와는 다르게 조금 신경 쓸 부분도 있고 조금 어렵게 성능을 올리는 방법도 알아볼게요.

 

- Scale Out

Scale Out은 우리말로 바꿔보면 수평적 확장이라고 해요. 먼저 만들었던 인스턴스와 같은 t2.micro 사이즈의 인스턴스를 하나 더 만들어서 동일하게 웹 서버를 꾸미고 동일하게 동작하게 만들면 끝이에요. 다만, 조금 신경을 써야 하는 부분은 서비스를 만드는 단계부터 수평적 확장을 생각해서 서비스를 만들어야 해요. 오늘은 로드 밸런싱에 대해 이야기를 하려는 게 아니니까 그 건 다음에 이야기해보도록 할게요. 반대로 인스턴스의 개수를 줄이는 것을 Scale In이라고 해요.

 

사실 오늘 이야기하고싶은 건 Scale Out을 일일이 손으로 해야 한다면 어떻게 해야 하나? 에요.

 

AWS 인스턴스 유형별 차이점과 종류는 아래 링크에서 확인해보세요.

https://aws.amazon.com/ko/ec2/instance-types/?nc1=h_ls 

 

Amazon EC2 인스턴스 유형 – Amazon Web Services

 

aws.amazon.com

 

Amazon EC2 - User Data

리눅스 서버를 신규로 만들게 되면 항상 설정하는 게 있어요. 히스토리 사이즈를 10,000 라인으로 늘리고 히스토리에 명령어를 입력한 날짜와 시간이 찍혀 나오도록 하는 거예요. 클라우드로 넘어오면서는 이 부분이 크게 중요하지 않게 되었지만 각자 서버를 설정하면서 본인 - 혹은 그룹 - 이 필수적으로 하는 설정이 있을 수 있잖아요? 그런 설정들을 인스턴스가 생성됨과 동시에 스크립트로 자동으로 구성해 줄 수 있는 기능이에요. 

 

인스턴스를 생성할 때 Advanced details 드롭 다운 메뉴를 눌러보면 맨 밑에 아래와 같은 텍스트 박스가 있어요.

Launch instance - User data

여기에 아래와 같은 스크립트를 붙여 넣어주세요.

#!/bin/bash
yum update -y
sed -i 's/HISTSIZE=1000/HISTSIZE=10000\nHISTTIMEFORMAT="%y-%m-%d %T "/g' /etc/profile
curl -fsSL https://rpm.nodesource.com/setup_lts.x | bash -
yum install -y nodejs

이렇게 위와 같이 User Data 설정 후 인스턴스를 생성하면 history 크기를 10,000줄로 늘려주고 history 명령어를 사용했을 때 날짜와 시간도 함께 나오게 돼요. 그리고 node.js가 기본적으로 설치되어있지 않은 AMI 이기 때문에 node.js도 설치를 해 줄게요.

 

이렇게 위와 같은 스크립트를 User data에 넣고 인스턴스를 생성하면 아무래도 스크립트가 완료되기까지 시간이 조금 걸릴 테니 충분히 여유를 두고 인스턴스에 접속해서 확인해 주세요

 

AWS Command Line Interface(CLI)

인스턴스를 생성할 때마다 콘솔 홈에 접속해서 웹 UI 환경에서 우아하게 마우스를 클릭하면서 작업을 하는 방법도 있지만 이런 방식은 자동화 하기 퍽 난감해요. 이럴 때 AWS CLI를 사용하면 명령어나 스크립트를 작성해서 필요할 때마다 일일이 웹 콘솔에 접속해서 작업하지 않아도 돼요. 그럼 먼저 AWS CLI를 설치하고 설정하는 방법까지 알아볼게요.

 

Install AWS CLI

https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/cli-chap-welcome.html

 

란 무엇입니까?AWS Command Line Interface? - AWS Command Line Interface

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

AWS CLI란 무엇입니까?를 따라 했어요.

 

먼저 이 작업을 하기에 앞서 필요한 사전 작업은 아래와 같아요.

- AWS 가입 

- IAM 사용자 생성

- Access Key ID와 Secret Access Key 생성

 

위 두 개는 이미 진행을 했어요 저는 xodwkxAdmin이라는 IAM 사용자를 가지고 작업을 해볼게요. 먼저 웹 콘솔에서 IAM 메뉴로 들어가 주세요. 그리고 Users에서 Administrator계정을 선택해 주세요. 그리고 Security credentials 탭에서 Access keys를 확인해주세요. 아무것도 없겠죠? 그럼 Access key를 만들어 봐요. Create access key 클릭.

그러면 아래와 같이 팝업창이 뜨는데 이때 SHOW 버튼을 눌러서 나오는 secret access key를 소중하게 잘 저장해 놓으셔야 해요. csv 파일을 받아놓는 것도 좋아요. 그리고 닫기 버튼을 눌러서 팝업을 꺼버리면 다시는 Secret access key를 확인할 수 없어요. 비밀키를 잊어버렸다면 새로 만드셔야 해요.

Secret access key를 잘 저장하고 Close 버튼을 눌러서 창을 닫으면 

이렇게 생성된 키를 볼 수 있어요.

 

AWS CLI 설치

그럼 이제 사전 준비작업은 모두 끝냈고 본격적으로 AWS CLI를 설치해볼게요.

 

https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/getting-started-install.html

 

의 최신 버전 설치 또는 업데이트AWS CLI - AWS Command Line Interface

설치 관리자의 아무 위치에서나 Cmd+L을 눌러 설치에 대한 디버그 로그를 볼 수 있습니다. 이렇게 하면 로그를 필터링하고 저장할 수 있는 로그 창이 열립니다. 로그 파일도 /var/log/install.log에 자

docs.aws.amazon.com

 

설치는 위 링크에 매우 자세하게 환경별로 정리가 잘 되어있어요. 저는 그중에서 리눅스 환경에 설치하는 걸 Ubuntu 20.04 버전 리눅스 따라 해 볼게요. 위 링크에서는 아래와 같은 환경을 지원한다고 나와있네요.

다음을 지원합니다. AWS CLI64비트 버전의 CentOS, Fedora, Ubuntu, Amazon Linux 1, Amazon Linux 2 및 Linux ARM
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

위 명령을 복사 붙여 넣기 하면 AWS CLI가 설치가 돼요. /usr/local/aws-cli/에 설치가 되고 /usr/local/bin/에 심볼릭 링크가 생성된 걸 확인할 수 있어요. 그리고 

aws --version

명령어를 통해서 잘 설치가 되었는지 확인도 가능해요. 

 

마지막으로 AWS CLI 자동완성 기능만 설정하고 다음 단계로 가보도록 할게요.

https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/cli-configure-completion.html

 

명령 완성 - AWS Command Line Interface

Amazon Linux를 실행하는 Amazon EC2 인스턴스에서는 기본적으로 명령 완성이 자동으로 구성되고 활성화됩니다.

docs.aws.amazon.com

 

# completer 경로 확인
which aws_completer

# SHELL 확인
echo $SHELL

# PATH에 /usr/local/bin/을 추가하는 내용을 .profile 파일에 작성
echo 'export PATH=/usr/local/bin/:$PATH' >> .profile

# .profile 변경사항 적용
. ~/.profile

# complete 명령어를 통해 aws-completer 추가
complete -C '/usr/local/bin/aws_completer' aws

# 하는 부분 .bashrc에 추가 
echo "complete -C '/usr/local/bin/aws_completer' aws" >> .bashrc

이렇게 해서 aws 명령어를 자동완성 기능과 함께 사용할 수 있어요.

 

마지막으로 access key를 설정해보도록 할게요.

aws configure
#AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
#AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
#Default region name [None]: ap-northeast-2
#Default output format [None]: json

aws configure 하고 엔터를 치면 위와 같이 몇 가지 정보를 물어봐요. 그럼 이때 아까 만든 access key ID와 secret access key를 넣어주시고 기본으로 사용할 리전 이름 그리고 마지막으로 출력 포맷을 설정하시면 돼요. 

 

마지막으로 현재 실행 중인 ec2 instance의 세부 정보를 보는 것으로 설정이 잘 완료되었는지 확인해볼게요.

aws ec2 describe-instances
{
    "Reservations": [
        {
            "Groups": [],
            "Instances": [
                {
                    "AmiLaunchIndex": 0,
                    "ImageId": "ami-0029dbeb91e3b0f5f",
                    "InstanceId": "i-04fa02e5bfe32ad25",
                    "InstanceType": "t2.micro",
                    "KeyName": "xodwkx2",
                    "LaunchTime": "2022-03-08T04:50:09+00:00",
                    "Monitoring": {
                        "State": "disabled"
                    },
...

설정이 잘 되었다면 위와 같이 나올 거예요. 

 

먼저 현재 실행 중인 인스턴스를 종료시킨 후에 User data에 위에서 만든 스크립트를 넣어서 새로운 인스턴스를 생성하는 것을 CLI를 통해서 해볼 거예요. 먼저 현재 실행 중인 인스턴스를 종료시켜야겠네요.

aws ec2 terminate-instances --instance-ids i-04fa02e5bfe32ad25

저기 위에서 인스턴스들의 상세 정보를 출력할 때 나왔던 InstanceId를 활용해서 인스턴스를 종료했어요.

 

이제 인스턴스를 생성해볼게요. 처음 EC2에 대해서 공부하면서 인스턴스 하나를 생성할 때 얼마나 많은 옵션들이 있었는지 기억한다면 이 걸 언제 다 쓰지?라고 생각할 수 있어요. 사실 쓸게 많기도 하지만 상당 부분 default로 설정된 값이 들어가기 때문에 필수적으로 넣어줘야 하는 옵션만 가지고 간단하게 인스턴스를 생성할 수 있어요. 아래 내용은 웹 콘솔을 통해서 하나하나 모은 정보들이에요.

 

Image ID ami-00192a6b2a7a94846 //AMAZON-LINUX (x86_64)
Type t2.micro
Key Name xodwkx2

그리고 위 내용들을 바탕으로 최대한 간단하게 인스턴스를 생성하는 명령어예요.

aws ec2 run-instances \
--image-id ami-00192a6b2a7a94846 \
--instance-type t2.micro \
--key-name xodwkx2 \
--user-data file:///Users/danielryu/Projects/AWS_Demos/userData.sh

이렇게 실행을 하게 되면 aws ec2 describe-instances --instance-ids instance-id

를 실행시킨 것과 같은 화면이 나오는데요 설정하지 않은 값들은 어떤 값들이 들어갔는지 한 번 확인해볼게요.

 

Public IP는 설정이 되어있네요. 예전에 PublicIPAssessment 설정 확인한 적 있었어요.

VPC와 subnet은 default VPC와 default subnet이 들어갔네요. 

그리고 가장 궁금했던 EBS device는 어떤 종류 얼마만큼의 용량이 붙을지 궁금했는데 gp2 타입의 8 GiB용량 스토리지네요.

그리고 파일로 넣어준 user-data도 잘 들어가서 history도 설정한 대로 보이고 node.js도 잘 설치되어있네요.

 

자 이제 위 명령어 한 줄만 있으면 인스턴스 하나 뚝딱하고 만드는 건 너무 쉬운 일이 되었네요.