Introdução às funções orientadas a eventos do Cloud Run

1. Introdução

Visão geral

As funções do Cloud Run são uma nova maneira de implantar cargas de trabalho usando os paradigmas de evento do GCF conhecidos e a assinatura de função. Em vez de usar nosso processo opinativo de processo de build e configurações de implantação, as funções do Cloud Run dão a você controle direto sobre o serviço subjacente criado no Cloud Run.

Com as funções do Cloud Run, fornecemos a UX simples da implantação de origem do Cloud Run, oferecendo aos desenvolvedores controle total sobre as cargas de trabalho usando as configurações do Cloud Run.

Nesta seção, você aprenderá a implantar uma função orientada a eventos no Node. Você implantará uma função que será acionada sempre que um objeto for finalizado em um bucket do Google Cloud Storage.

Este codelab usa amostras de nodejs nos exemplos abaixo. No entanto, é possível usar os exemplos de código de 2a geração do Cloud Functions na linguagem que preferir:

O que você vai aprender

  • Como implantar uma função do Cloud Run orientada por eventos que é acionada sempre que um objeto é enviado para um bucket do GCS
  • Como criar uma conta de serviço com os papéis adequados para receber um evento do Cloud Storage e invocar a função do Cloud Run

2. Configurar variáveis de ambiente e ativar APIs

Atualizar a gcloud CLI

Este codelab requer uma versão recente da CLI gcloud instalada. Para atualizar a CLI, execute

gcloud components update

Ativar APIs

Antes de começar a usar este codelab, você precisa ativar várias APIs. Este codelab requer o uso das APIs a seguir. É possível ativar essas APIs executando o seguinte comando:

gcloud services enable run.googleapis.com \
    cloudbuild.googleapis.com \
    storage.googleapis.com \
    artifactregistry.googleapis.com

Configurar as variáveis de ambiente.

Você pode definir variáveis de ambiente que serão usadas neste codelab.

PROJECT_ID=<YOUR_PROJECT_ID>
REGION=<YOUR_REGION, e.g. us-central1>

gcloud config set project $PROJECT_ID
SERVICE_NAME=crf-event-codelab
BUCKET_NAME=$PROJECT_ID-$SERVICE_NAME
TRIGGER_NAME=$SERVICE_NAME-trigger

3. criar um bucket do Storage e uma conta de serviço

Criar um bucket de armazenamento

É possível criar um bucket do Cloud Storage executando o seguinte comando:

gsutil mb -l us-central1 gs://$BUCKET_NAME

Criar uma conta de serviço

Neste exemplo, 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_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 Receptor de evento do Eventarc (roles/eventarc.eventReceiver) no projeto à conta de serviço associada ao gatilho do Eventarc para que o gatilho 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. Criar e implantar a função

Primeiro, crie um diretório para o código-fonte e use cd nele.

mkdir ../$SERVICE_NAME && cd $_

Em seguida, crie um arquivo package.json com o seguinte conteúdo:

{
    "dependencies": {
        "@google-cloud/functions-framework": "^3.0.0"
    }
}

Em seguida, crie um arquivo index.js com o seguinte conteúdo:

const functions = require("@google-cloud/functions-framework");

// Register a CloudEvent callback with the Functions Framework that will
// be triggered by Cloud Storage.
functions.cloudEvent("helloGCS", (cloudEvent) => {
    console.log(`Event ID: ${cloudEvent.id}`);
    console.log(`Event Type: ${cloudEvent.type}`);

    const file = cloudEvent.data;
    console.log(`Bucket: ${file.bucket}`);
    console.log(`File: ${file.name}`);
    console.log(`Metageneration: ${file.metageneration}`);
    console.log(`Created: ${file.timeCreated}`);
    console.log(`Updated: ${file.updated}`);
});

Agora é possível implantar a função do Cloud Run executando o seguinte comando:

gcloud beta run deploy $SERVICE_NAME \
 --source . \
      --function helloGCS \
      --region $REGION \
      --no-allow-unauthenticated

Observações:

  • a flag –source é usada para instruir o Cloud Run a criar a função em um serviço baseado em contêiner executável.
  • A flag –function (novo) é usada para definir o ponto de entrada do novo serviço como a assinatura da função que você quer invocar.
  • (opcional) o –no-allow-unauthenticated para evitar que sua função seja invocável publicamente

Para ver o novo serviço crf-nodejs-event, execute o seguinte comando:

gcloud beta run services describe $SERVICE_NAME

5. Criar o evento

Podemos criar um gatilho do Eventarc para enviar mensagens à nossa função sempre que um objeto for finalizado no Google Cloud Storage:

BUCKET_REGION=$REGION

gcloud eventarc triggers create $TRIGGER_NAME \
     --location=$REGION \
     --destination-run-service=crf-nodejs-event \
  --destination-run-region=$BUCKET_REGION \
     --event-filters="type=google.cloud.storage.object.v1.finalized" \
     --event-filters="bucket=$BUCKET_NAME" \
     --service-account=$SERVICE_ACCOUNT_ADDRESS

Observações:

  • gcs-function-trigger é o nome do gatilho
  • crf-nodejs-event é o nome do serviço do Cloud Run em que a função está implantada.
  • para a flag –event-filters, não use o prefixo gs:// no nome do seu bucket.

Um tutorial detalhado sobre como configurar o serviço do gatilho no Cloud Storage usando o Eventarc pode ser encontrado na documentação do Cloud Run: https://cloud.google.com/run/docs/tutorials/eventarc

6. Testar a função

Quando a implantação estiver concluída, o URL do serviço vai aparecer. Para invocar a função, você precisa enviar uma solicitação autenticada com o token de identidade ou o token de identidade de um princípio que tenha o papel Invocador do Cloud Run, conforme mostrado abaixo:

# get the Service URL
SERVICE_URL="$(gcloud run services describe crf-nodejs-event --region us-central1 --format 'value(status.url)')"

# invoke the service
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

Com nossa função implantada e um gatilho criado, agora estamos prontos para invocar a função.

Crie um arquivo e faça o upload dele no bucket do Cloud Storage. É possível fazer isso pela interface da Web do Console do Cloud ou usando a ferramenta gsutil CLI, por exemplo:

echo "hello world" > test.txt
gsutil cp test gs://$BUCKET_NAME

Quando o upload do arquivo for concluído, um evento será gerado e sua função imprimirá algumas informações básicas sobre o objeto, por exemplo, o nome do arquivo. Essa saída está nas entradas de registro da função no console do Cloud. Como alternativa, consulte essa saída usando a CLI gcloud:

gcloud logging read "resource.labels.service_name=crf-nodejs-event AND textPayload: File" --format=json 

e a seguinte resposta será exibida:

"textPayload": "File: test.txt"

7. Parabéns!

Parabéns por concluir o codelab.

Recomendamos consultar a documentação das funções do Cloud Run.

O que vimos

  • Como implantar uma função do Cloud Run orientada por eventos que é acionada sempre que um objeto é enviado para um bucket do GCS
  • Como criar uma conta de serviço com os papéis adequados para receber um evento do Cloud Storage e invocar a função do Cloud Run

8. Limpar

Para evitar cobranças acidentais, por exemplo, se este serviço do Cloud Run for invocado mais vezes do que sua alocação mensal de invocação do Cloud Run no nível sem custo financeiro, exclua o serviço do Cloud Run ou o projeto criado na etapa 2.

Para excluir os serviços do Cloud Run, acesse o console do Cloud Run em https://console.cloud.google.com/run/ e exclua o serviço crf-event-codelab que você criou neste codelab.

Se você optar por excluir o projeto inteiro, acesse https://console.cloud.google.com/cloud-resource-manager, selecione o projeto criado na etapa 2 e escolha "Excluir". Se você excluir o projeto, precisará alterar os projetos no SDK Cloud. Para conferir a lista de todos os projetos disponíveis, execute gcloud projects list.