🐱
gRPCサーバーをAzure Container Appsで動作させる方法まとめ
背景
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 へイメージのプッシュ
-
Azure Container Registry へログインする。
az acr login --name <acr-name>
-
作成したイメージをプッシュ
docker push <acr-name>.acr.io/<name>:<tag>
Azure Container Apps の作成
-
Container App Environment の作成
az containerapp env create --name <env-name> -g <resource-group> --location japaneast
-
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 サーバー単体での起動が可能。
Discussion