-
AWS ELB(ALB, NLB) 실습AWS 2021. 7. 30. 22:17
이번 포스팅은 AWS ELB에 대해 알아보고, 다음 내용을 실습해본다.
- 로드밸런서를 통한 서비스(인입) 제공
- ALB와 NLB 동작의 차이
- 웹 서버에서 클라이언트 IP확인
☞ 질문 - 로드밸런서(LoadBalancer)는 왜 사용하는 걸까?
- 고가용성 환경 구성 요구
- 트래픽 분산 처리
... 등등의 이유
☞ 질문 - ELB란 ?
AWS에서는 ELB(Elastic Load Balancer)라는 로드 밸런싱 기술을 제공
일반적으로 서비스의 고가용성을 위해 최소 2개의 가용영역을 사용
< ELB의 구성 - 리스너와 대상그룹 >
ELB는 ALB, NLB, CLB등이 있으며 ALB와 NLB를 주로 사용한다.
1. ALB
- HTTP/HTTPS 처리에 특화된 애플리케이션 계층 로드 밸런서로써 L7 라우팅 동작이 가능
- lambda를 대상 그룹으로 지정 가능
- 교차 영역 로드밸런싱(Cross Zone Load Balancing)이 기본적으로 가능
2. NLB
- TCP, UDP, TLS 처리를 할 수 있는 OSI 4계층의 로드 밸런서로써 높은 처리량, 고정 IP 보유
- 교차 영역 로드밸런싱(Cross Zone Load Balancing)이 기본으로 비활성화되어 있다.
< 실습 >
1. ALB 실습
My VPC에 있는 My-EC2에서 ELB-VPC로 트래픽을 보낸 후,
EC2-1과 EC2-2로 로드밸런싱 되는 것을 확인한다.
(기본적인 VPC 구성, EC2 세팅은 되어 있고, 다음과 같은 구성에서 실습을 시작한다)
1) ELB-EC2-1 세팅 확인
[ec2-user@ELB-EC2-1 ~]$ sudo su - [root@ELB-EC2-1 ~]# tree /var/www/html /var/www/html ├── dev │ └── index.html ├── index.html └── xff.php cat /var/www/html/xff.php
2) ELB-EC2-2 세팅 확인
[ec2-user@ELB-EC2-2 ~]$ sudo su - [root@ELB-EC2-2 ~]# tree /var/www/html /var/www/html ├── index.html ├── mgt │ └── index.html └── xff.php cat /var/www/html/xff.php
3) My-EC2 세팅 확인
sudo su - # ELB-EC2-1 ELB-EC2-2 퍼블릭IP를 변수에 지정 << 아래 EC21, EC22 IP 정보는 각자 멤버들 실습 결과 IP 정보 입력 EC21=13.125.6.50 EC22=3.36.132.205 echo $EC21 echo $EC22 # ELB-EC2-1 서비스 확인 [root@ip-20-0-0-253 ~]# curl $EC21 <h1>ELB-EC2-1 Web Server</h1> [root@ip-20-0-0-253 ~]# curl $EC21/xff.php Client Public IP: 3.34.252.148 Server Public IP = 13.125.183.254 Server Private IP: 10.0.0.217 X-Forwarded-for: [root@ip-20-0-0-253 ~]# curl $EC21/dev/ <h1>ELB-EC2-1 Dev Web Page</h1> # sysName은 사용자가 장비에 설정한 장비명(Linux의 Hostname) [root@ip-20-0-0-253 ~]# snmpget -v2c -c public $EC21 1.3.6.1.2.1.1.5.0 SNMPv2-MIB::sysName.0 = STRING: ELB-EC2-1 # sysName은 사용자가 장비에 설정한 장비명(Linux의 Hostname) [root@ip-20-0-0-253 ~]# snmpget -v2c -c public $EC21 1.3.6.1.2.1.1.5.0 SNMPv2-MIB::sysName.0 = STRING: ELB-EC2-1 # sysUpTimeInstance(sysUpTime)값은 장비가 부팅되어 현재까지 동작한 milli-second 값이며, 쿼리 시 업데이트 되는 정보 # 아래 값의 경우 부팅 후 2분 10초가 경과된 정보이다 [root@MyEC2 ~]# snmpget -v2c -c public $EC22 1.3.6.1.2.1.1.3.0 DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (13098) 0:02:10.98 # ELB-EC2-1 서비스 확인 curl $EC21 curl $EC21/xff.php;echo curl $EC21/dev/ snmpget -v2c -c public $EC21 1.3.6.1.2.1.1.5.0 snmpget -v2c -c public $EC21 1.3.6.1.2.1.1.3.0 # ELB-EC2-2 서비스 확인 curl $EC22 curl $EC22/xff.php;echo curl $EC22/mgt/ snmpget -v2c -c public $EC22 1.3.6.1.2.1.1.5.0 snmpget -v2c -c public $EC22 1.3.6.1.2.1.1.3.0
4) ALB 생성하기
- 기본 구성
- 이름(ALB-TEST), 인터넷 경계
- 리스너 : 프로토콜(HTTP), 포트(80)
- 가용 영역 : ELB-VPC, 2a 와 2c 선택
- 보안 설정 구성 : skip
- 보안 그룹 구성 : 기존보안그룹 (###-ELBSG-### , TCP 80, 22 허용) 선택
- 라우팅 구성
- 대상 그룹(새 대상 그룹), 이름(ALB-TG), 대상 유형(인스턴스), 프로토콜(HTTP), 포트(80)
- 상태 검사 → 고급 상태 검사 설정 : 정상 임계 값(3), 간격(10), 나머지는 기본값
- 대상 등록 : 하단 인스턴스 선택 → 등록된 항목에 추가
- 검토 → 생성
- EC2 → 네트워크 및 보안 → 네트워크 인터페이스 : 설명(ELB app...) 확인
5) ALB 검증하기
이제 My-EC2에서 다음과 같이 설정
# ALB DNS 이름을 변수로 지정 << 아래 ALB 정보는 각자 멤버들 실습 결과 정보 입력 ALB=ALB-TEST-216564653.ap-northeast-2.elb.amazonaws.com echo $ALB # curl 접속 테스트 - ALB 는 기본 라운드 로빈 방식으로 대상 분산 dig $ALB +short while true; do dig $ALB +short && echo "------------------------------" && date; sleep 5; done ------------------------------ Sun Jan 24 05:51:25 UTC 2021 13.209.204.23 13.124.52.66 ------------------------------ curl $ALB curl $ALB for i in {1..20}; do curl $ALB --silent ; done | sort | uniq -c | sort -nr for i in {1..100}; do curl $ALB --silent ; done | sort | uniq -c | sort -nr curl $ALB/xff.php ;echo curl $ALB/xff.php ;echo # /dev/index.html 접근 curl $ALB/dev/index.html --silent curl $ALB/dev/index.html --silent # /mgt/index.html 접근 curl $ALB/mgt/index.html --silent curl $ALB/mgt/index.html --silent
결과 확인
로그 확인하기
# ELB-EC2-1/2 tail -f /var/log/httpd/access_log 10.0.1.216 - - [24/Jan/2021:06:20:38 +0000] "GET / HTTP/1.1" 200 30 "-" "ELB-HealthChecker/2.0" 10.0.0.109 - - [24/Jan/2021:06:20:45 +0000] "GET / HTTP/1.1" 200 30 "-" "ELB-HealthChecker/2.0" tail -f /var/log/httpd/access_log |grep -v "ELB-HealthChecker/2.0" [root@ELB-EC2-2 ~]# tail -f /var/log/httpd/access_log |grep -v "ELB-HealthChecker/2.0" 10.0.1.246 - - [08/Nov/2020:07:17:56 +0000] "GET /mgt/ HTTP/1.1" 200 32 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15" # 패킷덤프 - ELB-EC2-1/2 tcpdump tcp port 80 -nn
※ 참고 - 로그에서 클라이언트 IP 확인하기
ALB에서 X-Forwarded-For에 클라이언트 IP정보를 서버에서 확인 가능
# Apache 기본 로그 설정 정보 확인 [root@ELB-EC2-1 conf]# grep -n LogFormat /etc/httpd/conf/httpd.conf 196: LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined ~ # Apache 기본 로그 설정 변경 : 196번째 줄에 %{X-Forwarded-For}i 추가 nano /etc/httpd/conf/httpd.conf LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined CTRL+X Y Enter 로 저장하고 빠져나오기 # HTTP 다시 로드 - ## 아재 service httpd reload systemctl reload httpd # 실시간 로그 출력 후 외부에서 접속 시도 tail -f /var/log/httpd/access_log |grep -v "ELB-HealthChecker/2.0" 3.34.252.138 10.0.1.246 - - [08/Nov/2020:07:27:12 +0000] "GET /dev/ HTTP/1.1" 200 32 "-" "curl/7.61.1"
※ 참고 - ALB 고급 라우팅: 아이폰 안드로이드 사용자 차단
- 리스너 규칙 편집 : HTTP 헤더 기반 라우팅 설정
- 리스너 규칙 추가
- HTTP 헤더 → User-Agent 는 iPhone 혹은 Android
- 고정 응답 반환 : 503 iPhone or Android Access Deny
- 리스너 규칙 추가
2. NLB 실습
1) NLB 생성하기
- 기본 구성
- 이름(NLB-TEST), 인터넷 경계
- 리스너 : 프로토콜(UDP), 포트(161)
- 가용 영역 : ELB-VPC, 2a 와 2c 선택 - IP는 AWS에서 할당 or 사용자의 EIP 사용 가능
- 보안 설정 구성 : skip
보안 그룹 구성 없음- 라우팅 구성
- 대상 그룹(새 대상 그룹), 이름(NLB-TG), 대상 유형(인스턴스), 프로토콜(UDP), 포트(161)
- 상태 검사(HTTP) → 고급 상태 검사 설정 : 간격(10), 나머지는 기본값 ⇒ UDP는 기본 단방향 통신으로 상태검사에 비적합
- 대상 등록 : 하단 인스턴스 선택 → 등록된 항목에 추가
- 검토 → 생성
2) NLB 검증하기
MyEC2에서 실행
# NLB DNS 이름을 변수로 지정 << 아래 NLB 정보는 각자 멤버들 실습 결과 정보 입력 NLB=NLB-TEST-4287130da7e42520.elb.ap-northeast-2.amazonaws.com echo $NLB # NLB는 아래 도메인 쿼리 응답 IP가 고정 dig $NLB +short while true; do dig $NLB +short && echo "------------------------------" && date; sleep 5; done # NLB IP를 변수에 지정 << 아래 NLB1 NLB2 IP 정보는 각자 멤버들 'dig $NLB' 출력된 IP 2개 정보를 각각 입력 NLB1=3.38.32.124 NLB2=13.124.129.65 # curl 접속 테스트 # NLB 는 5 Tuple Hash 결과로 분산하며 default 설정이 Cross Zone Load Balancing(교차 영역 로드 밸런싱)이 비활성화 상태 for i in {1..20}; do snmpget -v2c -c public $NLB 1.3.6.1.2.1.1.5.0 ; done | sort | uniq -c | sort -nr for i in {1..20}; do snmpget -v2c -c public $NLB1 1.3.6.1.2.1.1.5.0 ; done | sort | uniq -c | sort -nr for i in {1..20}; do snmpget -v2c -c public $NLB2 1.3.6.1.2.1.1.5.0 ; done | sort | uniq -c | sort -nr
결과적으로 교차 영역 로드밸런싱이 비활성화 상태이기 때문에 EC2-1나 EC2-2로만 트래픽이 흐른다.
※ AFOS 스터디에서 공부한 내용을 바탕으로 작성하였습니다.
반응형'AWS' 카테고리의 다른 글
AWS Auto Scaling 실습 (0) 2021.08.02 NAT Instance port-forwarding (0) 2021.08.01 AWS RDS Multi-AZ, Read Replica 실습 (0) 2021.07.18 AWS EFS를 이용한 EC2 데이터 공유 (0) 2021.07.03 AWS EBS 볼륨 확장 및 파티션, 파일 시스템 변경 (0) 2021.07.03 - 기본 구성