솔루션 아키텍처(1)

이기태·2024년 4월 25일
0

AWS

목록 보기
18/62

Stateless Web App(WhatIsTheTime.com)

  • 사람들에게 시간을 알려주는 기능
  • 단순하기에 DB가 필요없다.
  • 각각의 인스턴스와 서버는 시간이 몇 시인지 알고 있다.
  • 작게 시작하고 싶고 가동 중지시간(downtime)을 받아들일 수 있다
  • 이 앱은 전반적으로 점점 더 인기를 얻게 된다.
    가동 중지 시간을 제거할 수 있도록 수직 및 수평적으로 확장할 필요가 있다.

솔루션 아키텍트 과정(WhatIsTheTime.com)

간단한 시작(첫 번째 PoC)


사용자가 시간을 물어보면 인스턴스는 시간을 알려준다.

  • 공용 인스턴스
  • 무슨 일이 생기면 재시작 가능하도록 고정 IP를 갖는다.
    -> 탄력적 IP 주소 연결
  • 시간이 지나면서 사용자가 점점 늘어나 많은 트래픽을 갖게 된다.
    t2.micro인스턴스로는 충분하지 않음을 깨닫는다.

수직 스케일링 조정

  • t2.micro를 좀 더 큰 인스턴스로 수직 확장
    t2.micro -> m5.large 교체
    • 인스턴스 중지
    • 인스턴스 유형 변경
    • 인스턴스 시작
  • 탄력적 IP를 갖고 있기 때문에 이전과 동일한 공용 IP를 갖고 있다.
  • 그러나 M5로 업그레이드 하는 동안 다운타임 발생

수평 스케일링 조정

  • 사용자들이 더 많아져 수평 스케일링 고려
  • M5 인스턴스는 하나의 공용 IP에 탄력적 IP가 연결 되어있다.
  • 3개의 m5.large 인스턴스로 수평 확장
    모두 탄력적 IP가 연결되어 있다.
    -> 3개의 인스턴스, 3개의 탄력적 IP
    -> 사용자들은 인스턴스와 통신하려면 탄력적 IP의 정확한 값을 알아야 한다.
  • 그러나 사용자들이 점점 늘어남에 따라 알아야하는 IP와 인프라 관리가 힘들어진다.

접근 방식을 변경해 보자

  • 한 계정의 리전마다 최대 5개의 탄력적 IP만 가질 수 있다.
    탄력적 IP를 제거하고 Route 53사용을 선택
  • 웹 사이트 URL은 api.whatisthetime.com으로 Route 53 설정.
    TTL = 1h
    A record -> DNS로 IP 리스트를 받는다.
    -> 사용자가 쿼리를 하면 자동으로 인스턴스의 IP주소를 얻어 통신.(자동 업데이트 및 동기화)

상황에 따라 인스턴스 확장/제거 가능하게 해보자

  • 만약 그냥 인스턴스 하나를 종료한다면?
    TTL이 1시간으로 설정되어 있기 때문에 종료한 인스턴스 사용자들은 1시간동안 사용할 수 없다.
    한 시간 후에야 다른 인스턴스로 접속해 서비스를 사용할 수 있게 된다.
그렇다면 로드 밸런서를 추가해보자

  • 공용 인스턴스 대신 사설 인스턴스를 사용하고 하나의 가용 영역에서 실행
  • 로드 밸런서의 상태 확인(Health Checks)기능으로 인스턴스의 상태를 확인하자.
    인스턴스가 다운되면 해당 인스턴스로 트래픽을 전송하지 않게 한다.
    -> ELB는 공개되겠지만 인스턴스들은 뒷단에 있다.
    -> 보안 그룹 규칙으로 둘 사이의 트래픽을 제한
  • 사용자들이 웹사이트에 쿼리하지만 로드 밸런서가 IP주소를 자속적으로 바꾼다.
    A 레코드가 될 수 없다.
    대신 Alias 레코드를 사용할 수 있다.(로드 벨런서이기 때문)
    -> Alias는 Route 53으로부터 ELB를 가리켜 접속 가능.
  • DNS를 바꾸지만 사용자들은 로드 밸런서에 접속할 수 있다.
    로드 밸런서는 인스턴스로 리디렉션
  • 이제 로드 밸런서로 인스턴스를 추가/제거할 수 있다.
  • 추가로 상태 확인으로 다운타임도 없앴다.
  • 그러나 아직 수동으로 인스턴스를 추가하고 제거하기는 힘들다.

오토 스케일링 그룹

  • 오토 스케일링 그룹을 통해 관리하도록 한다.
    시간에 따라 트래픽이 많을때와 적을때에 따라 인스턴스를 확장/제거한다.

이번엔 자연재해에 대비해보자(다중 AZ)

  • 지진으로 가용 영역 1번이 다운되면?
    애플리케이션이 다운된다.
  • 이때를 대비해 다중 AZ로 가용성을 높이자
    ELB로 상태 확인 뿐만 아니라 다중 AZ도 추가하자.
    AZ 3개로 확장
    오토 스케일링 그룹도 다중 AZ에 분배
  • 이것으로 가용성을 확보함으로 장애 발생에 대비했다.

이제 애플리케이션 비용을 줄여보자(용량 예약)

  • 2개의 AZ가 있고 각각의 AZ에는 최소 하나 이상의 인스턴스가 실행중이다.
  • 오토 스케일링 그룹의 용량을 최소화하기 위해 인스턴스를 예약해 비용을 절감하자.
    새 인스턴스가 실행되도 일시적이고 요청에따라 생성 되는것이라 괜찮다
    더 줄이고 싶다? -> 스팟 인스턴스 사용 (주의: 인스턴스 종료될 수 있음)

생각해보기

  • 공용IP와 사설IP를 갖는 목적
  • 탄력적 IP와 Route 53 vs 로드 밸런서를 사용할때의 장점
  • Route 53 TTL 때문에 A 레코드를 사용할 수 없어 로드 밸런서의 Alias를 사용했다.
  • 인스턴스를 수동으로 관리하는 법 vs 오토 스케일링 그룹 사용
  • 다중 AZ를 통해 재난 극복
  • 정상적인 인스턴스만 트래픽을 받도록 ELB 상태 확인 활성화
  • 인스턴스가 ELB의 트래픽만 받도록 보안 그룹 규칙을 설정
  • 비용 절감을 위한 예약

AWS 프레임워크

AWS에는 좋은 아키텍처를 가진 프레임워크가 있다.

  • 잘 설계된 애플리케이션을 위한 5가지 원칙
    비용: 인스턴스 수직 확장, ASG, 인스턴스 예약
    성능: 수직 확장, ELB, 오토 스케일링 그룹
    신뢰성: 트래픽을 안정적으로 전달하는 Route 53, 다중 AZ
    보안: 로드 밸런서, 보안 그룹
    우수한 운영: 수동 프로세스에서 오토 스케일링 그룹의 기능을 갖춰 자동화되도록 개선

0개의 댓글

관련 채용 정보