AWS

[AWS] aws 강의 섹션 17 (Elastic Beanstalk, Beanstalk tier, Beanstalk deployment option, Beanstalk Lifecycle Policy )

대기업 가고 싶은 공돌이 2024. 10. 3. 18:18

Elastic Beanstalk

배포할 애플리케이션이 너무 많고 이들이 동일한 아키텍처를 따를 경우 

매번 이를 다시 생성하는 것은 복잡할 수 있다.

 

인프라를 다 설정해야 하고

코드를 넣어야 하며, 데이터베이스를 구축하고 로드밸런서를 연결 시키며

오토 스케일링을 설정하는 모든 과정이 복잡하다.

 

대부분의 웹, 앱은 동일한 아키텍쳐를 가진다 (ALB + ASG)

 

다양한 프로그래밍 언어로 개발하고 다양한 환경을 사용하는 경우

환경에 맞게 배포를 여러번 진행해야 한다.

 

여기서 앨라스틱 빈스톡을 사용할 수 있다.

 

  • 빈스톡은 애플리케이션을 배포하는데 있어 개발자 중심의 관점을 제공한다.
  •  빈스톡은 하나의 인터페이스에서 EC2, ASG, ELB, RDS와 같이 
    모든 구성 요소를 다룰 수 있는 것이다.
  • 위의 모든 요소를 자동으로 배포해주는 관리형 서비스이다.
    • 자동으로 용량 예약, 로드 밸런서 구성, 자동 확장, 모니터링,
      인스턴스 구성 등을 처리한다.
    • 우리가 신경 쓸 것은 코드밖에 없다.
  • 각 구성 요소의 설정에 대한 제어는 여전히 가능하다.

  • 빈스톡은 무료이나, 내부에서 사용되는 EC2, ELB 등의 가격은 지불된다.

빈스톡 구성요소

  • 애플리케이션 
    • 여러 구성 요소로 이뤄진 하나의 프로젝트 또는 시스템을 의미한다.
  • 애플리케이션 버전
    • 애플리케이션의 버전을 의미한다.
  • 환경: 애플리케이션이 실제로 실행되는 곳이다. 서버와 리소스들이 모여있는 환경을 의미한다.
    환경 내에서는 한 번에 하나의 애플리케이션 버전만 사용할 수 있다.
    • environment 내에서 애플리케이션 버전을 업데이트할 수 있다.
    • 개발 환경, 테스트 환경, 배포 환경 등 여러 환경을 생성할 수 있다.
    • 빈스톡에서 제공하는 환경은 크게 두 종류로 나뉜다.
      • 웹 서버 environment tier와 worker environment tier가 존재한다.
    • 만약 빈스톡에서 데이터베이스를 사용하기로 했다면
      데이터베이스의 생명주기는 환경과 연결된다.
      환경이 삭제되면 데이터베이스도 삭제된다.

빈스톡에서 지원 언어

Web Server Tier란?

  • 로드 밸런서가 있는 위치를 알고 있는 전통적인 아키텍쳐로 
    로드 밸런서가 트래픽을 오토 스케일링 그룹으로 보내고
    여기에 여러 EC2 인스턴스가 포함되어 웹 서버 역할을 하는 구조다 

Worker Tier

  • EC2 인스턴스에 직접 액세스하는 클라이언트가 없는 구조다.
  • 큐를 사용하며, 큐에 들어온 요청이 SQS message에 들어가고 
    SQS message의 메세지를 EC2에서 가져가 처리한다.
  • 큐의 메세지 수에 따라 자동으로 스케일링 된다.

웹 환경과 작업자 환경을 함께 배치해서 사용할 수도 있다.

빈스톡 배포 모드

두 가지의 배포 모드가 있다

  • 개발 목적에 적합한 싱글 인스턴스 
    • elastic ip를 가진 EC2 인스턴스가 하나 존재한다.
    • RDS 데이터 베이스를 생성할수도 있지만
      이는 모두 하나의 인스턴스를 기반으로 한다.
  • 로드 밸런서를 사용하는 고 가용성 모드
    • 실제 운영 환경에 적합하다.
    • ALB를 통해 부하 분산이 이뤄지며
    • 마스터와 스탠바이 인스턴스를 가진 다중 AZ 데이터베이스를 가질 수도 있다.

빈스톡에서 애플리케이션을 업데이트할 때 사용할 수 있는 배포 옵션

  • All at once - 모든 인스턴스를 한 번에 배포한다. 가장 빠르지만  인스턴스가 업데이트 되는 동안
    서비스가 잠시 중지되어 다운타임이 발생한다.
  • Rolling - 버킷이라는 인스턴스 묶음 단위로 동시에 업데이트하고, 첫 번째 버킷의 상태가 괜찮으면
    다음 버킷을 업데이트한다.
  • Rolling with additional batches: 롤링 옵션과 같지만 새 인스턴스를 생성하여
    새 인스턴스들에 대해서 업데이트를 하는 것이다. (old 인스턴스는 건드리지 않으므로 같은 서비스 상태를 유지할 수 있다.)
  • immutable: 새로운 인스턴스에 애플리케이션을 배포한 후, 문제가 없으면 기존 인스턴스와 교체한다.
    안전하지만 시간이 오래걸릴 수 있다.
  • Blue Green: 새로운 버전의 애플리케이션을 별도의 환경 (그린)에 배포한 후 분제가 없으면 전환한다.
  • Traffic Splitting: 트래픽을 새 버전과 기존 버전으로 분할하여 약간의 트래픽을 새 버전에 보낸 후
    문제가 없다면 교체한다.

All At Once

  • 모든 인스턴스를 실행 중지한다.
  • 그리고 새로운 버전2 를 실행한다.

  • 가장 빠르다.
  • 다운타임이 발생한다.
  • 개발 환경에 적합하다.
  • 추가 요금이 없다.

Rolling

  • 다른 버전이 동시에 실행된다.
  • 애플리케이션이 전체 용량을 다 사용하지 못한다.
  • 추가 요금이 없다.
  • 인스턴스를 업그레이드 하는데 시간이 오래 걸린다.

Rolling with additional batches

  • 애플리케이션이 전체 용량을 다 사용한다.
  • 약간의 추가 요금이 있다.
  • 추가된 배치는 배포의 마지막 단계에서 제거된다.
  • 배포가 오래 걸린다.
  • 두 가지 버전이 동시에 실행된다.
  • prod 환경을 다루는데 적합하다.

Immutable

  • 다운타임이 없다.
  • 새 버전의 코드가 새 인스턴스에 배포된다.
    • 해당 인스턴스는 임시 ASG에 연결된다.
  • 비용이 많이 들고 용량을 두 배로 쓰게 된다.
  • 배포시간이 가장 긴 옵션이다. 
  • 실패 시 빠른 롤백을 제공한다.
    • 실패 시 그냥 ASG를 종료하기만 하면 되기 때문이다.
  • 조금 더 많은 비용을 부담할 수 있다면 prod 환경에서 훌륭한 선택이다.

Blue / Green

  • 앨라스틱 빈스톡이 직접 제공하는 기능은 아니다.
  • 다운타임이 없고 더 많은 테스트를 가능하게 한다.
  • 빈스톡을 하나 더 만들고 그곳에 새 버전을 배포하는 방식이다.
  • 이전의 모든 배포 전략은 같은 환경에서 이뤄지는 반면
    이 전략은 새 환경을 생성한다. 
  • 새 그린 환경이 테스트 되고 문제 발생 시 롤백된다.
  • route53 등을 사용해 트래픽이 두 방향으로 흐르는 것을 제어할 수 있다.
    • 가중치 기반 정책을 설정하고 약간의 트래픽을 스테이징 환경으로 보내
      테스트를 할 수도 있다. 
  • 테스트가 끝나면 콘솔에서 swqp url을 통해 간단하게 url 변경이 가능하다.
    • 기존의 블루 버전은 종료한다.

빈스톡에서 제공하는 기능이 아니기 때문에 수작업이 많이 필요하다. 

Traffic Splitting

  • 카나리아 테스트에 사용된다.
  • 새 버전의 애플리케이션이 같은 용량의 임시 ASG에 배포된다.
  • 적은 양의 트래픽이 임시 ASG에 보내진다.
  • 임시 ASG의 상태가 모니터링 된다.
  • 뭔가 잘못되면 롤백시킨다.
  • 다운타임이 없다.
  •  잘못된게 없으면 새 인스턴스가 임시 ASG에서 메인 ASG로 이동한다
  • 모든 과정이 자동화 돼있고, 블루 그린의 업그레이드 버전이다.

Elastic Beanstalk CLI

  • CLI로 빈스톡이 훨씬 쉽게 실행되도록 도와준다.
  • 다양한 커맨드가 있다

  • 개발 파이프라인을 자동화 하려면 EB CLI 사용이 적합하다.

Beanstalk Deployment process

  • 종속성을 설명해야 한다.
    • requirements.txt
  • 모든 코드를 zip 파일로 패키징한다.
  • 콘솔에 zip  파일을 업로드한다.
  • 새 버전이 업로드 되면 콘솔이나 CLI를 통해 배포할 수 있다.
  • zip 파일을 빈스톡에 업로드하면 S3에 업로드 되고 빈스톡 인터페이스에서 S3를 참조하여 가져오게 된다.
  • zip 파일을 각 EC2 인스턴스에 배포하고 종속성을 해결하면 애플리케이션이 실행된다.
  • 시험에 안 나오니까 이런게 있다 정도만 알아둬라

Beanstalk Lifecycle Policy

  • 빈스톡에는 최대 1000개의 애플리케이션 버전을 저장할 수 있다.
  • 옛날 버전을 지우지 않는다면 더 이상 새 버전을 배포할 수 없다.
  • 수명주기 정책을 통해 오래된 버전을 삭제하자
    • 시간을 기준으로할 수도 있고
    • 공간을 기반으로도 할 수 있다.
  •  현재 환경에서 사용하는 버전은 삭제되지 않는다.
  • S3에서는 소스가 삭제되지 않도록 설정할 수도 있다.
    • 나중에 다시 사용할 수도 있으므로

Elastic Beanstalk Extensions

  • 애플리케이션의 배포 및 실행을 더 세밀하게 제어하기 위해 사용하는 기능으로
    설정 파일을 포함시켜 설정을 정의할 수 있다.
  • zip 파일을 생성할 때 설정 파일을 포함시켜야 한다.
  • 확장 파일의 모든 매개변수는 UI에서 구성하거나 파일에 코드로 작성할 수 있다.
  • requirements
    • 모든 설정파일이  ,ebextensions/라는 폴더에 들어가야 한다.
    • yaml이나 json 형식이어야 한다.
    • 파일의 확장자는 .config 여야 한다.
    • option_settings를 사용해 기본값을 수정할 수 있다.
    • 리소스를 추가할 수도 있다. RDS, 캐시, DynamoDb 등등 ,,
      이들은 빈스톡 콘솔에서 설정할 수 없는 것들이다.
  • EB 확장에서 관리되는 모든 것 들은 환경이 삭제되면 다 같이 사라진다.

이렇게 ebextensions 안에 .config 파일로 구성해야 한다.

이와 같이 DB와 관련된 매개변수를 설정하여 DB를 사용할 수도 있다.

 

Beanstalk Under the Hood

  • 빈스톡의 여러 기능은 Cloudformation을 기반으로 하고 있다.
  • 클라우드 포메이션은 다른 AWS 서비스를 공급해주는 서비스다.
  • 앞서 살펴본 .ebextesntion 폴더에서 클라우드포메이션 리소스를 정의하면
    AWS의 여러가지 서비스를 사용할 수 있다. 
    • 캐시, 버킷, 등등

Beanstalk Cloning

  • 기존에 만들어둔 환경을 똑같이 복제할 수 있는 기능이다.
  • 배포 버전이 있는 경우에 유용하다
    • 동일한 설정으로 테스트 버전을 배포할 수도 있다.
  • 원래 환경의 모든 리소스와 설정은 그대로 이전된다
    • 로드밸런서 타입
    • RDS 데이터베이스 타입 (내부의 데이터는 보존되지 않는다)
    • 한경변수 
  • 복제 이후 설정을 변경할 수도 있다.

Beanstalk Migration: loadBalancer

  • 빈스톡 환경을 한 번 만들고 나면
    ELB 유형은 변경이 불가능하고, 구성만 바꿀 수 있다.
    • ALB에서 NLB로 변경 불가
  • 따라서 로드밸런서를 변경하고 싶으면 다음과 같은 단계를 밟아야 한다.
    1. 동일한 구성으로 새 환경을 생성한다. (로드밸런서만 제외하고)
      당연히 로드밸런서를 제외하고 동일한 구성을 만들어야하기 때문에 복제는 사용 못 한다. 
    2. 새 환경의 애플리케이션을 배포한다.
    3. 이전 환경으로 가던 트래픽을 새 환경으로 변경한다. 
      CNAME swap 혹은 route53 업데이트
  • 그냥 동일한 구성으로 새로 만들어서 로드밸런서만 바꾸라는 얘기다

RDS with Beanstalk

  • RDS는 빈스톡을 이용해서 프로비저닝 가능하다.
    • dev/ test 환경에서 유용하다
  • 그러나 prod 환경에서는 유용하지 못 하다
    • 이유는 데이터베이스의 수명 주기가 빈스톡환경의 수명 주기  와 연결돼 있기 때문이다.
  • prod 환경에서는 RDS를 빈스톡 환경과 분리하고 환경 변수 등을 이용하여 
    참조하는게 제일 좋다.

그렇다면 이미 빈스톡 스택에 존재하는 RDS를 분리할 수 있을까?

  1. 먼저 문제가 발생할 경우에 대비해 스냅샷을 만들어 둔다.
  2. RDS 콘솔로 이동하여 데이터베이스가 삭제되지 않도록 보호한다.
  3. 새로운 빈스톡 환경을 생성하는데 이번에는 RDS를 제외하고 만든다.
  4. 환경변수 등을 활용하여 기존의 환경에 존재하던 RDS와 새로운 빈스톡 환경을 연결시킨다. 
  5. Cname swqp이나 route53을 활용해 트래픽을 새 환경으로 변경한다.
  6. 이제 오래된 빈스톡 환경을 삭제한다. (RDS 삭제 보호를 했으니 RDS는 그대로 유지된다.)
  7. 아마 RDS 때문에 기존의 빈스톡 환경 삭제에 실패할 것이다.
    이 때는 클라우드 포메이션으로 이동해 스택을 삭제하여 환경을 삭제한다.