로드밸런싱
- 로드 밸런서는 서버 혹은 서버셋으로 트래픽을 백엔드나 다운스트림 또는 서버들(EC2 인스턴스)로 전달하는 역할
- 사용하는 이유
- 부하를 다수의 다운스트림 인스턴스로 분산
- 애플리케이션에 단일 액세스 지점(DNS)을 노출
- 다운스트림 인스턴스의 장애를 원할히 처리
- 상태 확인 매커니즘으로 어떤 인스턴스로 트래픽을 보낼 수 없는지 확인
- SSL 종료(HTTPS)를 할 수 있다.
- 크키로 고정도를 강화할 수 있다.
- 영역에 걸친 고가용성을 가진다.
- 클라우드 내에서 개인 트래픽과 공공 트래픽을 분리할 수 있다.
ELB(Elastic Load Balancer)
- ELB는 관리형 로드 밸런서이다.
- AWS가 관리하며, 어떤 경우에도 작동할 것을 보장한다.
- AWS가 업그레이드와 유지 관리 및 고가용성을 책임진다.
- 로드 밸런서의 작동 방식을 수정할 수 있게 일부 구성 knobs도 제공한다.
- 자체 로드밸런서를 마련하는 것보다 저렴하다.
- 자체 로드밸런서를 직접 관리하면 확자성 측면에서 번거롭다.
- 다수의 AWS의 서비스들과 통합되어 있다.
- EC2 인스턴스
- 스케일링 그룹
- Amazon ECS
- 인증서 관리(ACM)
- CloudWatch
- Route 53
- WAF Global Accelerator 등
- AWS 로드 밸런싱에는 무조건 ELB를 쓰는 것이 좋다.
상태 확인(Health Check)
- ELB가 EC2 인스턴스의 작동이 올바르게 되고 있는지의 여부를 확인하기 위해 사용한다.
- 상태 확인은 포트와 라우트에서 이뤄집니다.
- 만약 response가 200 (OK)가 아니라면, 인스턴스 상태가 좋지 않다고 기록된다.
AWS의 로드밸런서 타입
Classic Load Balancer(v1 - 과거 세대) - CLB
- HTTP, HTTPS, TCP, SSL(secure TCP)
Application Load Balancer(v2 - 신 세대) - ALB
- HTTP, HTTPS, WebSocket
Network Load Balancer(v2 - 신 세대) - NLB
- TCP, TLS(secure TCP), UDP
Gateway Load Balancer - GWLB
- 네트워크 레이어(IP Protocol)
더 많은 기능을 가지고 있는 신형 로드 밸런서를 사용하는 것이 권장된다.
일부 로드밸런서들은 내부(internal)에 설정될 수 있어 네트워크에 개인적 접근(private)이 가능하다.
웹사이트와 공공 애플리케이션 모두에 사용이 가능한 외부(external) 공공(public) 로드밸런서도 있다.
Classic Load Balancer(v1)
- TCP(Layer 4), HTTP & HTTPS(Layer 7)을 지원한다.
- TCP 혹은 HTTP로 상태확인을 진행한다.
- 고정 호스트 이름을 부여받는다.
- XXX.region.elb.amazonaws.com
Application Load Balancer(v2)
- HTTP(Layer 7) 전용 로드 밸런서이다.
- 머신 간 다수 HTTP 애플리케이션의 라우팅에 사용이 된다.(target groups)
- 동일한 EC2 인스턴스 상의 여러 애플리케이션에 부하를 분산한다. (container, ECS)
- HTTP/2와 WebSocket을 지원하며 리다이렉트도 지원한다.
- HTTP에서 HTTPS로 트래픽을 자동 리다이렉트 하는 것이 가능하다.
- 경로 라우팅을 지원한다.
- URL 대상 경로에 기반한 라우팅이 가능하다.
- 예 : example.com/**users** & example.com/**posts**)
- URL의 호스트 이름에 기반한 라우팅이 가능하다.
- 예 : **one.example.com** & **other.example.com**)
- 쿼리 문자열과 헤더에 기반한 라우팅도 가능하다.
- 예 : example.com/user?**id=123&order=false**)
- ALB는 마이크로 서비스나 컨테이너 기반 애플리케이션에 가장 좋은 로드밸런서이다.
- 예 : Docker & Amazon ECS
- 포트 매핑 기능이 있어 ECS 인스턴스의 동적 포트로의 리다이렉션이 가능하다.
- 클래식 로드 밸런서와 비교
- CLB 뒤에서 다수의 애플리케이션을 사용하는 경우 여러 개의 CLB가 필요하다.
- 실제 애플리케이션 개수 만큼 로드 밸런서가 필요하다.
- ALB는 하나로 다수의 애플리케이션을 처리할 수 있다.
- CLB 뒤에서 다수의 애플리케이션을 사용하는 경우 여러 개의 CLB가 필요하다.
- Target Groups
- EC2 instances (오토 스케일링 그룹에 의해 관리될 수 있다) - HTTP
- EC2 tasks (ECS 스스로 관리된다) - HTTP
- Lambda functions - HTTP 요청을 JSON 이벤트로 변환한다.
- IP Address
- 꼭 private IP이어야 한다.
- ALB는 여러 Target Groups으로 라우팅 할 수 있다.
- 상태 확인은 Target Group 레벨에서 이루어진다.
- 고정 호스트 이름을 부여받는다.
- XXX.region.elb.amazonaws.com
- 애플리케이션 서버는 클라이언트의 실제 IP를 직접 볼 수 없다.
- 클라이언트의 실제 IP는 X-Forwarded-For라고 불리는 헤더에 삽입된다.
- Port(X-Forwarded-Port), 프로토콜(X-Forwarded-Proto)을 얻을 수 있다.
Network Load Balancer (v2)
- Layer 4(L4) 밸런서
- TCP나 UDP 기반의 트래픽을 인스턴스로 전달
- 초당 수백만 건의 요청을 처리할 수 있다.
- ALB보다 지연 시간이 훨씬 짧다.
- ALB : 평균 400ms
- NLB : 평균 100ms
NLB는 외부의 가용 영역 당 1개의 고정 IP를 노출한다.
- 특정 IP를 화이트리스트에 추가할 때 유용하며 NLB 자체의 IP를 가져오는 대신 Elastic IP 할당을 지원한다.
- 엔트리 포인트를 2개를 얻고자 할 때 NLB를 사용하면 된다.
- 특정 IP를 화이트리스트에 추가할 때 유용하며 NLB 자체의 IP를 가져오는 대신 Elastic IP 할당을 지원한다.
애플리케이션 전용의 특정 IP를 지정하면 NLB가 해당 트래픽을 EC2 인스턴스로 보내는 것이다.
ALB, CLB 모두 고정 IP가 없고 고정 호스트 이름이 있다.
사용 예
- 고성능
- TCP 또는 UDP 수준의 트래픽을 얻을 때
Target Groups
- EC2 Instances
- Target Group에 EC2 인스턴스를 등록하면 NLB에서 트래픽 전송 방법을 파악한다.
- IP Address
- 고정 IP와 개인 IP를 지정해서 NLB에서 직접 트래픽을 보낸다.
- EC2 인스턴스의 경우 자체 데이터 센터에 서버가 있는 경우 개인 IP가 있는 서버의 로드 밸런서를 사용한다.
- 고정 IP와 개인 IP를 지정해서 NLB에서 직접 트래픽을 보낸다.
- Application Load Balancer
- NLB의 기능을 활용해서 고정 IP를 가질 수 있기 때문
- NLB 수준의 고정 IP를 가지면서 규칙과 같은 HTTP 관련 기능에 ALB를 활용할 수 있다.
- EC2 Instances
Gateway Load Balancer
- GWLB는 배포 및 확장과 AWS의 타사 네트워크 가상 어플라이언스의 플릿 관리에 사용된다.
- 예 : 방화벽, 침입 탐지 및 방지 시스템, IDPS, 심층 패킷 분석 시스템, 페이로드 수정 등
- Layer 3 (네트워크 레이어) - IP Packets
- Transparent Network Gateway
- 모든 트래픽은 단일 엔트리와 출구를 통과하기 때문
- Load Balancer
- 가상 어플라이언스 집합에 전반적으로 그 트래픽을 분산하기 때문
- Transparent Network Gateway
- 6081번 포트의 GENEVE 프로토콜을 사용해라.
- Target Groups
- EC2 instances
- IP Addresses
- private IP이어야 한다.
Sticky Sessions(Session Affinity)
- 로드 밸런서에 2가지 요청을 수행하는 클라이언트가 요청에 응답하기 위해 백엔드에 동일한 인스턴스를 갖는 것이다.
- 예를들어 A 클라이언트가 1번 인스턴스에 요청을 하면 이후 모든 A 클라이언트의 요청은 1번 인스턴스로 가는 것이다.
- CLB, ALB에서 설정할 수 있다.
- "cookie"를 사용해 클라이언트에서 로드 밸런서로 요청의 일부로서 전송되는 것이다.
- 고정성과 만료 기간이 있다.
- 쿠키가 만료되면 클라이언트가 다른 EC2 인스턴스로 리디렉션 된다.
- 사용 예
- 사용자의 로그인과 같은 중요한 정보를 취하는 세션 데이터를 잃지 않기 위해 사용자가 동일한 백엔드 인스턴스에 연결된다.
- Sticky Session(고정성)을 사용하면 백엔드 EC2 인스턴스 부하에 불균형을 초래할 수 있다.
- 일부 인스턴스는 고정 사용자를 갖기 때문이다.
Cookie Name
- Application-based Cookies(애플리케이션 기반 쿠키)
- Custom cookie
- target에서 생성 됨
- 애플리케이션에 필요한 모든 사용자 정의 속성을 포함할 수 있다.
- Cookie Name은 각 target group별로 개별적으로 지정해야 한다.
- AWSALB, AWSALBAPP, AWSALBTG를 사용해서는 안된다.(ELB에서 사용하기 때문)
- Application cookie
- 로드 밸런서 자체에서 생성된다.
- ALB의 cookie name은 AWSALBAPP이다.
- Custom cookie
- Duration-based Cookies(기간 기반 쿠키)
- 로드 밸런서에서 생성된다.
- ALB에서는 이름이 AWSALB이며 CLB에서는 AWSELB이다.
- 특정 기간을 기반으로 만료되며 그 기간이 로드 밸런서 자체에서 생성되는 것이다.
Cross-Zone Load Balancing
- Application Load Balancer
- 항상 활성화되어 있고 비활성화 할 수 없다.
- AZ 간 데이터 전송에 관한 비용이 없다.
- Network Load Balancer
- 기본적으로 비활성화 되어 있다.
- 활성화 할 경우 AZ 간 데이터 전송에 관한 비용을 지불해야 한다.
- Classic Load Balancer
- 기본적으로 비활성화 되어 있다.
- 활성화 할 경우 AZ 간 데이터 전송에 관한 비용이 없다.
SSL/TLS
- SSL 인증서를 사용하면 클라이언트와 로드 밸런서 사이에서 전송 중에 있는 트래픽을 암호화할 수 있다.
- in-flight 암호화라고 불리는 과정으로 데이터가 네트워크를 통과하는 중에 암호화되고 발신자와 수신자만이 이를 해독할 수 있다.
- SSL
- Secure Sockets Layer(소켓 계층 보안)을 뜻하며 연결을 암호화하는 데에 사용된다.
- TLS
- Transport Layer Security(전송 계층 보안)을 뜻하며 SSL의 최신 버전이다.
- 최근 TLS 인증서를 주로 사용하지만 대부분의 사람들이 SSL이라고 부르고 있다.
- Public SSL 인증서는 Certificate Authorities(CA) 기관에서 발급된다.
- SSL 인증서에는 유효 기간이 있고 인증을 위해 주기적으로 갱신되어야 한다.
Load Balancer 관점
- 유저가 HTTPS를 통해 연결된다.
- 공용 인터넷을 통해 로드밸런서와 연결된다.
- 로드밸런서는 SSL 인증서 종료 작업을 수행한다.
- 백엔드는 HTTP 통신을 통해 EC2 인스턴스와 통신한다.
- 사설 네트워크인 VPC를 통해 전송하기 때문에 어느 정도의 안전성을 보장한다.
- 로드밸런서는 X.509 인증서를 불러온다.
- SSL 혹은 TLS 서버 인증서라고 불리는 인증서이다.
- AWS에서 ACM(AWS Certificate Manager)을 사용해 SSL 인증서를 관리할 수 있다.
- HTTPS 리스너를 설정할 때는 기본 인증서를 지정해야 한다.
- 다수의 도메인을 지원하는 인증서 선택 목록을 추가할 수 있다.
- Client는 SNI(Server Name Indication)을 사용해서 도달하는 호스트 이름을 지정할 수 있다.
- 원하는 경우 HTTPS에 대해 특정한 보안 정책을 설정할 수 있다.
SNI(Server Name Indication)
- SNI를 사용하면 한 웹서버 상에 다수의 SSL 인증서를 발급해 단일 웹 서버가 여러 개의 웹 사이트를 제공하도록 하는 문제를 해결한다.
- 클라이언트가 초기 SSL handshake에서 대상 서버의 호스트 이름을 명시해야 한다.
- ALB, NLB와 같은 최신 버전의 로드 밸런서나 CloundFront에서만 작동한다.
- 구형의 CLB에서는 작동하지 않는다.
SSL Certificates
- Classic Load Balancer(v1)
- 하나의 SSL 인증서만 지원한다.
- 여러 SSL 인증서가 있는 다중 호스트 이름이 필요한 경우 다수의 CLB를 사용하는게 좋다.
- Application Load Balancer(v2)
- 다중 SSL 인증서를 가진 다수의 리스너를 지원할 수 있다.
- SNI를 사용하여 작업한다.
- 다중 SSL 인증서를 가진 다수의 리스너를 지원할 수 있다.
- Network Load Balancer(v2)
- 다중 SSL 인증서를 가진 다수의 리스너를 지원할 수 있다.
- SNI를 사용하여 작업한다.
- 다중 SSL 인증서를 가진 다수의 리스너를 지원할 수 있다.
Connection Draining
다양한 별명
- CLB : Connection Draining (연결 드레이닝)
- ALB, NLB : Deregistration Delay (등록 취소 지연)
인스턴스가 등록 취소, 혹은 비정상적인 상태에 있을 때 인스턴스에 어느 정도의 시간을 주어 in-flight 요청, 즉 활성 요청을 완료할 수 있도록 하는 기능이다.
연결이 드레이닝되면 즉 인스턴스가 드레이닝되면 ELB는 등록 취소 중인 EC2 인스턴스로 새로운 요청을 보내지 않는다.
1~3600초 사이의 값을 설정할 수 있는데 기본적으로는 300초(5분) 이다.
0초로 지정하면 비활성화가 되어 드레이닝이 일어나지 않는다.
'프로그래밍 > AWS Solutions Architect' 카테고리의 다른 글
AWS SAA - Amazon RDS (0) | 2022.05.15 |
---|---|
AWS SAA - Auto Scaling Group (ASG) (0) | 2022.05.12 |
AWS SAA - Scalability & High Availability (0) | 2022.05.12 |
AWS SAA - EC2 Instance Storage (0) | 2022.05.12 |
AWS SAA - EC2 (2) (0) | 2022.05.11 |