sol 개발 블로그 로고
Published on

AWS Elastic Beanstalk

Authors
  • avatar
    Name
    Chan Sol OH
    Twitter

목차

지금까지는 아래 그림과 같이 3-tier 아키텍처로 앱을 배포했다. 로드밸런서로 요청을 받고, ASG로 요청 처리, 캐시와 DB로 데이터를 저장하는 방식으로 말이다.

만약 엄청 많은 애플리케이션을 배포해야할 때는 매번 위와 같이 아키텍처를 구축하기 어려울 것이다. 개발자로서 원하는 것은 단지 코드를 실행시키는 것이다.

Beanstalk은 AWS에 개발자 중심의 관점을 제공한다. 하나의 인터페이스를 통해서 EC2, ASG, ELB, RDS, ... 모든 구성 요소를 재사용하여 알아서 배포해주는 관리형 서비스다. 즉, 용량 프로비저닝, 로드 밸런서 구성, 스케일링, 애플리케이션 상태 모니터링, 인스턴스 구성 등을 자동으로 처리해준다. Beanstalk 자체는 무료지만, ASG, ELB에서 활용하는 인스턴스에 대해서는 요금을 지불해야한다.

Elastic Beanstalk의 Components

  • Application : 환경, 버전, 설정과 같은 Beanstalk 구성 요소의 집합으로 이뤄진다.
  • Environment : 특정 애플리케이션 버전을 실행하는 리소스의 집합. 하나의 환경에서 애플리케이션 버전을 1에서 2로 업데이트할 수 있다. Tiers : Beanstalk 환경에는 웹 서버 환경 티어작업자 환경 티어가 있다. Multiple 환경 : dev, test, prod 같은 환경을 여러 개 생성할 수 있다.

Beanstalk 프로세스는 Create Application, Upload Version, Launch Environment, 그리고 Manage Environment 또한 새로운 버전의 애플리케이션이 나오면 Upload Version부터 다시 수행한다.

웹 서버 티어 vs 작업자 티어

웹 서버 환경과 작업자 환경 차이

웹 서버 환경은 일반적으로 WAS를 배포하듯이 ELB에 EC2가 여러 AZ에 걸쳐 있는 것을 말한다. 작업자 환경은 EC2 인스턴스에 직접 접근하는 클라이언트가 없고 SQS라는 메시지 큐를 사용한다. 메시지가 SQS 큐로 전송되고 EC2 인스턴스가 작업자가 되어 메시지를 SQS 큐에서 가져와 처리한다.

작업자 환경의 경우 SQS 메시지의 수에 따라 EC2 인스턴스를 스케일링한다.

Beanstalk 배포 모드

  • Single Instance : 개발 목적에 적합하며, 탄력적 IP를 갖는 EC2 인스턴스 하나가 만들어진다.

  • High Availability : 로드 밸런서를 이용한 고가용성은 프로덕션 환경에 적합하며 ASG과 여러 AZ에서 관리하는 EC2 인스턴스에 부하를 분배하는 ELB를 둘 수 있다.

  • All at once : 한 번에 모든 인스턴스를 배포한다. 가장 빠르지만, 인스턴스가 업데이트되는 동안 서비스가 잠시 중지되어 다운타임이 발생한다. 따라서 다운타임은 신경쓰지 않지만 빠른 환경이 필요한 개발 환경에 적합하다.

  • Rolling : 버킷이라는 인스턴스 묶음을 동시에 업데이트하고 첫 번째 버킷의 상태가 괜찮으면 다음 버킷을 업데이트한다. 이때 버킷이 업데이트될 때 기존 버킷의 인스턴스는 종료되기 때문에 잠시 동작하는 인스턴스 수가 감소한다. 만약 인스턴스가 수백개고 버킷 크기를 작게 설정한다면 시간이 매우 오래 걸릴 수 있다.

  • Rolling with additional batches : 롤링과 동일하지만, 배포 중에 초기 애플리케이션 용량을 유지한 채 업데이트한다. 즉, 버킷만큼 새로운 인스턴스를 만들고 기존 인스턴스를 종료하는 방식으로 잠시 수가 늘어났다가 다시 원래 인스턴스 수로 돌아간다. 약간의 추가 요금이 발생하더라도 최소 용량을 보장할 수 있기 때문에 프로덕트 환경에 적합하다.

  • Immutable : ASG에 인스턴스가 있을 때, 한 인스턴스를 임시 ASG에 배포하고 잘 동작하는지 체크한다. 그리고 잘 동작하면 모든 인스턴스를 임시 ASG에 배포하고, 기존 ASG에 병합하고 기존 인스턴스를 종료한다. ASG를 두개를 쓰기 때문에 배포 시간이 길고 비용이 많이 든다. 다만, 실패시 빠른 롤백을 제공한다.

  • Blue Green : 완전히 새로운 환경을 다같이 생성한 다음 준비가 되면 전환한다. Route 53을 이용해 가중치 기반 정책을 설정하고 약간의 트래픽을 스테이징 환경으로 보내 모든 것을 테스트하고 통과하면 기존 환경(블루)을 종료하고 URL을 전환해 새 환경(그린)을 블루환경으로 만든다. Beanstalk에서 지원하지 않는 작업이기 때문에 수동으로 해야한다.

  • Traffuc Splitting : 카나리아 테스트용 옵션으로, 애플리케이션 트래픽의 일부를 새로운 배포로 전송하여 수행한다. 메인 ASG가 있을 때 메인 ASG와 동일한 크기이고 새로운 버전의 임시 ASG를 만든다. ALB로 임시 ASG에 약간의 트래픽을 보낸다. 배포가 실패하면 롤백이 빠르게 이뤄진다. 임시 ASG가 잘 동작하면 임시를 메인으로 바꾸고 기존 메인을 종료한다. 앞선 블루 그린 방식을 자동화한 방식