電通総研 テックブログ

電通総研が運営する技術ブログ

gRPCとApplication LoadBalancerを組み合わせて利用する方法

こんにちは。X(クロス)イノベーション本部 ソフトウェアデザインセンター の山下です。 今回は、Amazon Web Services(AWS)のApplication LoadBalancer(ALB)とgRPCを合わせて利用する場合の方法について紹介します。

ALBでgRPCのサポートされて利用できる場所が広がりつつあります。
https://aws.amazon.com/jp/blogs/aws/new-application-load-balancer-support-for-end-to-end-http-2-and-grpc/
今回は、このALBとgRPCを組み合わせて利用する場合の設定方法とその注意点について紹介します。

ターゲットグループの作成時に注意が必要

gRPCは基本的に通常のHTTPS通信です。このためALB自体は普段通りの設定で作成して問題ありません。gRPCを利用する場合はターゲットグループを作成するときに、以下のようにProtocolにはHTTPSを指定し、Protocol Versionの設定をgRPCに変更することで利用できます。

ヘルスチェック用のサービスを実装しておく

ヘルスチェックの項目では、gRPCのサービスを呼びだす設定が必要です。このため、実際にALBを利用することを想定する場合は、アプリケーション側でヘルスチェック用のサービスを実装する必要があります。

gRPCのKeepAlive機能が利用できない

gRPCには通信を途絶させないためのKeepAliveの機能が実装されています。しかし、ALBはこのパケットが到達しても後続のサービスにはそれを渡さない実装となっているようです。このため、gRPCの機能のkeepAlive機能を設定しても通信が切断されてしまいます。

この問題は、Unary RPCのように短時間で終了するサービスであれば問題にならないことが多いです。しかしBidirecional Streaming RPCのようにコネクションを保ったまま通信を行う場合に通信の途中で切断される場合があります。このため、プログラム側でサーバ向けに定期的にパケットを送り続けるような工夫を行う必要があります。

パスによるアクセス制限などの方法は問題なく利用できます

gRPCは通常のHTTP/2のプロトコルを利用しており、通常のHTTPで実施するアクセス先(path)による制限などを実施できます。 /<package名>.<Service名>/<rpc名> といったpathを指定することで特定のRPCだけアクセスを拒否できます。 以下の図のように設定することで、/foo.Bar/Baz というRPCだけ503エラーを返すように設定できます。 認証などの設定も同様に行うことが可能です。

まとめ

今回は、AWSのALBとgRPCを組み合わせる際に注意が必要になる点についてまとめました。ただし、keepAliveが利用できなかったり、ヘルスチェック専用のサービスが必要となるなど、いくつか注意点がありますが問題なく利用できました。 これからは、積極的にgRPCを活用していきたいですね。


私たちは同じチームで働いてくれる仲間を探しています。今回のエントリで紹介したような仕事に興味のある方、ご応募お待ちしています。

執筆:@yamashita.tsuyoshi、レビュー:@higaShodoで執筆されました