ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • AWS ELB(ALB, NLB) 실습
    AWS 2021. 7. 30. 22:17

    이번 포스팅은 AWS ELB에 대해 알아보고, 다음 내용을 실습해본다.

     

    - 로드밸런서를 통한 서비스(인입) 제공

     - ALB와 NLB 동작의 차이

    - 웹 서버에서 클라이언트 IP확인

     

    ☞ 질문 - 로드밸런서(LoadBalancer)는 왜 사용하는 걸까?

     

    출처: AFOS

    - 고가용성 환경 구성 요구 

    - 트래픽 분산 처리 

    ... 등등의 이유 

     

     

     

    ☞ 질문 - 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 생성하기 

    1. 기본 구성
      • 이름(ALB-TEST), 인터넷 경계
      • 리스너 : 프로토콜(HTTP), 포트(80)
      • 가용 영역 : ELB-VPC, 2a 와 2c 선택
    2. 보안 설정 구성 : skip
    3. 보안 그룹 구성 : 기존보안그룹 (###-ELBSG-### , TCP 80, 22 허용) 선택
    4. 라우팅 구성
      • 대상 그룹(새 대상 그룹), 이름(ALB-TG), 대상 유형(인스턴스), 프로토콜(HTTP), 포트(80)
      • 상태 검사 → 고급 상태 검사 설정 : 정상 임계 값(3), 간격(10), 나머지는 기본값
    5. 대상 등록 : 하단 인스턴스 선택 → 등록된 항목에 추가
    6. 검토 → 생성
    7. 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 생성하기 

    1. 기본 구성
      • 이름(NLB-TEST), 인터넷 경계
      • 리스너 : 프로토콜(UDP), 포트(161)
      • 가용 영역 : ELB-VPC, 2a 와 2c 선택 - IP는 AWS에서 할당 or 사용자의 EIP 사용 가능
    2. 보안 설정 구성 : skip
    3. 보안 그룹 구성 없음
    4. 라우팅 구성
      • 대상 그룹(새 대상 그룹), 이름(NLB-TG), 대상 유형(인스턴스), 프로토콜(UDP), 포트(161)
      • 상태 검사(HTTP) → 고급 상태 검사 설정 : 간격(10), 나머지는 기본값 ⇒ UDP는 기본 단방향 통신으로 상태검사에 비적합
    5. 대상 등록 : 하단 인스턴스 선택 → 등록된 항목에 추가
    6. 검토 → 생성

     

     

     

    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 스터디에서 공부한 내용을 바탕으로 작성하였습니다. 

    반응형

    댓글

Designed by Tistory.