Amazon Web Services ブログ

新規 – エンドツーエンドの HTTP/2 および gRPC についての Application Load Balancer のサポート

その効率性と多数のプログラミング言語をサポートしていることから、gRPCマイクロサービス統合およびクライアント/サーバー通信に人気のある選択肢となっています。gRPC は、HTTP/2 をトランスポートに使用し、インターフェイスを記述するためにプロトコルバッファを使用する、高性能なリモートプロシージャコール (RPC) のフレームワークです。

アプリケーションで gRPC を使用しやすくするために、Application Load Balancer (ALB) は HTTP/2 エンドツーエンドのサポートを開始しました。これにより、単一のロードバランサーを介して gRPC サービスを非 gRPC サービスとともに公開できるようになりました。Amazon Elastic Compute Cloud (EC2) インスタンスまたは IP アドレス (AWS Fargate など) を gRPC ターゲットとして使用し、ターゲットグループの gRPC ヘルスチェックをサポートできます。この方法により、ALB を使用して、マイクロサービス間、または gRPC 対応クライアントとサービス間の gRPC トラフィックの終了、ルーティング、およびロードバランシングを行うことができます。

ALB は、gRPC 呼び出しを検査し、適切なサービスにそれらをルーティングするためのリッチコンテンツベースのルーティング機能を提供します。具体的には、ALB は、gRPC ステータスコード、gRPC リクエスト数のメトリクス、gRPC リクエストを区別するアクセスログ、および gRPC 固有の応答ヘッダーを調べることができるヘルスチェックを提供します。さらに、持続性、さまざまなロードバランシングアルゴリズム、TLS 終了などのネイティブ機能を利用できます。

Application Load Balancer で gRPC を使用する方法
この新機能をテストするために、まず gRPC サーバーアプリケーションを準備します。私は Python プログラミング言語と grpc リポジトリに含まれている route_guide のデモを使用しています。このアプリケーションは、クライアントとサーバーが 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 コンソールで、[Networking only] (ネットワークのみ) のテンプレートを使用して新しいクラスターを作成します。クラスターに 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 には、同じセキュリティグループを使用する他のリソースへのネットワークアクセスを許可するデフォルトのセキュリティグループが自動的に付属しています。

ルーティングセクションでは、route-guide という名前の新しいターゲットグループを作成します。AWS Fargate を使用して gRPC サーバーを実行する予定なので、IP アドレスのターゲットタイプを選択します。ALB は、gRPC プロトコルを使用するターゲットグループのセキュア接続と非セキュア接続の両方をサポートします。ここでは、ポート 50051 で HTTP を使用します (ロードバランサーと gRPC サーバーを実行しているコンテナの間で非セキュア接続を使用しているため)。次に、ECS クラスターで使用する VPC を選択します。[Protocol Version] (プロトコルバージョン) については、私は gRPC を使用します。

[Advanced health check settings] (詳細ヘルスチェック設定) では、正しい応答を確認するときに使用する gRPC の [Success codes] (成功コード) を指定できます。未実装を意味するデフォルトの 12 のままにします。

メソッドが見つからない場合、gRPC サーバーによってコード 12 が返されます。このケースでは、route_guide アプリケーションによって実装されていないパスを使用しているため、機能します。より一般的には、コード 12 のチェックは、gRPC サーバーが正しく動作していることを迅速に確認するための方法です。ヘルスチェックをより詳細なものとするために、実装に対する期待事項に照らして、単一のコード、リスト、または範囲を使用できます。

次のステップでは、ターゲットを登録しないで、ターゲットグループの作成を完了します。

ECS コンソールに戻って、Fargate 起動タイプと互換性のある新しいタスク定義を作成します。それを route-guide と名付け、最小限のリソース (0.5 GB のメモリと 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 balance] (バランスを取るコンテナ) については、[route-guide:50051:50051] と [Add to load balancer] (ロードバランサーに追加) を選択します。

次に、route-guide ターゲットグループを選択します。

次のステップで、このデモに Auto Scaling を使用しないように、[Do not adjust the service’s desired count] (サービスの希望数を調整しない) を選択します。

ECS サービスの作成が完了しました。数分後、2 つのタスクが RUNNING になっています。route-guide ターゲットグループの [Targets] (ターゲット) タブを見ると、2 つのターゲットは正常であることがわかります。これで、ロードバランサーはトラフィックを受け入れる準備ができました。

Amazon Route 53 コンソールで、ロードバランサーのエイリアスとして DNS A レコードを作成します。使用するドメインは、ロードバランサーの作成時に選択した証明書のドメイン名と一致しています。

私のクライアントのノートパソコンでは、ロードバランサーに接続するときに安全なチャネルを使用するように、gRPC リポジトリroute_client.py ファイルを編集します。これは私が変更するコードの一部です。

    # 認証情報を作成します
    credentials = grpc.ssl_channel_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 Balancers について、エンドツーエンドの HTTP/2 および gRPC サポートをご利用いただけます。この機能は、コンソール、AWS コマンドラインインターフェイス (CLI)AWS SDK から使用できます。当社では、AWS CloudFormation サポートを近日中に追加するために尽力しています。

ALB で gRPC プロトコルを使用するための追加コストはありません。詳細については、Elastic Load Balancing の料金ページを参照してください。

これらの新機能により、gRPC を使用してアプリケーションを統合したり、クライアント/サーバー間の通信を改善したりする方がはるかに簡単です。詳細については、ドキュメントをご参照ください

Danilo