[AWS] ELB
1. ELB (Elastic Load Balancer) 란?
ELB란 AWS에서 제공하는 로드 밸런싱 서비스이다. 연결된 EC2의 상태를 확인하고 데이터를 분산하여 전달한다.
ELB는 DDOS 공격이 들어오면 이를 감지하여 IP를 바꿔 공격을 피한다.
1) ELB 구조
ELB의 구조는 위와 같다.
리스너
리스너는 규칙에 설정된 프로토콜과 포트번호에 따라 트래픽을 받아들인다. 타겟의 서비스에 맞추어 리스너의 규칙을 정해야한다.
대상그룹
하나 이상의 대상에 대하여 트래픽을 라우팅하여 부하분산을 한다. 대상 그룹 내의 인스턴스들이 정상적으로 작동하고 있는지 Keepalive 프로세스를 사용해 주기적으로 확인한다.
2) ELB 종류
현재 일반적으로 사용되는 ELB는 3가지이다.
ALB (Application Load Balancer)
HTTP(S) 와 같은 7계층 어플리케이션 정보를 사용하여 분산처리를 제공한다. 7계층 정보를 사용하여 다른 로드 밸런서보다는 느리지만, 경로 및 호스트 기반 라우팅을 제공한다. 또한 Lambda 함수 를 호출하여 HTTP(S) 요청을 처리할 수 있다. 하지만 IP를 통한 관리와 프라이빗링크는 지원하지 않는다.
NLB (Network Load Balancer)
TCP, UDP와 같은 4계층 정보를 사용해 분산처리를 제공하여 속도가 빠르다. IP를 통한 관리와 프라이빗링크를 지원한다. 하지만 경로 및 호스트 기반 라우팅은 지원하지 않는다.
GLB (Gateway Load Balancer)
AWS외의 타 클라우드 서비스로 로드 밸런싱할 때 사용된다.
3) ELB 통신 방식
Internet Facing
외부에서 직접 접근할 수 있는 공인IP를 가진다.
Internal
프라이빗 주소만 가지고 있어 내부적으로 동작한다.
2. ALB 및 NLB 구성
구성은 다음과 같다.
ELB-VPC 내의 두개의 서브넷은 다른 가용영역에 생성한다. 가용영역은 IDC를 논리적으로 결합해놓은 것이기 때문에, 로드 밸런싱을 위해서는 서브넷을 각기 다른 가용영역에 두어야 한다.
보안그룹은 인바운드에 SSH, HTTP(S), UDP 161 (SNMP를 위해) 를 허용한다.
1) ALB 구성
-
ALB를 제외한 기본적인 인프라를 구성한다.
-
타겟 그룹을 생성한다. 총 3개의 타겟 그룹을 생성한다.
ALB-TG : /index.html 의 로드 밸런싱을 위한 타겟그룹이다. 두개의 EC2 인스턴스를 타겟으로 한다.
ALB-dev, ALB-mgt : /dev/index.html 과 /mgt/index.html 의 로드 밸런싱을 위한 타겟그룹이다. 각각 하나의 EC2 인스턴스를 타겟으로 한다.
-
ALB를 생성한다. Internet-facing으로 ELB-VPC 내 두개의 서브넷에 연결한다. 타겟그룹은 ALB-TG로 설정한다. 생성해놓은 보안그룹을 적용하고, HTTP/80을 Listen 한다.
여기까지 생성했다면
curl <ALB DNS>
를 해본다.$ curl ALB-1307345475.ap-northeast-2.elb.amazonaws.com This is ELB-EC2-1 $ curl ALB-1307345475.ap-northeast-2.elb.amazonaws.com This is ELB-EC2-2
/index.html 이 로드밸런싱 되는 것을 확인할 수 있다. ALB DNS는 /var/www/html 디렉토리를 의미하고, 여기에는 동일한 index.html이 존재한다. 하지만 /dev/index.html 과 /mgt/index.html 은 경로가 다르기 때문에
curl <ALB DNS>/dev
혹은curl <ALB DNS>/mgt
를 하면 트래픽이 전달된 인스턴스에 따라 페이지가 보이거나 안보인다.이를 해결하기 위해 경로를 통한 로드 밸런싱 을 설정해야 한다.
-
경로에 따라 다른 타겟 그룹으로 트래픽이 전달되도록 규칙을 추가한다.
이제
curl <ALB DNS>/dev
로 보낸 HTTP 트래픽은 모두 EC2-1로,curl <ALB DNS>/mgt
로 보낸 HTTP 트래픽은 모두 EC2-2로 전달된다.2) NLB 구성
NLB가 정상적으로 동작하고 있는지 확인하기 위해 SNMP를 사용한다
# 모든 EC2에 snmp를 설치한다. $ sudo yum -y install net-snmp net-snmp-utils $ sudo systemctl start snmpd # 해당 IP/DNS에게 서버 이름을 요청한다. $ snmpget -v2c -c public <IP or DNS> 1.3.6.1.2.1.1.5.0
-
UDP 161포트를 사용하는 타겟그룹 NLB-TG 를 생성한다.
Health Check는 HTTP로 설정한다 (가장 트래픽이 작음). Health Check를 Traffic port로 하면 UDP 161로 HTTP 트래픽이 지나가려 하기 때문에 작동하지 않는다. Override하여 80번 포트로 설정한다.
-
NLB를 생성한다. Internet-facing으로 ELB-VPC 내 두개의 서브넷에 연결한다. 타겟그룹은 NLB-TG로 설정한다. 생성해놓은 보안그룹을 적용하고, UDP/161을 Listen 한다.
# NLB에게 snmp로 서버 이름을 요청한다. # EC2-1 이 응답한다. $ snmpget -v2c -c public NLB-d9c4b4a0ca2880d2.elb.ap-northeast-2.amazonaws.com 1.3.6.1.2.1.1.5.0 SNMPv2-MIB::sysName.0 = STRING: ip-10-0-1-116.ap-northeast-2.compute.internal # EC2-2 가 응답한다. $ snmpget -v2c -c public NLB-d9c4b4a0ca2880d2.elb.ap-northeast-2.amazonaws.com 1.3.6.1.2.1.1.5.0 SNMPv2-MIB::sysName.0 = STRING: ip-10-0-0-13.ap-northeast-2.compute.internal
-
댓글남기기