このエントリは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