.NET Core アプリを Cloud Run にデプロイする
.NET Core の gRPC とか C# の Firestore クライアントを触る - kitak blog で書いたアプリを Cloud Run にデプロイしてみた。
Docker を使用してアプリをコンテナー化するチュートリアル - .NET Core | Microsoft Docs と https://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.cs
の CreateWebHostBuilder
の定義を以下のように書き換える。ポートを環境変数で指定できるようにするのと、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 のコンソールから行う。