1. Introdução
As funções do Google Cloud Run são uma plataforma de computação sem servidor orientada por eventos. Com as funções do Cloud Run, você escreve seu código sem se preocupar com o provisionamento de recursos ou o escalonamento para lidar com requisitos variáveis.
Há dois tipos de funções do Cloud Run:
- As funções HTTP respondem a solicitações HTTP.
- As funções de evento são acionadas por eventos, como a publicação de uma mensagem no Cloud Pub/Sub ou o upload de um arquivo no Cloud Storage.

Neste codelab, você vai aprender a criar suas próprias funções do Cloud Run em C#. Mais especificamente, você vai implantar funções C# que respondem a HTTP e CloudEvents de várias fontes do Google Cloud.
O que você vai aprender
- Functions Framework para .NET.
- Como escrever uma função HTTP.
- Como escrever uma função acionada por eventos que responde a eventos do Cloud Storage.
- Como escrever uma função acionada por eventos que responde a eventos do Cloud Pub/Sub.
- Como escrever uma função acionada por evento que responda a qualquer tipo de evento.
2. Configuração e requisitos
Configuração de ambiente autoguiada
- Faça login no Console do Google Cloud e crie um novo projeto ou reutilize um existente. Crie uma conta do Gmail ou do Google Workspace, se ainda não tiver uma.



- O Nome do projeto é o nome de exibição para os participantes do projeto. É uma string de caracteres não usada pelas APIs do Google É possível atualizar o local a qualquer momento.
- O ID do projeto precisa ser exclusivo em todos os projetos do Google Cloud e não pode ser alterado após a definição. O console do Cloud gera automaticamente uma string exclusiva. Em geral, não importa o que seja. Na maioria dos codelabs, é necessário fazer referência ao ID do projeto, normalmente identificado como
PROJECT_ID. Se você não gostar do ID gerado, crie outro aleatório. Se preferir, teste o seu e confira se ele está disponível. Ele não pode ser mudado após essa etapa e permanece durante o projeto. - Para sua informação, há um terceiro valor, um Número do projeto, que algumas APIs usam. Saiba mais sobre esses três valores na documentação.
- Em seguida, ative o faturamento no console do Cloud para usar os recursos/APIs do Cloud. A execução deste codelab não será muito cara, se tiver algum custo. Para encerrar os recursos e evitar cobranças além deste tutorial, exclua os recursos criados ou o projeto inteiro. Novos usuários do Google Cloud estão qualificados para o programa de US$ 300 de avaliação sem custos.
Inicie o Cloud Shell
Embora o Google Cloud e o Spanner possam ser operados remotamente do seu laptop, neste codelab usaremos o Google Cloud Shell, um ambiente de linha de comando executado no Cloud.
No Console do Google Cloud, clique no ícone do Cloud Shell na barra de ferramentas superior à direita:

O provisionamento e a conexão com o ambiente levarão apenas alguns instantes para serem concluídos: Quando o processamento for concluído, você verá algo como:

Essa máquina virtual contém todas as ferramentas de desenvolvimento necessárias. Ela oferece um diretório principal persistente de 5 GB, além de ser executada no Google Cloud. Isso aprimora o desempenho e a autenticação da rede. Neste codelab, todo o trabalho pode ser feito com um navegador. Você não precisa instalar nada.
3. Antes de começar
No Cloud Shell, execute o comando a seguir para ativar os serviços necessários:
gcloud services enable \ artifactregistry.googleapis.com \ cloudbuild.googleapis.com \ cloudfunctions.googleapis.com \ eventarc.googleapis.com \ run.googleapis.com
Em seguida, defina sua região.
REGION=<YOUR_REGION>
Neste codelab, você vai criar uma conta de serviço com as permissões necessárias do EventArc e o papel de invocador do Cloud Run para receber um evento do Cloud Storage e invocar a função do Cloud Run.
Primeiro, crie a conta de serviço.
PROJECT_ID=$(gcloud config get-value core/project) PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)') SERVICE_ACCOUNT="cloud-run-functions" SERVICE_ACCOUNT_ADDRESS=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com gcloud iam service-accounts create $SERVICE_ACCOUNT \ --display-name="Cloud Run functions Eventarc service account"
Em seguida, conceda o papel de receptor de eventos do Eventarc (roles/eventarc.eventReceiver) no projeto à conta de serviço associada ao gatilho do Eventarc para que ele possa receber eventos de provedores de eventos.
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \ --role=roles/eventarc.eventReceiver
Em seguida, conceda à conta de serviço o papel de invocador do Cloud Run para que ela possa invocar a função.
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \ --role=roles/run.invoker
4. Functions Framework para .NET
O Functions Framework para .NET é um framework FaaS (função como serviço) de código aberto para escrever funções .NET portáteis, desenvolvido pela equipe do Google Cloud Functions.
O Functions Framework permite gravar funções leves executadas em diferentes ambientes, inclusive:
- Funções do Cloud Run
- Sua máquina de desenvolvimento local
- Cloud Run e Cloud Run no GKE
- Ambientes baseados no Knative
Neste codelab, você vai usar o Functions Framework para .NET e os modelos dele para criar e implantar o Cloud Functions em C#.
No Cloud Shell, execute o comando a seguir para instalar os modelos do Cloud Functions para dotnet:
dotnet new install Google.Cloud.Functions.Templates
Isso instala três modelos para dotnet. Cada modelo está disponível em C#, F# e VB, mas você só vai usar C# neste laboratório. Para verificar se os modelos estão instalados, execute:
dotnet new list Templates Short Name ----------------------------------------------------------------------- Google Cloud Functions CloudEvent Function gcf-event Google Cloud Functions CloudEvent Function (Untyped) gcf-untyped-event Google Cloud Functions HttpFunction gcf-http
5. Função HTTP
Você vai criar e implantar uma função HTTP que responde a solicitações HTTP.
Crie uma função HTTP usando o modelo gcf-http:
mkdir HelloHttp cd HelloHttp dotnet new gcf-http
Isso cria um projeto e um arquivo Function.cs que responde a solicitações HTTP.
Mude o framework de destino para net8.0 no arquivo .csproj:
<TargetFramework>net8.0</TargetFramework>
Para implantar uma função do Cloud Run diretamente no Cloud Run, execute o seguinte comando:
gcloud beta run deploy hello-http-function \
--source . \
--function HelloHttp.Function \
--base-image dotnet8 \
--region $REGION \
--allow-unauthenticated
Se preferir implantar como um Cloud Functions (2ª geração), use o seguinte comando:
gcloud functions deploy hello-http-function \
--allow-unauthenticated \
--entry-point HelloHttp.Function \
--gen2 \
--region $REGION \
--runtime dotnet8 \
--trigger-http
Depois que a função for implantada, invoque-a usando o seguinte comando curl:
SERVICE_URL=$(gcloud run services describe hello-http-function --platform managed --region $REGION --format 'value(status.url)') curl $SERVICE_URL
6. Função do CloudEvent: GCS
Você vai criar e implantar uma função do CloudEvent que responde a eventos do Google Cloud Storage (GCS).
Primeiro, crie um bucket do Cloud Storage. Este é o bucket de que você vai detectar eventos mais tarde:
BUCKET_NAME="cloud-functions-bucket-${PROJECT_ID}"
gsutil mb -l us-central1 gs://${BUCKET_NAME}
Crie uma função do CloudEvent usando o modelo gcf-event:
cd .. mkdir HelloGcs cd HelloGcs dotnet new gcf-event
Isso cria um projeto e um arquivo Function.cs que responde a solicitações CloudEvent. Ele também analisa os dados de CloudEvent em StorageObjectData.
Mude o framework de destino para net8.0 no arquivo .csproj:
<TargetFramework>net8.0</TargetFramework>
Para implantar uma função do Cloud Run diretamente no Cloud Run, primeiro implante a função e crie um gatilho para ela.
gcloud beta run deploy hello-gcs-function \
--source . \
--function HelloGcs.Function \
--region $REGION \
--base-image dotnet8 \
--no-allow-unauthenticated
Agora crie o gatilho para a função do Cloud Run.
BUCKET_REGION=$REGION
gcloud eventarc triggers create hello-gcs-function-trigger \
--location=$REGION \
--destination-run-service=hello-gcs-function \
--destination-run-region=$BUCKET_REGION \
--event-filters="type=google.cloud.storage.object.v1.finalized" \
--event-filters="bucket=$BUCKET_NAME" \
--service-account=$SERVICE_ACCOUNT_ADDRESS
Se preferir implantar como Cloud Functions da 2ª geração, use o seguinte comando para implantar a função usando as flags trigger-event e trigger-resource:
gcloud functions deploy hello-gcs-function \
--allow-unauthenticated \
--entry-point HelloGcs.Function \
--gen2 \
--region $REGION \
--runtime dotnet8 \
--trigger-event google.storage.object.finalize \
--trigger-resource ${BUCKET_NAME} \
--service-account=$SERVICE_ACCOUNT_ADDRESS
Depois de alguns minutos, a função vai aparecer no Console do Cloud:

Acione a função fazendo upload de um arquivo para o bucket de armazenamento:
echo "Hello from Storage" > random.txt
gsutil cp random.txt gs://${BUCKET_NAME}
Verifique se a função foi acionada lendo os registros:
Para uma função do Cloud Run, execute este comando:
gcloud logging read "resource.labels.service_name=hello-gcs-function AND textPayload: Name" --format=json
Para uma função de 2ª geração, execute este comando:
gcloud functions logs read hello-gcs-function \
--gen2 \
--region us-central1
7. Função do CloudEvent: Pub/Sub
Você vai criar e implantar uma função do CloudEvent que responde a eventos do Cloud Pub/Sub.
Primeiro, crie um tópico do Cloud Pub/Sub que vai emitir eventos:
TOPIC_NAME=cloud-functions-topic
gcloud pubsub topics create ${TOPIC_NAME}
Crie uma função do CloudEvent usando o modelo gcf-event:
cd .. mkdir HelloPubSub cd HelloPubSub dotnet new gcf-event
Isso cria um projeto e um arquivo Function.cs que responde a solicitações CloudEvent. Ele também analisa os dados de CloudEvent em StorageObjectData por padrão.
Mude o framework de destino para net8.0 no arquivo .csproj:
<TargetFramework>net8.0</TargetFramework>
Mude StorageObjectData para MessagePublishedData para analisar mensagens do Pub/Sub. Mude Google.Events.Protobuf.Cloud.Storage.V1 para Google.Events.Protobuf.Cloud.PubSub.V1.
No final, a função vai ficar assim:
using CloudNative.CloudEvents;
using Google.Cloud.Functions.Framework;
using Google.Events.Protobuf.Cloud.PubSub.V1;
using System;
using System.Threading;
using System.Threading.Tasks;
namespace HelloPubSub;
public class Function : ICloudEventFunction<MessagePublishedData>
{
public Task HandleAsync(CloudEvent cloudEvent, MessagePublishedData data, CancellationToken cancellationToken)
{
var nameFromMessage = data.Message?.TextData;
var name = string.IsNullOrEmpty(nameFromMessage) ? "world" : nameFromMessage;
Console.WriteLine($"Hello {name}");
return Task.CompletedTask;
}
}
Para implantar uma função do Cloud Run diretamente no Cloud Run, primeiro implante a função e crie um gatilho para ela.
gcloud beta run deploy hello-pubsub-function \
--source . \
--function HelloPubSub.Function \
--region $REGION \
--base-image dotnet8 \
--no-allow-unauthenticated \
--service-account=$SERVICE_ACCOUNT_ADDRESS
Agora crie o gatilho para a função do Cloud Run
gcloud eventarc triggers create my-pubsub-trigger \
--location=$REGION \
--service-account=$SERVICE_ACCOUNT_ADDRESS \
--destination-run-service=hello-pubsub-function \
--destination-run-region=$REGION \
--destination-run-path="/" \
--event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
--transport-topic=projects/$PROJECT_ID/topics/$TOPIC_NAME
Se preferir implantar como uma função do Cloud Functions de 2ª geração, use o seguinte comando com a flag trigger-topic:
gcloud functions deploy hello-pubsub-function \
--allow-unauthenticated \
--entry-point HelloPubSub.Function \
--gen2 \
--region us-central1 \
--runtime dotnet8 \
--trigger-topic ${TOPIC_NAME}
Depois de alguns minutos, a função vai aparecer no Console do Cloud:

Acione a função publicando uma mensagem no tópico:
gcloud pubsub topics publish ${TOPIC_NAME} --message="World"
Verifique se a função foi acionada lendo os registros.
Para uma função do Cloud Run, execute este comando:
gcloud logging read "resource.labels.service_name=hello-pubsub-function AND textPayload: World" --format=json
Para uma função de 2ª geração, execute este comando:
gcloud functions logs read hello-pubsub-function \
--gen2 \
--region us-central1
8. Função do CloudEvent sem tipo
Se você estiver testando o CloudEvents e ainda não tiver um modelo de dados de payload que queira usar, ou se quiser que sua função possa processar qualquer CloudEvent, use uma função CloudEvent sem tipo.
Crie uma função CloudEvent usando o modelo gcf-untyped-event:
cd .. mkdir HelloUntyped cd HelloUntyped dotnet new gcf-untyped-event
Isso cria um projeto e um arquivo Function.cs que responde a solicitações CloudEvent sem tentar analisar os dados do CloudEvent.
Mude o framework de destino para net8.0 no arquivo .csproj:
<TargetFramework>net8.0</TargetFramework>
Para implantar uma função do Cloud Run diretamente no Cloud Run, primeiro implante a função e crie um gatilho para ela.
gcloud beta run deploy hello-untyped-function \
--source . \
--function HelloUntyped.Function \
--region $REGION \
--base-image dotnet8 \
--no-allow-unauthenticated
Agora crie o gatilho para a função do Cloud Run.
BUCKET_REGION=$REGION
gcloud eventarc triggers create hello-untyped-function-trigger \
--location=$REGION \
--destination-run-service=hello-untyped-function \
--destination-run-region=$BUCKET_REGION \
--event-filters="type=google.cloud.storage.object.v1.finalized" \
--event-filters="bucket=$BUCKET_NAME" \
--service-account=$SERVICE_ACCOUNT_ADDRESS
Se preferir implantar como Cloud Functions da 2ª geração, use o seguinte comando para implantar a função usando as flags trigger-event e trigger-resource:
gcloud functions deploy hello-untyped-function \
--allow-unauthenticated \
--entry-point HelloUntyped.Function \
--gen2 \
--region us-central1 \
--runtime dotnet8 \
--trigger-event google.storage.object.finalize \
--trigger-resource ${BUCKET_NAME}
A função será acionada quando um arquivo for enviado para um bucket de armazenamento.
Depois de alguns minutos, a função vai aparecer no Console do Cloud:

Acione a função fazendo upload de um arquivo para o bucket de armazenamento:
echo "Hello from Storage" > random.txt
gsutil cp random.txt gs://${BUCKET_NAME}
Verifique se a função foi acionada lendo os registros.
Para uma função do Cloud Run, execute este comando:
gcloud logging read "resource.labels.service_name=hello-gcs-function AND textPayload: Name" --format=json
Para uma função de 2ª geração, execute este comando:
gcloud functions logs read hello-untyped-function \
--gen2 \
--region us-central1
9. Parabéns!
Parabéns por concluir o codelab.
O que vimos
- Functions Framework para .NET.
- Como escrever uma função do Cloud HTTP.
- Como escrever uma função CloudEvent que responde a eventos do Cloud Storage.
- Como escrever uma função do CloudEvent que responde a eventos do Cloud Pub/Sub.
- Como escrever uma função do CloudEvent que responda a qualquer tipo de evento.