안녕하십니까. 오늘은 Application LB와 관련된 업데이트 한가지를 살펴보려고 합니다.
여러분도 잘 아시다시피 ELB 서비스에서는 여러가지 유형의 로드밸런서를 제공합니다. 가장 심플한 접근법으로는 L4 계층의 LB는 NLB(Network Load Balancer)를, L7 계층의 LB는 ALB(Application Load Balancer)를 씁니다. 그리고 예전 세대의 CLB(Classic Load Balancer)도 있는데, CLB에서만 구현할 수 있는 것들이 이제는 거의 남아있지 않아서 최근에는 필요성이 극히 낮아졌구요.
NLB와 ALB로 범위를 좁혀 보면, 상황에 따라 반드시 이분법적으로 딱 잘라 특정 유형의 LB를 써야 되는건 아닙니다. 일반적인 웹서버 앞에 있는 LB로 ALB가 아닌 NLB도 쓸 수 있습니다. 다만 L7 계층에서 처리해야 할 몇가지 로직을 LB에 반드시 위임해야 하고, 그것을 ALB에서 지원한다고 하면 ALB를 쓰는게 현명한것 뿐이죠. NLB와 ALB의 세부 기능이나 제약사항이 서로 다르기 때문에 어떤 것들은 상황에 따라 배제되기도 하고, 또 다른 어떤 것들은 선택의 문제로 치환되기도 했습니다.
이런 관점에서 그간 ALB의 제약사항 중 하나는 gRPC를 지원하지 않는다는 것이었습니다. 그래서 어쩔 수 없이 gRPC 요청을 처리하기 위한 LB로 CLB나 NLB를 TCP 모드로 사용하거나, "ALB에서 제어하면 간단한 것"들을 어플리케이션 레벨에서 추가로 고려해야 하는 불편사항이 있었구요. 그리고 이번 업데이트가 나왔습니다. ALB에서 종단간 HTTP/2 및 gRPC를 지원한다는 것으로, 비슷한 불편사항을 겪어 왔던 사용자에게 희소식이 될 수 있는 내용입니다. 간단히 한번 살펴보시죠.
위 AWS 관리콘솔 화면은 요즘 Target Group을 설정할때 나오는 화면입니다. 뭔가 이전에 비해 달라진 부분을 확인하셨나요? Protocol version, 즉 LB에서 백엔드의 Target Group으로 요청을 전달할때 프로토콜을 지정하는 부분이 달라졌습니다. 기존에는 HTTP1밖에 없었다면, 이제는 HTTP2와 gRPC를 선택하는 부분이 추가되었네요. 물론 기존에도 ALB의 경우 HTTP2를 지원하기는 했습니다만, 이건 LB 뒷단이 아닌 앞단의 Listener Protocol에서 지원했던 부분이고 백엔드 요청은 HTTP/1.1로 변환시켜 전달하는 방식으로 동작해왔습니다.
gRPC는 HTTP/2를 기반으로 하는 가볍고 성능이 좋은 프레임워크로 이미 범용적으로 많이 쓰이고 있는 방식입니다. 특히 MSA 기반의 아키텍쳐를 잘 활용하고 있는 회사에서 많이 사용되고 있구요. 이번 업데이트로 Client --(1)-- ALB --(2)-- Backend 관점에서, (2) 구간을 HTTP2 또는 gRPC로 지정함으로써, Client와 Backend간(End to End) 통신을 HTTP/2 또는 gRPC로 구현할 수 있게 되었습니다.
물론 위 그림처럼 요청에 따라 HTTP1로 처리하는 트래픽과 HTTP2로 처리하는 트래픽을 하나의 ALB 객체 내에서 분기하여 처리할 수도 있습니다. 물론 분기처리를 ALB 내에서 정의할 수도 있구요. 다양한 형태의 Client 요청을 받아내기 위해 복수의 LB를 사용할 필요가 없기 때문에, 서비스 끝점을 관리하거나 기타 관리편의성 측면에서 장점이 있습니다.
Protocol version을 gRPC로 지정하는 경우 Health Check 조건에 보면 새로운 항목을 발견할 수 있습니다. 위 그림을 보시면 Success codes라는 항목이 있는데요. 기존의 HTTP 응답코드(2xx-5xx)와 달리, gRPC를 사용하는 백엔드 어플리케이션에서 특정 상태 코드를 정의하고 이 응답코드를 기반으로 Healthy 여부를 판단할 수 있도록 되어 있습니다.
Protocol version을 HTTP/2나 gRPC로 지정하는 경우, 물론 몇몇 제약사항이 있습니다. ALB의 Listener Protocol이 HTTPS일때만 설정 가능하다거나, Target Group의 객체를 Lambda로 지정할 수 없다거나 이런것들입니다. 좀더 자세한 내용은 아래 링크의 공식 문서나 ELB 데모페이지에서 살펴보시기 바랍니다. 그럼 마칩니다. 끝!
https://aws.amazon.com/blogs/aws/new-application-load-balancer-support-for-end-to-end-http-2-and-grpc/
https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-target-groups.html#target-group-protocol-version
https://exampleloadbalancer.com/albgrpc_demo.html