aws - Elastic Load Balancer & Auto Scaling Group
수직 스케일링과 수평 스케일링
수직 스케일링: 인스턴스의 크기를 증가시키는 것 수평 스케일링: 인스턴스의 개수를 증가시키는 것 고가용성: 다수의 AZ에 분포된 인스턴스들로 하나의 앱을 실행하는 것.
ELB
Elastic Load Balancer의 약자. 트래픽을 다수의 서버(예를들어 다수의 ec2 인스턴스)로 포워딩하는 서버
로드 밸런서를 사용함으로서 얻을 수 있는 이점들에는 다음과 같은 것들이 있음: ![[Pasted image 20230318181810.png]]
헬스 체크
트래픽을 인스턴스에 포워딩할 수 있는지 인스턴스가 로드밸런서에 알리는 기능. 엔드포인트와 포트를 별도로 사용하여 (주로 /health 라우팅 ) 이루어짐
로드밸런서 타입
deprecated된 CLB를 제외하고 다음 유형들이 있음 ![[Pasted image 20230318182314.png]]
모든 ELB는 정적 도메인 네임이 부여되며 이를 통해 접근하도록 설계되었다. NLB는 정적 ip까지 부여되니 알아두자.
ALB
Application Load Balancer의 약자. 7계층(http)에만 적용되는 로드밸런서이다. (웹소켓도 포함) 복수의 http 앱을 복수의 타켓 그룹(복수 인스턴스)에 라우팅하거나, 동일 인스턴스의 여러 앱에 라우팅할 수 있으며,
url, DNS명, 쿼리 문자열 등으로 라우팅할 수 있고 ECS의 동적 포트에 매핑가능하기 때문에 도커& aws ecs와 사용하기 좋음 deprecated된 CLB는 하나의 앱에만 사용가능했음.
ALB는 타겟 그룹 단위로 라우팅하며 타겟그룹은 ip주소, 인스턴스 뿐만 아니라 aws lamdbda, 다른 로드 밸런서(ALB만),ecs 태스크 등을 포함함. 헬스체크는 타겟 그룹 단위로 이루어짐 로드밸런서는 디폴트로 외부에 DNS 명이 노출됨
로드 밸런서는 모든 외부에서 접근가능해야하기 때문에 인바운드 규칙이 ip range 0.0.0.0/0 으로 설정되며, 인스턴스들은 인바운드 규칙이 로드 밸런서로부터만 허용하도록 로드 밸런서의 보안 그룹을 참조해야 한다. ![[Pasted image 20230318182938.png]] http 프로토콜(80포트)로 로드밸런서의 보안그룹을 참조하는 것이 베스트 프랙티스.
로드밸런서의 rule 규칙을 사용하여 헤더나 url 등으로 타겟 그룹에 라우팅할 조건을 설정 가능. 인스턴스는 VPC 내의 프라이빗 ip만 식별하기 때문에 클라이언트의 ip를 식별하려면 x-forwarded-for 헤더에 클라이언트 ip를 담아서 보내야 한다. x-forwarded-proto : 클라이언트가 로드밸런서(프록시)와 연결하는데 사용한 프로토콜 x-forwarded-port: 클라이언트가 로드밸런서(프록시)와 연결하는데 사용한 포트
NLB
Network Load Balancer의 약자. TLS, UDP, TCP 등의 프로토콜들에 적용됨.
AZ당 하나의 정적 ip가 부여되며, elastic ip를 할당하여 사용할 수 있다.
타겟 그룹은 ec2 인스턴스 / 프라이빗 ip(퍼블릭은 안됨) / ALB 등이 가능하다.
NLB의 헬스 체크는 http /https /tcp가 모두 가능하다는 점이 http만 가능한 alb와 다르다.
ALB와 달리 NLB는 별도의 보안 그룹을 생성하지 않고 모든 트래픽을 그대로 포워딩하므로, 인스턴스의 인바운드 규칙에 보안그룹을 참조하는 것이 아니라 모든 ip(0.0.0.0)를 참조해야 한다.
GLB
Gateway Load Balancer의 약자. 써드 파티 네트워크 가상 어플라이언스 (NVA라고 부름)을 배포, 관리 및 적용하기 위해 사용함(예: 패킷 변조 검사, 침입 감지 예방, 방화벽 등의 시스템). GLB는 3계층(ip 수준)에서 작동하며 이러한 써드 파티 NVA를 타겟 그룹으로 설정할 수 있음. GENEVE 프로토콜을 사용하며 6081 포트로 작동함
- 스티키 세션 (세션 친화성) 클라이언트가 어떠한 타겟 그룹에 포워딩된 히스토리가 있다면 다음 번 트래픽 또한 동일한 인스턴스/타켓그룹에 포워딩되게 함으로써 세션을 유지하는 것. 세션 데이터는 각각의 인스턴스 단위로 저장되기 때문. 이를 위해서 쿠키를 사용한다. 로드 밸런서 설정에서 디폴트로 로드밸런서가 부여하는 쿠키와 커스텀 쿠키를 선택하여 설정할 수 있으며, 이 때 expiration date 등도 설정가능하다. 로드 밸런서가 디폴트로 사용하는 쿠키이름 (AWSALB, AWSALBAPP, AWSALBTG) 는 사용불가이다.
로드 밸런싱 유형
- 크로스존 모든 AZ의 모든 노드 인스턴스에 균등하게 트래픽을 분산.
크로스존을 사용하지 않으면 AZ 별로 트래픽을 분산. AZ는 해당 AZ에 속한 노드에 균등하게 트래픽을 분산.
ALB는 디폴트로 크로스존임. ALB에서 크로스존 로드 밸런싱을 사용하는 경우 AZ간의 통신에는 요금이 발생하지 않음.
그러나 NLB와 GLB에서는 크로스존을 사용하더라도 AZ간의 트래픽 요금이 발생함.
SSL/TLS
SSL은 Secure Sockets Layer, TLS는 Transport Layer Security의 약자로 로드밸런서와 클라이언트 간 트래픽을 암호화하기 이해 사용. 최근에는 TLS가 더 많이 사용됨 SSL 인증서는 만료기간이 있어서 지나면 갱신해야함.
SSL/TLS를 사용해 트래픽을 암호화하면, 클라이언트와 로드 밸런서 간의 통신은 HTTPS 프로토콜을 사용하고, 로드 밸런서와 VPC(타겟 서버와의 프라이빗 네트워크) 간의 통신은 HTTP 프로토콜로 이루어짐
SNI - Server Name Indication의 약자로 복수의 SSL 인증서를 하나의 웹서버에서 로드할 수 있게 디어, 로드 밸런서가 복수의 웹사이트에 대한 SSL 인증을 관리할 수 있게 해줌. 비교적 최근에 나온 프로토콜로, 클라이언트가 트래픽을 보낼 타겟 서버의 도메인명을 명시할 것을 요구함. 로드밸런서는 도메인명을 통해 최초 SSL 핸드쉐이크를 진행할 타겟 서버를 식별하고 SSL 인증서를 로드함.
SNI는 ALB와 NLB만 지원
SSL을 설정하려면 로드밸런서에 HTTPS 프로토콜 리스너를 등록하고 원하는 타겟 그룹에 포워딩한다. SSL/TLS 호환성을 위한 보안 규칙을 설정하고, AWS ACM(Amazon Certificate Manager)에 등록된 SSL/TLS 키를 등록하거나 혹은 직접 키를 입력한다.
Connectin Draining(Deregistration Delay)
기존 deprecated 된 로드밸런서에서 Connection Draining이라고 불렸던 기능으로, 현재 활성화된 요청에 대해, 인스턴스의 헬스체크가 실패할 경우 응답 시간을 더 부여하는 것이다. 해당 시간 후에는 인스턴스에 더 이상 요청을 포워딩 하지 않는다.
ASG(Auto Scaling Group)
부하가 감소하면 인스턴스를 자동으로 종료하고, 증가하면 자동으로 생성하는 기능. 원하는 최대/최소 범위에서 자동으로 scale out/ scale in 가능.
로드 밸런서를 등록하면 인스턴스 생성시에 자동으로 등록해주거나, 헬스체크가 실패할 경우 인스턴스를 종료 및 새 인스턴스를 재생성해주기도 함.
ASG는 ec2 인스턴스 비용을 제외하면 별도 비용이 추가되지 않음.
ASG에서 인스턴스를 설정하기 위해서 ASG Launch Template를 사용한다. 기존 인스턴스 생성에 사용된 파라미터와 거의 동일하다.
scaling 정책은 cloudwatch alarm
을 기준으로 할 수 있는데, cloudwatch alarm
은 CPU 사용량이 등의 지표 혹은 커스텀한 지표를 모니터링하고, 설정한 scaling policy에 따라 인스턴스를 스케일링함.
Scaling Policy 는 다양하게 원하는대로 수립할 수 있다. 특정 CPU 사용량을 타겟으로 하는 타겟 스케일링, 직접 단계 및 스케일링 단위를 설정하는 스텝 스케일링, 유저 사용 패턴에 따라 스케일링을 스케쥴링 하는 스케쥴링 액션, 머신러닝을 기반으로 하는 예측 스케일링 등이 있다.
스케일링 액티비티가 발생한 후에는 디폴트로 5분의 쿨다운 타임이 있다. 이 시간 동안에는 새롭게 인스턴스를 생성하거나 종료하지 않는다.
미리 준비된 AMI 이미지를 사용해 부팅 시간을 줄임으로서 자동 스케일링이 지연되지 않도록 하는 것이 좋다.
Cloudwath Metric
에서 사용할 수 있는 지표는 한정되어 있다. 분당 요청 수 같은 지표의 경우 커스텀 메트릭을 생성한 뒤 해당 메트릭을 사용하는 Alarm을 생성해야 한다.