🐱

gRPCサーバーをAzure Container Appsで動作させる方法まとめ

2022/10/10に公開

背景

App Service で gRPC サーバーを動かそうと思ったら想像と違ったので Azure Container Apps で動かしてみた。

必要なもの

  • Azure CLI
  • Container Apps 拡張
  • デプロイするコンテナイメージ

Container Apps 拡張は以下のコマンドでインストール

az extension add --name containerapp --upgrade

Azure Container Registry の作成

下記コマンドで Azure Container Registry を作成する。

az acr create -n <acr-name> -g <resource-group> --sku Basic

Azure Container Registry へイメージをプッシュ

今回は適当に作成した Python 製の gRPC サーバーを利用した。

app.py

import grpc
import proto.greet_pb2 as greet_pb2
import proto.greet_pb2_grpc as greet_pb2_grpc
from concurrent import futures


class GreetServiceServicer(greet_pb2_grpc.GreetServiceServicer):
    def __init__(self):
        pass

    def Greet(self, request, context):
        return greet_pb2.GreetResponse(
            "Hello, World!"
        )


def main():
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    greet_pb2_grpc.add_GreetServiceServicer_to_server(
        GreetServiceServicer(), server)
    p = server.add_insecure_port('0.0.0.0:8282')
    server.start()
    server.wait_for_termination()


if __name__ == "__main__":
    main()

Dockerfile

FROM python:3.10
ADD . /tmp/grpc-app
WORKDIR /tmp/grpc-app
RUN pip install -r requirements.txt
EXPOSE 8282
CMD ["python", "app.py"]

上記 Dockerfile を作成しイメージをビルド

Azure Container Apps が ARM イメージに対応していないので Apple シリコンの Mac など ARM 版の Docker を利用している場合、--platform linux/amd64 を引数に追加すること

docker build <path to dockerfile> \
        -t <acr-name>.acr.io/<name>:<tag> \
        --platform linux/amd64

Azure Container Registry へイメージのプッシュ

  1. Azure Container Registry へログインする。

    az acr login --name <acr-name>
    
  2. 作成したイメージをプッシュ

    docker push <acr-name>.acr.io/<name>:<tag>
    

Azure Container Apps の作成

  1. Container App Environment の作成

    az containerapp env create --name <env-name> -g <resource-group> --location japaneast
    
  2. Container App の作成

     az containerapp create --name <name> \
                         --environment <env-name> \
                         -g <resource-group> \
                         --image <image> \
                         --target-port 8282 \
                         --ingress 'external' \
                         --transport http2 \
                         --query configuration.ingress.fqdn \
                         --registry-server <registry-server> \
                         --registry-username <registry-username> \
                         --registry-password <registry-password>
    

作成された Container App の URL に対し gRPC クライアントからリクエストを投げると応答が返ってくる。

クライアントから接続する際、URL は "https://"を除いた"<uniquename>.azurecontainerapps.io"のみで指定する。

補足

  • Azure Portal から transport http2 などを設定しようと思ったが現状できなかった。
  • App Service と違い Container Apps であれば gRPC サーバー単体での起動が可能。
GitHubで編集を提案

Discussion