Post

AWS ALB 정리

AWS ALB 정리

ALB(L7)

Application Load Balancing의 약자로 애플리케이션(L7)계층의 로드밸런싱을 담당한다. HTTP, HTTPS, WebSocket을 지원한다. ALB는 들어오는 트래픽을 대상그룹(Target Group)으로 로드밸런싱 알고리즘을 통해 부하를 분산한다.

ALB를 서버 앞단에 두면, 클라이언트는 ALB와 통신한다. ALB는 클라이언트에게 받은 트래픽을 서버에게 전달한다. 서버로 들어오는 트래픽의 IP SRC는 ALB가 된다. 그렇기에 서버는 클라이언트에 대한 정보를 모르기에 XFF 방법을 통해서 클라이언트에 대한 정보를 넣는다.

헤더(X-forwared-for)에서 클라이언트의 IP를 확인할 수 있다. (x-forwarded-port), (x-forwared-proto)를 통해 IP, 포트, 프로토콜(응답방식)을 확인하여 다시 클라이언트에게 전송한다. 이런 통신 방법 덕분에 Connection이 계속 유지되는 것이 아닌 종료가 되어 보안적으로 더 우수하다.

ALB에서 규칙을 설정하여, 특정 규칙에 맞으면 EC2가 아닌 에러를 반환하게 설정할 수 있다. 또 규칙끼리는 우선순위를 부여할 수 있다.

라우팅 방법

라우팅 방법: URI 방식으로 다 가능

  • PATH(example.com/users & example.com/posts)
  • 호스트네임(one.example.com & other.example.com)
  • 파라미터 쿼리(example.com/users?id=123&order=false)

ALB는 호스트 네임이 어느정도 고정된다. xxx.region.elb.amazoneaws.com

대상 그룹

AWS에서는 로드밸런싱할 대상을, 대상 그룹(Target Group)이라는 별도의 리소스로 관리한다.

대상 그룹의 유형으로 IP주소, 인스턴스, Lambda가 가능하다.

대상 유형이 ip인 경우, 다음 CIDR 블록 중 하나에서 IP 주소를 지정할 수 있습니다.

  • 대상 그룹에 대한 VPC의 서브넷
  • 10.0.0.0/8(RFC 1918)
  • 100.64.0.0/10(RFC 6598)
  • 172.16.0.0/12(RFC 1918)
  • 192.168.0.0/16(RFC 1918)

관련 AWS 문서를 통해 자세하게 확인할 수 있다.

Stickiness

[Stickiness 활성화하기]

Stickiness 옵션을 활성화하면 동일한 클라이언트로 같은 요청이 들어오면, 같은 서버로 트래픽을 전달한다. 예를들어, 서버1과 클라이언트1이 통신한 후 5분뒤 클라이언트1이 재접속하면 로드밸런싱을 하는 것이 아닌 같은 서버1과 연결한다.

Target Group > edit target group attributes으로 이동하면 아래와 같은 화면을 확인할 수 있다.

위의 화면과 같이 애플리케이션 기반 쿠키로 설정하고, 지속시간을 하루로 설정한다.

Untitled.png

이제 브라우저에서 ALB DNS 도메인에 접속하면 다음과 같이 응답에 AWSALBAPP 쿠키를 확인할 수 있다. 쿠키를 통해 ALB는 같은 서버로 트래픽을 전달한다.

Untitled.png

느린 시작 모드

ALB에서 서버가 대상 그룹으로 등록될 때, 초기에는 세팅으로 인해 정상적인 상태가 아닐 수 있다. 이런 경우 워밍업 시간이 필요하다. ASG, 오토스케일링 그룹에서도 유사하게 활성화 시간(ex.5분)을 주어 즉각적으로 상태에 따른 스케일링이 일어나지 않는다. 여기에서도 워밍업시간을 부여하여 트래픽을 정상적으로 처리할 수 있는 상태일때 트래픽을 전달한다.

기본적으로, 대상은 대상 그룹으로 등록되자 마자 전체 요청 공유를 받기 시작하고 초기 상태 확인을 전달합니다. 느린 시작 모드를 사용하면 로드 밸런서가 대상으로 전체 요청 공유를 보내기 전에 대상에 워밍업 시간이 제공됩니다.

보안

Amazone Cognito 와 연결하여 임시 사용자 증명 단계를 거쳐 접근하게 할 수 있다.

과금

  • 서비스 실행시간
  • LCU(로드 밸런서 용량 단위): 트래픽 유입에 대한 값을 측정하고 이를 과금
    • 새 연결 수: 초당 새로 설정된 연결 수. 일반적으로 연결마다 많은 요청이 전송됩니다.
    • 활성 연결 수: 분당 활성 연결 수.
    • 처리된 바이트: HTTP 요청 및 응답을 위해 로드 밸런서에서 처리된 바이트 수(GB).
    • 규칙 평가: 로드 밸런서가 처리한 규칙 수와 요청 속도의 곱. 처음 10개의 처리 규칙은 무료
    • $요청 속도\times(\text{규칙 처리 수}-\text{10개의 무료 규칙})$
  • TLS 연결 시간

Global Accelerator 성능 확인하기

ALB > Integrations 목록을 확인하면 아래와 같이 Global Accelerator와 통합할 수 있다. 옵션을 활성화해주면, 아래와 같이 고정 IP 2개가 나온다. 이 두개의 IP를 통해 접속을 하면 AWS 내부망을 통해 ALB에 트래픽이 도달하게 되어, ALB의 DNS로 접속하는 것보다 더 빠른 접근이 가능하다고 한다.

Untitled.png

ALB와 EC2는 서울 리전에 위치한다. 내 로컬 PC로 핑 테스트를 해보면 둘다 유사한 성능을 보인다. Global Accelerator를 사용하는 것이 아주 조금 빠르다.

  • ALB DNS로 접속
1
2
3
4
5
6
7
8
9
10
$ ping -c 8 test-alb-1641545353.ap-northeast-2.elb.amazonaws.com
PING test-alb-1641545353.ap-northeast-2.elb.amazonaws.com (3.39.4.22): 56 data bytes
64 bytes from 3.39.4.22: icmp_seq=0 ttl=227 time=47.699 ms
64 bytes from 3.39.4.22: icmp_seq=1 ttl=227 time=60.595 ms
64 bytes from 3.39.4.22: icmp_seq=2 ttl=227 time=71.804 ms
...

--- test-alb-1641545353.ap-northeast-2.elb.amazonaws.com ping statistics ---
8 packets transmitted, 8 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 35.760/53.480/81.158/15.284 ms
  • Global Accelerator Static IP로 접속
1
2
3
4
5
6
7
8
9
10
$ ping -c 8 75.2.105.20
PING 75.2.105.20 (75.2.105.20): 56 data bytes
64 bytes from 75.2.105.20: icmp_seq=0 ttl=235 time=73.847 ms
64 bytes from 75.2.105.20: icmp_seq=1 ttl=235 time=54.530 ms
64 bytes from 75.2.105.20: icmp_seq=2 ttl=235 time=32.813 ms
...

--- 75.2.105.20 ping statistics ---
8 packets transmitted, 8 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 32.813/53.179/73.847/11.393 ms

위의 예시에서는 로컬과 리전자체가 같아서 Global Accelerator의 효과를 보기 힘들었다. 그래서 이번엔 버지니아 리전에서 테스트를 진행해봤다.

ALB DNS로 접근할 경우 100ms이상의 시간이 소요된 반면 Global Accelerator로 접근하면 1ms 이하의 성능을 보였다. 100배 이상 차이가 발생했다. 테스트 자체도 AWS에서 진행해서 더 좋은 성능을 보인 것 같다.

  • ALB DNS로 접속
1
2
3
4
5
6
7
8
9
[ec2-user@ip-172-31-84-73 ~]$ ping -c 8 test-alb-1641545353.ap-northeast-2.elb.amazonaws.com
PING test-alb-1641545353.ap-northeast-2.elb.amazonaws.com (43.201.216.97) 56(84) bytes of data.
64 bytes from ec2-43-201-216-97.ap-northeast-2.compute.amazonaws.com (43.201.216.97): icmp_seq=1 ttl=231 time=185 ms
...

--- test-alb-1641545353.ap-northeast-2.elb.amazonaws.com ping statistics ---
8 packets transmitted, 8 received, 0% packet loss, time 7006ms
rtt min/avg/max/mdev = 185.640/185.856/186.274/0.557 ms

  • Global Accelerator Static IP로 접속
1
2
3
4
5
6
7
8
9
10
[ec2-user@ip-172-31-84-73 ~]$ ping -c 8 35.71.182.149
PING 35.71.182.149 (35.71.182.149) 56(84) bytes of data.
64 bytes from 35.71.182.149: icmp_seq=1 ttl=247 time=0.557 ms
64 bytes from 35.71.182.149: icmp_seq=2 ttl=247 time=0.592 ms
64 bytes from 35.71.182.149: icmp_seq=3 ttl=247 time=0.568 ms
...

--- 35.71.182.149 ping statistics ---
8 packets transmitted, 8 received, 0% packet loss, time 7175ms
rtt min/avg/max/mdev = 0.556/0.586/0.617/0.035 ms
This post is licensed under CC BY 4.0 by the author.