AWS Elastic Beanstalk을 이용한 인프라 환경 구축
AWS Elastic Beanstalk이란?
AWS Elastic Beanstalk는 Java, .NET, PHP, Node.js, Python, Ruby, Go 및 Docker를 사용하여 개발된 웹 애플리케이션 및 서비스를 Apache, Nginx, Passenger 및 IIS와 같은 친숙한 서버에서 손쉽게 배포하고 확장할 수 있는 서비스
오토스케일링(Auto Scaling)이란?
클라우드 컴퓨팅의 대표적인 장점으로는 필요에 따라 서비스를 빠르게 확장하거나 축소할 수 있는 유연성을 들 수 있다.
그중, 오토스케일링(Auto Scaling)은 클라우드의 유연성을 돋보이게 하는 핵심기술로 CPU, 메모리, 디스크, 네트워크 트래픽과 같은 시스템 자원들의 메트릭(Metric) 값을 모니터링하여 서버 사이즈를 자동으로 조절 하는 서비스를 말한다.
이를 통해 사용자는 예상치 못한 서비스 부하에 효과적으로 대응하고, 최대한 저렴한 비용으로 안정적이고 예측 가능한 성능을 유지 할수 있다.
로드밸런서(Load Balancer)란?
로드밸런서는 서버에 가해지는 부하(로드)를 분산(밸런싱)해주는 장치 또는 기술을 통칭합니다. 클라이언트와 서버풀(Server Pool, 분산 네트워크를 구성하는 서버들의 그룹) 사이에 위치하며, 한 대의 서버로 부하가 집중되지 않도록 트래픽을 관리해 각각의 서버가 최적의 퍼포먼스를 보일 수 있도록 합니다.

전체적인 환경 구성
로드밸런서 + EB 환경 3개(real, st, dev)
하나의 로드밸런서를 환경 3개가 공유
AWS EC2 Load balancer, Target group
로드밸런서(Load balancer)
- ALB(Application Load Balacer)
- 이 서비스를 통해서 아마존이 각 세계에 구축한 데이터 센터의 서버용 컴퓨터들의 자원을 원격으로 사용할 수 있다. 쉽게 말해, 아마존으로 부터 한 대의 컴퓨터를 임대하는 것이다. AWS가 제공하는 URL(Public DNS)를 통해 이 컴퓨터에 접근할 수 있다
- 후불제 PC방과 같이 사용한 만큼 비용을 지불하기 때문에 탄력적인 이라는 의미의 Elastic이라는 단어가 붙어있다. Elastic은 비용적인 부분 뿐만이 아니라 필요에 따라 성능, 용량을 자유롭게 조절할 수 있다는 의미도 가지고 있다
ELB(Elastic Load Balancing)은 4가지 유형의 로드 밸런서를 지원하는데 애플리케이션 요구 사항에 따라 적절한 로드 밸런서를 선택할 수 있습니다. HTTP 요청을 로드 밸런싱해야 하는 경우 ALB를 사용하는것이 좋습니다.
네트워크/전송 프로토콜(4계층 -TCP, UDP) 로드 밸런싱의 경우와 고도의 성능이 요구되거나 대기 시간이 낮아야하는 애플리케이션의 경우에는 네트워크 로드 밸런서를 사용하는 것이 좋습니다.
애플리케이션이 Amazon EC2 Classic 네트워크 안에 구축된 경우 Class Load Balancer를 사용해야 합니다. 서드 파티 가상 어플라이언스를 배포하고 실행해야 하는 경우 Gateway Load Balancer를 사용할 수 있습니다.
EC2란?
EC2(Elastic Compute Cloud)는 AWS에서 제공하는 클라우드 컴퓨팅 서비스다.
Application Load Balancer는 수신 HTTP 및 HTTPS 트래픽을 요청 속성을 기반으로 Amazon EC2 인스턴스, 마이크로서비스 및 컨테이너와 같은 여러 대상에 배포합니다. 로드 밸런서는 연결 요청을 수신하면 우선 순위에 따라 리스너 규칙을 평가하여 적용할 규칙을 결정한 다음 해당되는 경우, 대상 그룹에서 규칙 작업의 대상을 선택합니다.

로드밸런싱이 동작하는 원리
- 클라이언트가 애플리케이션에 요청을 보냅니다.
- 로드 밸런서의 리스너는 구성한 프로토콜 및 포트와 일치하는 요청을 수신합니다.
- 수신 리스너는 지정된 규칙에 따라 수신 요청을 평가하고, 해당되는 경우 요청을 적절한 대상 그룹으로 라우팅합니다. HTTPS 리스너를 사용하여 TLS 암호화 및 복호화 작업을 로드 밸런서로 오프로드할 수 있습니다.
- 하나 이상의 대상 그룹에 있는 정상 대상은 로드 밸런싱 알고리즘과 리스너에서 지정한 라우팅 규칙을 기반으로 트래픽을 수신합니다.
TLS(Transport Layer Security)
인터넷상에서 통신 시 주고받는 데이터를 보호하기 위한 표준화된 암호화 프로토콜
체계(Scheme)
로드밸런서를 생성할때 체계(Scheme) 부분에서 인터넷 경계(Internet-facing)와 내부(Internal)를 선택할 수 있습니다. 여기서 Public Subnet을 선택해야 하는지, Private Subnet을 선택해야하는지에 따라 스키마가 달라진다고 보면 됩니다.

네트워크 매핑에서 가용영역과 Subnet을 선택할 수 있습니다. 웹 서버에 접근하기위해서는 인터넷경계(internet-facing)을 선택하고 Public Subnet을 선택해야하고, 그렇지 않은경우는 Private Subnet을 선택하면된다.(반대로 하면 경고뜸..)

요약: 외부 인터넷으로 들어온 클라이언트의 요청을 받아 라우팅을 하고, 내부는 VPC안의 클라이언트 요청만 라우팅한다고 보면된다.
Public Subnet과 Private Subnet 선택 기준?
로드밸런서를 생성하면 선택한 Subnet에 Load Balancer Node가 생성됩니다. 인터넷을 통해 웹 서버에 접근해야 하는 경우 Private Subnet을 선택해버리면 Load Balancer Node가 Private Subnet에 생성되기 때문에 외부와 통신할 수 없는 상황이 발생하여 웹서버에 접근할 수 없습니다.

Security groups
보안 그룹은 연결된 리소스에 도달하고 나갈 수 있는 트래픽을 제어합니다.
보안 그룹은 가상 방화벽 규칙 세트로, EC2 인스턴스와 로드 밸런서와 같은 다른 AWS 리소스의 인바운드 및 아웃바운드 트래픽을 제어합니다. 보안 그룹은 VPC(Virtual Private Cloud)에 연결되어 있습니다.


Listners and routing
HTTP 포트번호 80이 default로 존재하고 HTTPS 포트번호 443을 추가하여 라우팅되는 그룹을 지정합니다.

Target Group
요청을 처리할 대상에 대한 집합
Target group의 프로토콜이 HTTP인 이유는 Client -> Load balancer에서 이미 Request 데이터를 암호화하여 데이터를 주고받았기 때문입니다. 그 뒤에 있는 Load balancer -> Target group단계에서는 VPC 안에서 통신하기 때문에 안전하다. 그러므로 굳이 HTTPS 프로토콜 써가면서 CPU 자원을 낭비할 필요는 없다.


AWS Elastic Beanstalk Beanstalk 환경 설정
환경정보
- 도메인 네임: 서브도메인이 class.tutoring.co.kr 로 결정되었기 때문에 브랜치+class으로 결정했습니다.(realclass)
- 플랫폼: node 16버전
- 지역:
ap-northeast-2

애플리케이션 코드
- 소스코드는 next build 를 이용한 빌드 파일 + package.json 파일을 압축한 zip 파일로 구성

추가 옵션 구성
사전설정
- 사전 설정에서 고가용성(High Availability)를 선택해줘야 로드밸런서를 자동으로 만들어준다.

소프트웨어 수정
- 프록시 서버 Nginx

인스턴스 수정
- 컨테이너 기본값, 보안그룹 defalut


용량 수정
- Auto Scaling 그룹 - 로드 밸런싱 수행, 최소 인스턴스 1개 최대 4개까지 돌아갈수 있게 설정 - 인스턴스 유형 t3.xlarge 시간당 221원정도 한달 돌려도 159,120원 ⇒ t3.medium && t3.large로 바꿈 - real 을 제외한 st, dev 환경은 로드밸런서를 사용하지 않고 단일 인스턴스로 가기로 결정.



- 조정 트리거 설정 - 오토 스케일링을 진행할 조건의 지표를 설정하는것입니다. CPU 사용량을 지표로 설정 - CPU 사용량 평균으로 60%이상일 때 20% 이하 일때 오토 스케일링이 일어나게 설정하였습니다.
CPU 평균 사용량이 60을 넘으면 스케일 아웃으로 인스턴스가 추가로 생성되고 cpu 평균 사용량이 20% 아래로 내려오면 스케일 인으로 인스턴스가 삭제되는 방식입니다.

로드밸런서 수정(전용)
- 유형은 Application Load Balancer에 전용으로 설정
- 리스너에 HTTPS 443 포트 추가
- 프로세스를 통해 인스턴스의 상태 검사를 설정할 수 있는데 ‘/’ URL에 대한 응답으로 200을 반환하는 코드 작성
- 엑세스 로그 파일은 추후에 재설정



애플리케이션 배포
- 애플리케이션 배포 설정에는 배포 방식과 배치크기를 설정할 수 있습니다. -한번에 모두를 선택-
- 배포 방식에는 한번에 모두, 롤링, 추가배치를 사용한 롤링, 변경 불가능 트래픽분할 총 5가지의 방식이 있습니다.
한번에 모두(All at once) – 새 버전을 모든 인스턴스에 동시에 배포합니다. 배포가 수행되는 동안 환경에 있는 모든 인스턴스가 잠시 서비스 중지됩니다. 롤링(Rolling) – 새 버전을 배치로 배포합니다. 각 배치는 배포 단계 동안 서비스에서 제외되므로 배치에 있는 인스턴스의 수만큼 환경의 용량이 감소합니다. 추가 배치를 사용한 롤링(Rolling with additional batch) – 새 버전을 배치로 배포하지만, 먼저 새로운 배치의 인스턴스를 시작하여 배포 프로세스 중에 모든 용량이 유지되도록 합니다. 변경 불가능(Immutable) – 새로운 auto scaling 그룹을 만들어 단일 인스턴스를 배치합니다. 원래 있던 auto scaling 그룹과 같이 트래픽을 처리하며 새로 배치된 인스턴스의 상태가 양호하면 원래 있던 인스턴스의 수만큼 추가하여 배포합니다. 트래픽 분할(Traffic splitting) – 카나리 배포 방식입니다. 새로운 auto scaling 그룹을 만들고 로드밸런서에서 트래픽의 일정 부분을 보내 상태가 양호하다면 모든 트래픽을 새로 업로드한 인스턴스로 처리합니다.


보안설정
- AWS Elastic Beanstalk으로 만들어진 EC2 인스턴스에 접속하기 위해서는 키페어가 반드시 필요하므로 키페어를 선택해서 설정해야합니다.(나중에 인스턴스에 접속할일이 생김)
- 키페어 - tutoring_class_keypair

