DEV Community

Felipe Marques
Felipe Marques

Posted on

4 1 1

Como publicar uma API REST .Net 5 no Google Cloud Run usando Github e Google Cloud Build

Crie um novo projeto ASP.NET Core Web API

Image description

Nomeie o projeto e coloque-o dentro da pasta raiz do repositório do Github.

Image description

Selecione a versão do .net.

Aqui vale uma observação, a versão que você usar do .net vai influenciar como o arquivo dockerfile deverá ser configurado, se quiser escolher outra versão, fique à vontade, mas será necessário adaptar o dockerfile.

Image description

Selecione a opção webapi para execução.

Image description

Execute o projeto, faça um GET no /weatherforecast apenas para validar que está tudo funcionando.

Image description

Vamos às adaptações necessárias no Program.cs

Program.cs

Faça as alterações necessárias no seu Program.cs para ficar como o do código abaixo:

using System;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;

namespace webapi
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args)
        {
            var port = Environment.GetEnvironmentVariable("PORT") ?? "8080";
            var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Development";

            if (environment == "Development")
            {
                return Host.CreateDefaultBuilder(args)
                    .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
            }
            else
            {
                var url = new[]
                {
                    string.Concat("http://0.0.0.0:", port)
                };
                return Host.CreateDefaultBuilder(args)
                    .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>().UseUrls(url); });
            }
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

No código é importante notar o bloco do else, nele estamos dizendo que quando o ambiente não for "Development" a aplicação deverá subir usando o IP 0.0.0.0, isso é necessário para que a aplicação fique visível fora do container quando publicarmos no Cloud Run.

Dockerfile

Crie o Dockerfile na raiz do repositório. Verifique se o seu projeto também está na raiz do repositório, se não tiver, mude para a raiz.

Image description

Preencha seu dockerfile com o código abaixo:

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build-env
WORKDIR /app

COPY . ./
RUN dotnet publish -c Release -o out

FROM mcr.microsoft.com/dotnet/aspnet:5.0
WORKDIR /app
COPY --from=build-env /app/out .

ENV ASPNETCORE_ENVIRONMENT Production

ENTRYPOINT ["dotnet", "webapi.dll"]
Enter fullscreen mode Exit fullscreen mode

Importante alterar a última linha, o nome do arquivo .dll deve ser exatamente igual à DLL principal do seu projeto.
Se seu projeto tiver uma estrutura de pastas diferente do meu, talvez precise alterar outros pontos do dockerfile.

Salve tudo e faça commit.

Cloud Run no GCP

Se desejar, crie um projeto novo.

Image description

Pesquise por cloud run na barra de pesquisa no meio da barra do topo. Abra o produto Cloud Run. Crie um novo serviço.

Image description

Se você criou um projeto novo ou é a primeira vez que está usando o Cloud Build, talvez precise ativar o Cloud Build API.

Image description

Selecione Continuously deploy new revisions from a source repository e clique em Setup With Cluod Build

Image description

Importante: eu já tinha minha conta do Github conectada ao GCP, portanto, não consegui tirar prints dessa etapa, mas se for a primeira vez sua, você terá que vincular a sua conta do Github com o GCP.

Selecione o projeto que você quer publicar.

Image description

Avance para segunda etapa e marque a opção Dockerfile. No campo Branch deixe o valor padrão ^main$ para que o Cloud Build seja acionado apenas quando houver commit na branch main do seu repositório, se quiser outra branch, fique à vontade.

Image description

Preencha o Service name, eu deixei o valor padrão. Escolha uma região, para exemplo deixei a padrão.

Na opção de Autoscaling deixei a quantidade mínima de instâncias como zero, isso aumenta o tempo de resposta a um request, mas reduz custos, que no meu caso é mais importante. Se você quiser reduzir o tempo de resposta da sua aplicação deixe pelo menos 1 no mínimo e faça ajustes de acordo com a sua volumetria.

Assim como o mínimo, deixei o máximo em 1 instância, porque novamente o mais importante para mim não é performance e sim custo. Se quiser melhorar a performance avalie aumentar o limite máximo de instâncias, mas lembre-se que isso gerará custos.

Image description

Por último, é preciso selecionar as configurações de Ingress e Authentication, para fins educativos deixei aberto para Allow all traffic e Allow unauthenticated invocations. Para aplicações em produção considere buscar mais informações para restringir o tráfego e as requisições sem autenticação.

Image description

Opcional: Abra o menu Container, Connections, Security e faça ajustes no seu container em relação à memória, timeout, requests máximos por container.

Para o deploy automático essas configurações são irrelevantes e você poderá alterá-las no futuro.

Crie seu serviço e aguarde.

Image description

Quando estiver concluído se tudo deu certo ficará como o da imagem abaixo.

Image description

O quadro em destaque na imagem acima é a URL pública gerada pelo GCP, com ela é possível acessar nossa API no endpoint /weatherforecast.

URL: https://democsharpgcpcloudrun-lwy2plkqfa-uc.a.run.app/weatherforecast

Image description

Conclusão

A partir de agora todo novo commit na main do seu repositório Github será publicado no Cloud Run

O Cloud Run tem um recurso chamado Revisões, com ele é possível fazer rollback caso uma nova versão quebre algum aspecto da sua API.

Além de permitir que você gerencie o tráfego entre duas ou mais versões, podendo fazer deploy canário. Infelizmente, até o momento não consegui configurar um deploy canário automático, se você souber como faz, coloca nos comentário, por favor.

Obrigado por ter ficado até o fim.

AWS Security LIVE!

Join us for AWS Security LIVE!

Discover the future of cloud security. Tune in live for trends, tips, and solutions from AWS and AWS Partners.

Learn More

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay