.NET Core アプリを Cloud Run にデプロイする

.NET Core の gRPC とか C# の Firestore クライアントを触る - kitak blog で書いたアプリを Cloud Run にデプロイしてみた。

Docker を使用してアプリをコンテナー化するチュートリアル - .NET Core | Microsoft Docshttps://cloud.google.com/run/docs/quickstarts/build-and-deploy?hl=ja を参考に進めた。

Dockerfile は、こんなかんじ。

# Use Microsoft's official lightweight build .NET image.
# https://hub.docker.com/_/microsoft-dotnet-core-sdk/
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
WORKDIR /app

# Install production dependencies.
# Copy csproj and restore as distinct layers.
COPY *.csproj ./
RUN dotnet restore

# Copy local code to the container image.
COPY . ./
WORKDIR /app

# Build a release artifact.
RUN dotnet publish -c Release -o out

# Use Microsoft's official runtime .NET image.
# https://hub.docker.com/_/microsoft-dotnet-core-aspnet/
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS runtime
WORKDIR /app
COPY --from=build /app/out ./
ENV ASPNETCORE_ENVIRONMENT Production
ENV PORT 8080

# Run the web service on container startup.
ENTRYPOINT ["dotnet", "GrpcGreeter.dll"]

Cloud Run にデプロイするにあたって、Program.csCreateWebHostBuilder の定義を以下のように書き換える。ポートを環境変数で指定できるようにするのと、IPアドレス0.0.0.0 にする。

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                string port = Environment.GetEnvironmentVariable("PORT") ?? "8080";
                webBuilder.ConfigureKestrel(options =>
                {
                    // Setup a HTTP/2 endpoint without TLS.
                    options.Listen(IPAddress.Any, int.Parse(port), o => o.Protocols = 
                            HttpProtocols.Http2);
                });
                webBuilder.UseStartup<Startup>();
            });
    }

イメージのビルド&デプロイはドキュメントの通りで、

gcloud builds submit --tag gcr.io/[PROJECT-ID]/greeter

gcloud beta run deploy --image gcr.io/[PROJECT-ID]/greeter

で、とっても簡単。

ちょっと前まで Windows だけでしか動かなかったサービスが Googleクラウドで動くのだから、すごい時代(コンテナ・ Docker が普及したのが大きそう)。

デプロイしたサービスのシャットダウンは GCP のコンソールから行う。