DevOps

AWS 자동 배포하기 (1) - EC2, Auto Scaling, Load Balancing

팅리엔 2021. 1. 24. 00:31

이 글에선

Auto Scaling을 통해 자동으로 EC2를 생성하고 로드밸런서에 등록하는 방법에 대하여 알아본다.

 

 

훑어보기

보통의 서비스 운영 환경은 단일 서버로 이루어지지 않는다.

한 서버가 장애로 사용 불가능해지면 다른 서버가 대신 요청을 받고, 트래픽에 따라 서버의 수를 조절하기도 한다.

 

위 그림의 아키텍처에서 클라이언트가 요청을 하면,

로드밸런서가 요청을 받아 Target 그룹 내 서버들에게 고르게 요청을 전달한다.

이 Target 그룹에는 어떤 특정한 EC2 인스턴스가 속할 수도 있고, Auto Scaling 그룹이 속할 수도 있다.

 

 

 


 

 

1. Auto Scaling 그룹

Auto Scaling 그룹이란, 같은 AMI(Amazon Machine Image)를 이용해 만들어진, 똑같은 환경의 EC2 인스턴스들의 그룹을 말한다. 그룹 내 인스턴스의 수를 자동으로 조정할 수 있다. CPU 사용량, 요청 수의 증감 등에 따라 조정하거나, 시간을 예약하여 인스턴스의 수를 조정하는 것도 가능하다.

 

https://docs.aws.amazon.com/ec2/index.html#amazon-ec2-auto-scaling

 

docs.aws.amazon.com

 

자동으로 EC2 인스턴스를 생성하려면 우선 어떤 EC2 인스턴스를 만들 것인지 정해야 한다.

나는 스프링부트 어플리케이션을 실행할 EC2 인스턴스를 만들고 싶다.

이제 아래와 같은 순서에 따라 Auto Scaling 그룹을 구성해보자.

 

 

  1. EC2 인스턴스를 하나 만든다.
    해당 인스턴스에 접속하여 스프링부터 어플리케이션이 실행될 수 있는 환경으로 만든다.
  2. 인스턴스의 현재 환경(운영체제, 디스크 내용 등등)을 스냅샷으로 만들어 AMI(Amazon Machine Image)를 만든다.
    이 AMI를 이용해 새로운 똑같은 인스턴스를 생성하는 게 가능하다. (*AMI이란?)
  3. AMI, 서버 사양, 보안 그룹 등을 설정하여 시작템플릿을 생성한다. (*시작템플릿이란?)
  4. 시작템플릿을 이용해 Auto Scaling 그룹을 만든다.

 

1-1. AMI 생성용 EC2 인스턴스 생성하기

EC2 인스턴스 생성

[인스턴스] - [인스턴스 시작] 클릭

  • AMI 선택 : 프리티어 사용이 가능한 AMI을 선택했다.
  • 인스턴스 세부 정보 구성
  • 스토리지 추가
  • 태그 추가 : 구분이 쉽도록 Name / my-instance
  • 보안그룹 구성 : 22(ssh), 8080 포트 접속을 허용한다.
  • 키 페어 선택 또는 생성

 

EC2 인스턴스 접속하여 환경 구성

다운받은 키 페어를 이용하여 ssh로 EC2 인스턴스에 접속하여 JRE를 설치한다.

# JRE 설치
sudo yum install java-1.8.0-openjdk.x86_64

애플리케이션 실행을 위한 설정이 모두 끝나면 접속을 끊고 인스턴스를 중지시킨다. AMI을 생성하기 위해선 인스턴스가 중지 상태여야 한다.

이제 이 인스턴스를 AMI 생성에 사용할 것이다. 앞으로 우리가 사용할 서버에 변화를 줘야 한다면 (ex. 새로운 패키지 설치 등), 이 인스턴스를 실행시켜 원하는 작업을 하고 중지시켜 새로운 이미지를 생성한다.

 

 

1-2. AMI, 시작템플릿 생성하기

이미지 생성

[인스턴스] - [작업] - [이미지 및 템플릿] - [이미지 생성] 클릭

이 이미지로 만드는 서버가 사용할 디스크와 용량을 선택한다.

 

시작템플릿 생성

[시작템플릿] - [시작템플릿 생성] 클릭

시작템플릿은 Auto Scaling 그룹이 인스턴스를 생성할 때 어떤 AMI를 기반으로 할 것인지, 서버 환경은 어떤지, 보안 그룹 설정을 어떤지 정의하는 것이다.

  • 위에서 생성한 AMI 지정
  • 인스턴스 유형 지정
  • 키 페어 지정 : AMI 생성용 인스턴스를 만들 때 다운받은 키 페어를 사용할 것이다.

 

1-3. Auto Scaling 그룹 생성하기

[Auto Scaling 그룹] - [Auto Scaling 그룹 생성] 클릭

  • 위에서 생성한 시작템플릿 지정
  • 최초 인스턴스 수 지정
  • 그룹 이름 지정 : my-auto-scaling-group
  • 네트워크 설정
    • 서브넷 지정 : 인스턴스들이 선택한 서브넷에 골고루 생성된다.
  • 조정 정책 구성 : 인스턴스 수를 조정하기 위한 정책
    • 최소, 최대 인스턴스 수
    • CPU 사용률 or 요청 수 or ... 에 따라 조정되도록 설정
    • 알림 구성 : 그룹 내 인스턴스에 변화가 생길 경우 알림을 받을 수 있다.
  • 태그 지정 : 생성되는 인스턴스가 여기서 지정한 태그를 갖게 된다.
    구분이 쉽도록 Name / my-group-instance

 

 

2. Elastic Load Balancing

ELB는 클라이언트의 요청을 받아 관리하는 서버들에 요청을 골고루 전달한다. 주기적으로 서버 health check를 하여 정상적이지 않은 서버는 정상 상태로 변경될 때까지 요청을 전달하지 않는다.

 

Target 그룹은 로드밸런서가 요청을 전달할 서버를 묶은 그룹이다. 이 Target 그룹에는 EC2 인스턴스나 Auto Scaling 그룹이 속할 수 있다. 로드밸런서는 요청 포트에 따라 다양한 Target 그룹으로 요청을 전달한다.

 

2-1. 로드밸런서 생성

로드밸런서 생성

[로드밸런서] - [로드밸런서 생성] 클릭

  • HTTP, HTTPS 요청을 받을 [Application Load Balancer] 선택
  • 리스너 구성
    • HTTP 80
    • (후에 인증서를 발급받아 HTTPS 443 요청도 받을 것이다)
  • 보안그룹 구성 : 80 포트 접속을 허용한다.
  • 라우팅 구성
    • 새 Target 그룹 생성 
    • HTTP 8080 : 80 포트 요청을 받아 Target 그룹의 8080 포트로 전달한다.
  • 대상 등록
    • EC2 인스턴스를 직접 추가할 수도 있지만, Auto Scaling 그룹 자체를 등록하여 Auto Scaling에 의해 새로운 인스턴스가 생성될 때 자동으로 Target 그룹에 등록되도록 할 것이다. 그래서 별도로 대상을 등록하지 않고 넘어간다.

 

Auto Scaling 그룹을 로드밸런서 Target 그룹에 등록

[Auto Scaling 그룹] - 이전 단계에서 생성한 my-auto-scaling-group 그룹 클릭하여 [세부정보] - [편집]

대상 그룹 항목에 위에서 생성한 Target 그룹을 추가한 뒤 저장한다.

 

이제 [로드밸런서] - [대상 그룹] 메뉴에서 해당 Target 그룹을 클릭하여 [대상] 탭을 보면 Auto Scaling 그룹 내에 있는 인스턴스들이 대상으로 등록되어 있음을 확인할 수 있다.

 

이제 로드밸런서 주소의 80 포트로 요청을 보내면 Target 그룹 내 서버의 8080 포트로 요청이 전달될 것이다.

라고 말하고 싶지만 아니다. health check가 실패하여 Unhealthy 상태이기 때문에 요청이 전달되지 않는다. (AMI 생성용 인스턴스에 한 것은 JRE를 설치하는 것 뿐이었다)

이렇게 Target 그룹에 등록하면 된다는 것만 알아두기 바란다.

 

 

 

다음 글에서 애플리케이션을 자동 배포하고 로드밸런서 주소로 요청을 보내 잘 작동하는지 확인하도록 하겠다.