🎃

gRPC + ASP.NETCore + Azure 構成でPOSTMANから接続する

2022/12/30に公開

経緯と背景

バックエンドのレスポンス速度改善の取り組みとして、下記の調査していました。

  • 非同期処理
  • SQLチューニング
  • Oracle共有サーバーモード(ディスパッチャ)
  • レスポンスデータのBrotli圧縮
  • Http/2、Http/3
  • gPRC(今回の内容)

タイトルにある gRPC + ASP.NET Core + Azure構成でPOSTMANから接続するといったような日本語記事が見つからなかったので、おそらくまだ実務に取り入れているケースが多くないと思い、同じようなことで調査されている誰かの助けになることを願い、書き留めることにしました。

目的

gRPC + ASP.NETCore + AzureAppService 構成でPOSTMANから接続する。

つまずいたこと

  • AzureAppServiceの設定変更が必要
    • HTTPバージョンを1.1→2.0に変更
    • HTTP 2.0 プロキシをオンにする
    • アプリケーション設定にHTTP20_ONLY_PORTを追加する
  • ASP.NETCoreの情報が少ないし紛らわしい。
    • gRPCチュートリアルに関する情報がバージョン:3.1、6、7で微妙に違う
    • どのポートを指定して接続していいのかわからない(ローカルとAzureで違う)
  • POSTMAN
    • .protoファイルどうやって使うかわからない
    • TLSの有効・無効の適切な設定がわかない

解決方法

AzureAppServiceとASP.NETCore周りのことは、こちらのドキュメントを読んで解決しました。
https://github.com/Azure/app-service-linux-docs/tree/master/HowTo/gRPC/.NET/.NET 7

POSTMANに関しては、手探りだったのでポイントだけ記載します。

  • .protoファイルはインポートし、POSTMANのAPIsに保持され、編集もできる
  • ローカル接続時はDisablTLSで接続し、Azure接続時はEnable TLSで接続する

手順

1.チュートリアルのプロジェクトをローカルに持ってくる。

ズバリこちらです。バージョンは.NET7です。
https://github.com/Azure/app-service-linux-docs/tree/master/HowTo/gRPC/.NET/.NET 7/Server/GrpcService

2.ローカルで接続

Program.csの変更
なにか他にいい方法があるのかもしれませんが、ローカルとAzureの双方で動作させるためには、この記述が必要でした。(9〜18行目)

launchSetting.jsonの変更
applicationUrlのPortを5243に変更する。

POSTMANに.protoファイルをインポート
チュートリアルの中にある\Protos\greet.protoをインポートします。

localhostで起動後、POSTMANで接続します。ここでのポイントは、TLSを無効にしておくことです。

3.Azureへのデプロイと設定

CIの設定
記事の趣旨とは直接関係ないので、無視していただいて構いません。AzureAppService側からテンプレート通りのCIを作成しました。ビルド周りはこんな感じで素のままです。

AzureAppServiceの設定

  • 構成>アプリケーション設定>HTTP20_ONLY_PORTを追加
    • 値:5243
  • 構成>全般設定
    • バージョン:.NET7
    • HTTPバージョン:2.0
    • HTTP2.0プロキシ:オン

4.POSTMANで応答確認

今後

1.バックエンド
現在使用しているREST APIとgRPCが同じインスタンス上に同居できるのかどうか試してみます。以前に一度、AzureAppServiceのHTTP 2.0 プロキシをオンにした際に、REST APIが止まってしまったことがあったのでおそらく難しいかと推測されます。しかし、gRPCのために別インスタンスを設けるコストがもったいないし、管理も煩雑になりそうなので、何かしらの方法で実現できればいいなと思って調査するつもりです。

2.フロントエンド
Angular + gRPC-Web/connect-webの接続を調査します。最終これが実現できないと社内の製品に取り入れられないので。

Discussion