gRPCアプリケーションをContainer Appsにデプロイしたい

このエントリは2025/01/22現在の情報に基づいています。将来の機能追加や変更に伴い、記載事項からの乖離が発生する可能性があります。

問い合わせ

お初の人から、タイトルのまんまの問い合わせが届いた。

gRPCのアプリケーションを作っており、Azure Container Appsにデプロイしたいのだが、どうすればいいか?Container AppsよりApp ServiceやContainer Instanceのほうがよかったり(楽だったり)するのか?ベストプラクティスがあれば教えてほしい。

「ベストプラクティスは所定の条件下でのものやで」と伝えつつ(釘を刺しつつ)、「まずは公式ドキュメントを読んでみてはいかが?」と、ドキュメントを紹介しておいた(再度釘を刺しておいた)。

App Service で gRPC を構成する / Configure gRPC on App Service
https://learn.microsoft.com/azure/app-service/configure-grpc

サポートからも素敵な記事が出ているので、補足情報も渡しておいた。

Azure Container Apps で gRPC を動作させる / Running gRPC with Container Apps
https://azureossd.github.io/2022/07/07/Running-gRPC-with-Container-Apps/index.html
https://azure.github.io/jpazpaas/2023/12/27/Running-gRPC-with-Container-Apps.html

ついでに以下のエントリも(たまたまMicronautユーザーだったこともある)。

でも「たぶんこれで終わらんやろ」と思ったので、ちょっと調べたもの、注意が必要なことをメモとして残しておく。以下はContainer Appsにデプロイする場合の注意点。

Containerの作成

特別なことは必要ない。ふつうにアプリケーションを作成すればいい。

Server reflection

上記のサポートチームのエントリにもある通りで、アプリケーションとして明示的にreflectionを有効にする必要がある(もちろんprotoファイルを共有することでもアクセス先の情報は入手できるが、利用者が多い場合現実的ではない)。Container Appsが自動的にreflectionしてくれるわけではない。もしMicronautを使っている場合には、前述のエントリに記載した方法でreflectionを構成する。

Azure Container AppsにデプロイしたgRPCサーバーアプリケーションをgrpcurlで呼びだしてみると以下のような感じ。”MicronautでgRPC”にて作成したアプリケーションに対して実行したもの。

 $ grpcurl <ACAのFQDN>:443 list
CatApi.CatService
grpc.health.v1.Health

$ grpcurl <ACAのFQDN>:443 describe
CatApi.CatService is a service:
service CatService {
  rpc GetCat ( .CatApi.CatRequest ) returns ( .CatApi.Cat );
}
grpc.health.v1.Health is a service:
service Health {
  rpc Check ( .grpc.health.v1.HealthCheckRequest ) returns ( .grpc.health.v1.HealthCheckResponse );
  rpc Watch ( .grpc.health.v1.HealthCheckRequest ) returns ( stream .grpc.health.v1.HealthCheckResponse );
}
grpc.reflection.v1.ServerReflection is a service:
service ServerReflection {
  rpc ServerReflectionInfo ( stream .grpc.reflection.v1.ServerReflectionRequest ) returns ( stream .grpc.reflection.v1.ServerReflectionResponse );
}

$ grpcurl <ACAのFQDN>:443 list CatApi.CatService
CatApi.CatService.GetCat

$ grpcurl <ACAのFQDN>:443 describe CatApi.CatService.GetCat
CatApi.CatService.GetCat is a method:
rpc GetCat ( .CatApi.CatRequest ) returns ( .CatApi.Cat );

$ grpcurl <ACAのFQDN>:443 describe CatApi.CatRequest
CatApi.CatRequest is a message:
message CatRequest {
  string chip_id = 1;
}

$ grpcurl <ACAのFQDN>:443 describe CatApi.Cat
CatApi.Cat is a message:
message Cat {
  string name = 1;
  int32 age = 2;
}

Container Apps (ACA)のProvisioning

前述のサポートチームのエントリでは、プロビジョニング時にAzure PortalからHTTP/2を使ったIngressを定義できず、後でAzure CLIなどを使って変更するようにガイドされているが、2025/01/22現在、Portalでのプロビジョニング時に指定できるようになっている。

設定変更もPortalから可能。

名前解決

同一Container Apps環境にデプロイしている場合、Container Apps名で名前解決できるが、この場合はHTTPでの通信である点に注意が必要。

名前でコンテナー アプリを呼び出す / Call a container app by name
https://learn.microsoft.com/azure/container-apps/connect-apps?tabs=bash#call-a-container-app-by-name

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください