Amazon Web Services 한국 블로그

Application Load Balancer 기능 업데이트 — 종단간 HTTP/2 및 gRPC 지원

뛰어난 효율성과 다양한 프로그래밍 언어 지원 덕분에 gRPC마이크로서비스 통합 및 클라이언트-서버 통신에 널리 사용되는 옵션입니다. gRPC는 고성능 원격 프로시저 호출(RPC) 프레임워크로, 전송을 위한 HTTP/2프로토콜 버퍼를 사용하여 인터페이스를 기술합니다.

이제 애플리케이션에서 gRPC를 보다 쉽게 사용할 수 있도록 Application Load Balancer(ALB)는 HTTP/2 엔드 투 엔드를 지원하므로 단일 로드 밸런서를 통해 gRPC 서비스는 물론, gRPC 외 서비스도 함께 게시할 수 있습니다. 대상 그룹에 대한 gRPC 상태 검사 지원을 통해 Amazon Elastic Compute Cloud(EC2) 인스턴스 또는 IP 주소(예: AWS Fargate)를 gRPC 대상으로 사용할 수 있습니다. 이러한 방식으로 ALB를 사용하여 마이크로서비스 사이 또는 gRPC 지원 클라이언트와 서비스 사이에서 gRPC 트래픽을 종료 및 라우팅하고 로드 밸런싱할 수 있습니다.

ALB는 gRPC 호출을 검사하고 적절한 서비스로 라우팅하는 풍부한 콘텐츠 기반 라우팅 기능을 제공합니다. 특히, ALB는 gRPC 상태 코드, gRPC 요청 수에 대한 지표, gRPC 요청을 구분하는 액세스 로그 및 gRPC 특정 응답 헤더를 검사할 수 있는 상태 검사를 제공합니다. 또한 고정성, 다양한 로드 밸런싱 알고리즘 및 TLS 종료와 같은 기본 기능을 활용할 수도 있습니다.

Application Load Balancer에서 gRPC를 사용하는 방법
이 새로운 기능을 테스트하기 위해 먼저 gRPC 서버 애플리케이션을 준비합니다. Python 프로그래밍 언어와 route_guide 데모(grpc 리포지토리에 포함됨)를 사용하려고 합니다. 이 애플리케이션을 사용하는 이유는 클라이언트와 서버가 gRPC를 통해 상호 작용할 수 있는 여러 방법 중 일부를 신속하게 도입하기 때문입니다. 예를 들어, 다음과 같습니다.

  • 간단한 단향 원격 프로시저 호출(RPC) – 함수 호출 작동 방식과 비슷하게, 클라이언트가 서버로 요청을 보내고 응답을 기다립니다.
  • 서버 측 스트리밍 RPC – 클라이언트가 서버로 요청을 보내고 메시지 스트림을 다시 가져오며 더 이상 메시지가 없을 때까지 스트림에서 읽습니다.
  • 클라이언트 측 스트리밍 RPC – 클라이언트는 일련의 메시지를 쓰고 서버로 보낸 다음, 서버가 메시지를 모두 읽고 응답을 반환할 때까지 기다립니다.
  • 양방향 스트리밍 RPC – 클라이언트와 서버 모두 순서를 유지하며 메시지를 독립적으로 전송합니다.

먼저, 컨테이너에서 route_guide 애플리케이션을 실행하도록 Dockerfile을 준비합니다. 기술적으로 일반 EC2 인스턴스를 사용할 수 있기 때문에 반드시 필요한 단계는 아닙니다. 하지만 gRPC에서는 컨테이너를 사용하는 것이 더 일반적이어서, 예제의 관련성을 높이기 위해 컨테이너를 사용합니다.

FROM python:3.7
RUN pip install protobuf grpcio
COPY ./grpc/examples/python/route_guide .
CMD python route_guide_server.py
EXPOSE 50051

컨테이너 이미지를 구축하고 Amazon Elastic Container Registry에 업로드합니다.

aws ecr get-login-password --region eu-north-1 | docker login --username AWS --password-stdin 123412341234.dkr.ecr.eu-north-1.amazonaws.com
docker build -t route-guide .
docker tag route-guide:latest 123412341234.dkr.ecr.eu-north-1.amazonaws.com/route-guide:latest
docker push 123412341234.dkr.ecr.eu-north-1.amazonaws.com/route-guide:latest

Amazon ECS 콘솔에서 네트워킹 전용 템플릿을 사용하여 새 클러스터를 생성합니다. 클러스터 이름을 demo로 지정하고, 다른 모든 값은 기본값으로 두고 이 클러스터에 대한 새 VPC를 생성합니다. ECS 콘솔은 AWS CloudFormation을 사용하여 클러스터에 대한 리소스를 설정합니다. 몇 분 후 모든 리소스가 생성되고 클러스터가 준비됩니다.

gRPC 트래픽에 대한 액세스 권한을 부여하기 위해 클라이언트 랩톱에서 포트 50051의 인바운드 TCP 트래픽을 허용하는 보안 그룹을 생성합니다. 이 보안 그룹의 이름을 gRPC로 지정합니다.

이제 로드 밸런서를 생성합니다. EC2 콘솔의 왼쪽에서 [로드 밸런서(Load Balancers)]를 선택한 다음, [로드 밸런서 생성(Create Load Balancer)]을 선택합니다. 다음 단계에서, Application Load Balancer를 생성하고 이름을 route-guide로 지정합니다. 퍼블릭 인터넷을 통해 gRPC 서비스에 연결하려고 하기 때문에 기본 internet-facing 스키마는 그대로 둡니다. [리스너(Listeners)] 섹션에서 프로토콜로 HTTPS, 포트로 50051을 선택합니다. 바로 아래에서 새로 생성된 VPC와 ECS 콘솔에서 생성한 2개의 가용 영역을 선택합니다.

그런 다음, 보안 설정에서 AWS Certificate Manager(ACM)가 관리하는, 앞서 생성한 인증서를 선택합니다.

그리고 기본 보안 그룹과 위에서 생성한 gRPC 보안 그룹을 선택합니다. 각 VPC에는 동일한 보안 그룹을 사용하는 다른 리소스에 대한 네트워크 액세스를 제공하는 기본 보안 그룹이 자동으로 제공됩니다.

[라우팅(routing)] 섹션에서 route-guide라는 새 대상 그룹을 생성합니다. AWS Fargate를 사용하여 gRPC 서버를 실행할 계획이므로 IP 주소 대상 유형을 선택합니다. ALB는 gRPC 프로토콜을 사용하는 대상 그룹에 대한 보안 및 비보안 연결을 모두 지원합니다. 여기에서는 포트 50051에서 HTTP를 사용합니다. 로드 밸런서와 gRPC 서버를 실행하는 컨테이너 사이에 비보안 연결을 사용하기 때문입니다. 그런 다음, ECS 클러스터에서 사용하는 VPC를 선택합니다. [프로토콜 버전(Protocol Version)]의 경우 gRPC를 사용합니다.

[고급 상태 검사 설정(Advanced health check settings)]에서 올바른 응답인지 검사할 때 사용할 gRPC 성공 코드를 지정할 수 있습니다. 기본값인 12는 그대로 둡니다. 이는 구현되지 않았음을 의미합니다.

메서드를 찾을 수 없으면 gRPC 서버에서 코드 12를 반환합니다. route_guide 애플리케이션에서 구현하지 않은 경로를 사용하기 때문에 이 경우 이 코드가 반환되는 것입니다. 보다 일반적으로, 코드 12를 확인하면 gRPC 서버가 올바르게 실행되고 있는지 빠르게 확인할 수 있습니다. 상태 검사에서 구체적으로 확인하려면 구현에서 예상하는 내용에 따라 단일 코드, 목록 또는 범위를 사용할 수 있습니다.

다음 단계에서는, 대상을 등록하지 않고 대상 그룹 생성을 완료합니다.

ECS 콘솔로 돌아가서 Fargate 시작 유형과 호환되는 새 태스크 정의를 생성합니다. 이름을 route-guide로 지정하고, 최소 리소스(0.5GB의 메모리와 0.25 CPU 단위)를 제공합니다. ECR에 업로드한 컨테이너 이미지의 이미지 URI 및 위 Dockerfile에 공개된 네트워크 포트인 컨테이너 포트 50051/tcp를 사용하여 컨테이너 정의를 추가합니다.

route-guide 태스크 정의를 선택하고 [작업(Actions)] 메뉴에서 [서비스 생성(Create Service)]을 선택합니다. Fargate 시작 유형, 서비스 이름으로 route-guide, 태스크 개수로 2를 사용합니다. 다음 단계에서는, 로드 밸런서가 태스크에 도달할 수 있도록 VPC에 2개의 서브넷을 추가하고 기본 보안 그룹을 선택합니다. [로드 밸런싱(Load balancing)] 섹션에서 Application Load Balancerroute-guide 로드 밸런서를 선택합니다.

[로드 밸런싱할 컨테이너(Container to load balance)]에서 route-guide:50051:50051을 선택하고 [로드 밸런서에 추가(Add to load balancer)]를 선택합니다.

그런 다음, route-guide 대상 그룹을 선택합니다.

다음 단계에서는, 이 데모에 대해 Auto Scaling을 사용하지 않도록 [원하는 서비스 개수를 조정하지 마십시오(Do not adjust the service’s desired count)]를 선택합니다.

ECS 서비스 생성을 완료합니다. 몇 분 후 두 개의 태스크 상태는 [실행 중(RUNNING)]입니다. route-guide 대상 그룹의 [대상(Targets)] 탭을 보면 2개 대상의 상태가 [정상(healthy)]으로 나옵니다. 이제 로드 밸런서는 트래픽을 수락할 수 있습니다.

Amazon Route 53 콘솔에서 로드 밸런서의 별칭으로 DNS A 레코드를 생성합니다. 사용하는 도메인은 로드 밸런서를 생성할 때 선택한 인증서의 도메인 이름과 일치합니다.

클라이언트 랩톱에서 로드 밸런서에 연결할 때 보안 채널을 사용하도록 gRPC 리포지토리에서 route_client.py 파일을 편집합니다. 다음은 변경하는 코드의 일부입니다.

    # create credentials
    credentials = grpc.ssl_channel_credentials()

    # create secure channel using credentials
    with grpc.secure_channel('<ALB-ALIAS-DOMAIN>:50051', credentials) as channel:
        stub = route_guide_pb2_grpc.RouteGuideStub(channel)
        print("-------------- GetFeature --------------")
        guide_get_feature(stub)
        print("-------------- ListFeatures --------------")
        guide_list_features(stub)
        print("-------------- RecordRoute --------------")
        guide_record_route(stub)
        print("-------------- RouteChat --------------")
        guide_route_chat(stub)

이제 클라이언트를 시작하여 일부 워크로드를 사용해 gRPC 채널을 테스트합니다. 출력에서 route_guide 애플리케이션은 요청 및 응답에서 단항, 서버 측 스트리밍, 클라이언트 측 스트리밍 및 양방향 스트리밍을 사용하고 있음을 알 수 있습니다.

$ python3 route_guide_client.py                
-------------- GetFeature --------------
Feature called Berkshire Valley Management Area Trail, Jefferson, NJ, USA at latitude: 409146138
longitude: -746188906

Found no feature at 
-------------- ListFeatures --------------
Looking for features between 40, -75 and 42, -73
Feature called Patriots Path, Mendham, NJ 07945, USA at latitude: 407838351
longitude: -746143763

Feature called 101 New Jersey 10, Whippany, NJ 07981, USA at latitude: 408122808
longitude: -743999179

Feature called U.S. 6, Shohola, PA 18458, USA at latitude: 413628156
longitude: -749015468

Feature called 5 Conners Road, Kingston, NY 12401, USA at latitude: 419999544
longitude: -740371136

Feature called Mid Hudson Psychiatric Center, New Hampton, NY 10958, USA at latitude: 414008389
longitude: -743951297

Feature called 287 Flugertown Road, Livingston Manor, NY 12758, USA at latitude: 419611318
longitude: -746524769

Feature called 4001 Tremley Point Road, Linden, NJ 07036, USA at latitude: 406109563
longitude: -742186778

Feature called 352 South Mountain Road, Wallkill, NY 12589, USA at latitude: 416802456
longitude: -742370183

Feature called Bailey Turn Road, Harriman, NY 10926, USA at latitude: 412950425
longitude: -741077389

Feature called 193-199 Wawayanda Road, Hewitt, NJ 07421, USA at latitude: 412144655
longitude: -743949739

Feature called 406-496 Ward Avenue, Pine Bush, NY 12566, USA at latitude: 415736605
longitude: -742847522

Feature called 162 Merrill Road, Highland Mills, NY 10930, USA at latitude: 413843930
longitude: -740501726

Feature called Clinton Road, West Milford, NJ 07480, USA at latitude: 410873075
longitude: -744459023

Feature called 16 Old Brook Lane, Warwick, NY 10990, USA at latitude: 412346009
longitude: -744026814

Feature called 3 Drake Lane, Pennington, NJ 08534, USA at latitude: 402948455
longitude: -747903913

Feature called 6324 8th Avenue, Brooklyn, NY 11220, USA at latitude: 406337092
longitude: -740122226

Feature called 1 Merck Access Road, Whitehouse Station, NJ 08889, USA at latitude: 406421967
longitude: -747727624

Feature called 78-98 Schalck Road, Narrowsburg, NY 12764, USA at latitude: 416318082
longitude: -749677716

Feature called 282 Lakeview Drive Road, Highland Lake, NY 12743, USA at latitude: 415301720
longitude: -748416257

Feature called 330 Evelyn Avenue, Hamilton Township, NJ 08619, USA at latitude: 402647019
longitude: -747071791

Feature called New York State Reference Route 987E, Southfields, NY 10975, USA at latitude: 412567807
longitude: -741058078

Feature called 103-271 Tempaloni Road, Ellenville, NY 12428, USA at latitude: 416855156
longitude: -744420597

Feature called 1300 Airport Road, North Brunswick Township, NJ 08902, USA at latitude: 404663628
longitude: -744820157

Feature called  at latitude: 407113723
longitude: -749746483

Feature called  at latitude: 402133926
longitude: -743613249

Feature called  at latitude: 400273442
longitude: -741220915

Feature called  at latitude: 411236786
longitude: -744070769

Feature called 211-225 Plains Road, Augusta, NJ 07822, USA at latitude: 411633782
longitude: -746784970

Feature called  at latitude: 415830701
longitude: -742952812

Feature called 165 Pedersen Ridge Road, Milford, PA 18337, USA at latitude: 413447164
longitude: -748712898

Feature called 100-122 Locktown Road, Frenchtown, NJ 08825, USA at latitude: 405047245
longitude: -749800722

Feature called  at latitude: 418858923
longitude: -746156790

Feature called 650-652 Willi Hill Road, Swan Lake, NY 12783, USA at latitude: 417951888
longitude: -748484944

Feature called 26 East 3rd Street, New Providence, NJ 07974, USA at latitude: 407033786
longitude: -743977337

Feature called  at latitude: 417548014
longitude: -740075041

Feature called  at latitude: 410395868
longitude: -744972325

Feature called  at latitude: 404615353
longitude: -745129803

Feature called 611 Lawrence Avenue, Westfield, NJ 07090, USA at latitude: 406589790
longitude: -743560121

Feature called 18 Lannis Avenue, New Windsor, NY 12553, USA at latitude: 414653148
longitude: -740477477

Feature called 82-104 Amherst Avenue, Colonia, NJ 07067, USA at latitude: 405957808
longitude: -743255336

Feature called 170 Seven Lakes Drive, Sloatsburg, NY 10974, USA at latitude: 411733589
longitude: -741648093

Feature called 1270 Lakes Road, Monroe, NY 10950, USA at latitude: 412676291
longitude: -742606606

Feature called 509-535 Alphano Road, Great Meadows, NJ 07838, USA at latitude: 409224445
longitude: -748286738

Feature called 652 Garden Street, Elizabeth, NJ 07202, USA at latitude: 406523420
longitude: -742135517

Feature called 349 Sea Spray Court, Neptune City, NJ 07753, USA at latitude: 401827388
longitude: -740294537

Feature called 13-17 Stanley Street, West Milford, NJ 07480, USA at latitude: 410564152
longitude: -743685054

Feature called 47 Industrial Avenue, Teterboro, NJ 07608, USA at latitude: 408472324
longitude: -740726046

Feature called 5 White Oak Lane, Stony Point, NY 10980, USA at latitude: 412452168
longitude: -740214052

Feature called Berkshire Valley Management Area Trail, Jefferson, NJ, USA at latitude: 409146138
longitude: -746188906

Feature called 1007 Jersey Avenue, New Brunswick, NJ 08901, USA at latitude: 404701380
longitude: -744781745

Feature called 6 East Emerald Isle Drive, Lake Hopatcong, NJ 07849, USA at latitude: 409642566
longitude: -746017679

Feature called 1358-1474 New Jersey 57, Port Murray, NJ 07865, USA at latitude: 408031728
longitude: -748645385

Feature called 367 Prospect Road, Chester, NY 10918, USA at latitude: 413700272
longitude: -742135189

Feature called 10 Simon Lake Drive, Atlantic Highlands, NJ 07716, USA at latitude: 404310607
longitude: -740282632

Feature called 11 Ward Street, Mount Arlington, NJ 07856, USA at latitude: 409319800
longitude: -746201391

Feature called 300-398 Jefferson Avenue, Elizabeth, NJ 07201, USA at latitude: 406685311
longitude: -742108603

Feature called 43 Dreher Road, Roscoe, NY 12776, USA at latitude: 419018117
longitude: -749142781

Feature called Swan Street, Pine Island, NY 10969, USA at latitude: 412856162
longitude: -745148837

Feature called 66 Pleasantview Avenue, Monticello, NY 12701, USA at latitude: 416560744
longitude: -746721964

Feature called  at latitude: 405314270
longitude: -749836354

Feature called  at latitude: 414219548
longitude: -743327440

Feature called 565 Winding Hills Road, Montgomery, NY 12549, USA at latitude: 415534177
longitude: -742900616

Feature called 231 Rocky Run Road, Glen Gardner, NJ 08826, USA at latitude: 406898530
longitude: -749127080

Feature called 100 Mount Pleasant Avenue, Newark, NJ 07104, USA at latitude: 407586880
longitude: -741670168

Feature called 517-521 Huntington Drive, Manchester Township, NJ 08759, USA at latitude: 400106455
longitude: -742870190

Feature called  at latitude: 400066188
longitude: -746793294

Feature called 40 Mountain Road, Napanoch, NY 12458, USA at latitude: 418803880
longitude: -744102673

Feature called  at latitude: 414204288
longitude: -747895140

Feature called  at latitude: 414777405
longitude: -740615601

Feature called 48 North Road, Forestburgh, NY 12777, USA at latitude: 415464475
longitude: -747175374

Feature called  at latitude: 404062378
longitude: -746376177

Feature called  at latitude: 405688272
longitude: -749285130

Feature called  at latitude: 400342070
longitude: -748788996

Feature called  at latitude: 401809022
longitude: -744157964

Feature called 9 Thompson Avenue, Leonardo, NJ 07737, USA at latitude: 404226644
longitude: -740517141

Feature called  at latitude: 410322033
longitude: -747871659

Feature called  at latitude: 407100674
longitude: -747742727

Feature called 213 Bush Road, Stone Ridge, NY 12484, USA at latitude: 418811433
longitude: -741718005

Feature called  at latitude: 415034302
longitude: -743850945

Feature called  at latitude: 411349992
longitude: -743694161

Feature called 1-17 Bergen Court, New Brunswick, NJ 08901, USA at latitude: 404839914
longitude: -744759616

Feature called 35 Oakland Valley Road, Cuddebackville, NY 12729, USA at latitude: 414638017
longitude: -745957854

Feature called  at latitude: 412127800
longitude: -740173578

Feature called  at latitude: 401263460
longitude: -747964303

Feature called  at latitude: 412843391
longitude: -749086026

Feature called  at latitude: 418512773
longitude: -743067823

Feature called 42-102 Main Street, Belford, NJ 07718, USA at latitude: 404318328
longitude: -740835638

Feature called  at latitude: 419020746
longitude: -741172328

Feature called  at latitude: 404080723
longitude: -746119569

Feature called  at latitude: 401012643
longitude: -744035134

Feature called  at latitude: 404306372
longitude: -741079661

Feature called  at latitude: 403966326
longitude: -748519297

Feature called  at latitude: 405002031
longitude: -748407866

Feature called  at latitude: 409532885
longitude: -742200683

Feature called  at latitude: 416851321
longitude: -742674555

Feature called 3387 Richmond Terrace, Staten Island, NY 10303, USA at latitude: 406411633
longitude: -741722051

Feature called 261 Van Sickle Road, Goshen, NY 10924, USA at latitude: 413069058
longitude: -744597778

Feature called  at latitude: 418465462
longitude: -746859398

Feature called  at latitude: 411733222
longitude: -744228360

Feature called 3 Hasta Way, Newton, NJ 07860, USA at latitude: 410248224
longitude: -747127767

-------------- RecordRoute --------------
Visiting point latitude: 400066188
longitude: -746793294

Visiting point latitude: 412452168
longitude: -740214052

Visiting point latitude: 401827388
longitude: -740294537

Visiting point latitude: 414777405
longitude: -740615601

Visiting point latitude: 409642566
longitude: -746017679

Visiting point latitude: 406685311
longitude: -742108603

Visiting point latitude: 406523420
longitude: -742135517

Visiting point latitude: 405047245
longitude: -749800722

Visiting point latitude: 418858923
longitude: -746156790

Visiting point latitude: 409532885
longitude: -742200683

Finished trip with 10 points 
Passed 10 features 
Travelled 863981 meters 
It took 0 seconds 
-------------- RouteChat --------------
Sending First message at 
Sending Second message at longitude: 1

Sending Third message at latitude: 1

Sending Fourth message at 
Sending Fifth message at latitude: 1

Received message First message at 
Received message Third message at latitude: 1

출력이 꽤 길지만, 이 게시물의 시작 부분에서 말했듯이, route-guide 데모는 기본 RPC 호출을 뛰어넘어, gRPC를 사용하여 클라이언트와 서버가 상호 작용하는 수많은 여러 방식을 보여줍니다.

정식 출시
현재 모든 리전에서 신규 및 기존 Application Load Balancer에 대해 엔드 투 엔드 HTTP/2 및 gRPC 지원이 제공됩니다. 이 기능은 콘솔, AWS 명령줄 인터페이스(CLI), AWS SDK를 통해 사용할 수 있습니다. AWS CloudFormation 지원도 곧 추가할 계획입니다.

ALB에서 gRPC 프로토콜을 사용하는 데 추가 비용은 들지 않습니다. 자세한 내용은 Elastic Load Balancing 요금 페이지를 참조하십시오.

이 새로운 기능을 통해 gRPC를 사용하여 보다 쉽게 애플리케이션을 통합하거나 클라이언트/서버 통신을 개선할 수 있습니다. 자세히 알아보려면 설명서를 참조하십시오.

Danilo