Escrever funções do Cloud Run orientadas a eventos

Nas funções do Cloud Run, você escreve uma função orientada a eventos quando quer que ela seja acionada diretamente em resposta a eventos no seu Google Cloud projeto, como mensagens em um tópico do Pub/Sub ou alterações em um bucket do Cloud Storage.

Implementar funções de manipuladores orientados a eventos

As funções baseadas em eventos são baseadas no CloudEvents, uma especificação padrão do setor para descrever dados de eventos de maneira comum. Saiba mais sobre a especificação do CloudEvents no repositório do GitHub do CloudEvents. O projeto CloudEvents também fornece um conjunto de SDKs do CloudEvents para ajudar a trabalhar com objetos do CloudEvents no código.

O exemplo a seguir mostra um arquivo de origem da função orientada a eventos para cada ambiente de execução. Consulte Estrutura do diretório de origem para ver informações sobre onde localizar o código-fonte.

Node.js

Módulo ES

  import { cloudEvent } from "@google-cloud/functions-framework";   cloudEvent('myCloudEventFunction', cloudEvent => {     // Your code here     // Access the CloudEvent data payload using cloudEvent.data   }); 

Adicione as dependências a seguir, incluindo "type": "module" no arquivo package.json:

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

Módulo CommonJS

const functions = require('@google-cloud/functions-framework');  // Register a CloudEvent function with the Functions Framework functions.cloudEvent('myCloudEventFunction', cloudEvent => {   // Your code here   // Access the CloudEvent data payload using cloudEvent.data }); 

Adicione as seguintes dependências no arquivo package.json:

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

No Node.js, você registra uma função de gerenciador do CloudEvent com o frameworks Functions para Node.js. A função de gerenciador precisa aceitar um objeto CloudEvent como argumento.

O ponto de entrada de função é o nome com que o gerenciador está registrado no Functions Framework. Neste exemplo, o ponto de entrada é myCloudEventFunction.

Python

import functions_framework  # Register a CloudEvent function with the Functions Framework @functions_framework.cloud_event def my_cloudevent_function(cloud_event):   # Your code here   # Access the CloudEvent data payload via cloud_event.data 

Em Python, você registra uma função de gerenciador do CloudEvent com o Framework de funções para Python. A função de gerenciador precisa aceitar um objeto CloudEvent como argumento.

O ponto de entrada da função é o nome da função do gerenciador registrada no Functions Framework. Neste exemplo, o ponto de entrada é my_cloudevent_function.

Go

package mycloudeventfunction  import (     "context"      "github.com/GoogleCloudPlatform/functions-framework-go/functions"     "github.com/cloudevents/sdk-go/v2/event" )  func init() {     // Register a CloudEvent function with the Functions Framework     functions.CloudEvent("MyCloudEventFunction", myCloudEventFunction) }  // Function myCloudEventFunction accepts and handles a CloudEvent object func myCloudEventFunction(ctx context.Context, e event.Event) error {     // Your code here     // Access the CloudEvent data payload using e.Data() or e.DataAs(...)      // Returning an error causes its message to be logged.     // Example:     err := myInternalFunction() // may return an error     if err != nil {         // Append error message to log         return err     }      // Return nil if no error occurred     return nil } 

Em Go, registre uma função de manipulador do CloudEvent com o Functions Framework para Go. Sua função de gerenciador precisa aceitar um CloudEvents event.Event objeto como um argumento.

O ponto de entrada de função é o nome com que o gerenciador está registrado no Functions Framework. Neste exemplo, o ponto de entrada é MyCloudEventFunction.

Java

package mycloudeventfunction;  import com.google.cloud.functions.CloudEventsFunction; import io.cloudevents.CloudEvent;  // Define a class that implements the CloudEventsFunction interface public class MyCloudEventFunction implements CloudEventsFunction {   // Implement the accept() method to handle CloudEvents   @Override   public void accept(CloudEvent event) {     // Your code here     // Access the CloudEvent data payload using event.getData()     // To get the data payload as a JSON string, use:     // new String(event.getData().toBytes())   } } 

Em Java, use a API Java Functions Functions Framework para implementar uma classe de manipulador do CloudEvent com a interface CloudEventsFunction. O método accept() precisa aceitar um objeto CloudEvent como argumento e executar qualquer processamento no evento.

O ponto de entrada de função é o nome totalmente qualificado da classe de gerenciador do CloudEvent, incluindo o nome do pacote. Neste exemplo, o ponto de entrada é mycloudeventfunction.MyCloudEventFunction.

.NET

using CloudNative.CloudEvents; using Google.Cloud.Functions.Framework; using System.Threading; using System.Threading.Tasks;  namespace MyProject {   // Define a class that implements the ICloudEventFunction<T> interface   public class MyCloudEventFunction : ICloudEventFunction<CloudEventDataType>   {       // Implement the HandleAsync() method to handle CloudEvents       public Task HandleAsync(CloudEvent cloudEvent, CloudEventDataType data, CancellationToken cancellationToken)       {           // Your code here           // The data argument represents the CloudEvent data payload            // Signal function completion           return Task.CompletedTask;       }   } }

Nos ambientes de execução do .NET, você usa o Framework do Functions para .NET para implementar uma classe de manipulador do CloudEvent com a ICloudEventFunction<T> interface. O método HandleAsync() aceita um objeto CloudEvent e o payload de dados associado do CloudEvent como argumentos.

O tipo de argumento de payload de dados do CloudEvent, mostrado no código de exemplo como CloudEventDataType, precisa corresponder ao tipo de evento que a função processa. A biblioteca .NET do Google CloudEvents fornece tipos de dados para os vários eventos compatíveis com o Google.

O ponto de entrada de função é o nome totalmente qualificado da classe de manipulador do CloudEvent, incluindo o namespace. Neste exemplo, o ponto de entrada é MyProject.MyCloudEventFunction.

Ruby

require "functions_framework"  # Register a CloudEvent function with the Functions Framework FunctionsFramework.cloud_event "my_cloudevent_function" do |cloud_event|   # Your code here   # Access the CloudEvent data payload via cloud_event.data end 

No Ruby, você registra uma função de gerenciador do CloudEvent com o Functions Framework para Ruby. A função de gerenciador precisa aceitar um objeto Event do CloudEvents como argumento.

O ponto de entrada de função é o nome com que o gerenciador está registrado no Functions Framework. Neste exemplo, o ponto de entrada é my_cloudevent_function.

PHP

<?php  use CloudEvents\V1\CloudEventInterface; use Google\CloudFunctions\FunctionsFramework;  // Register a CloudEvent function with the Functions Framework FunctionsFramework::cloudEvent('myCloudEventFunction', 'myCloudEventHandler');  // Define your CloudEvent handler function myCloudEventHandler(CloudEventInterface $event): void {     // Your code here     // Access the CloudEvent data payload using $event->getData() } 

Em PHP, você registra uma função de gerenciador do CloudEvent com o Functions Framework para PHP. A função de gerenciador precisa aceitar um argumento compatível com a interface CloudEventInterface.

O ponto de entrada de função é o nome com que o gerenciador está registrado no Functions Framework. Neste exemplo, o ponto de entrada é myCloudEventFunction.

Para funções orientadas a eventos, os dados de evento são transmitidos para a função no formato CloudEvents, com um payload de dados do CloudEvent correspondente ao tipo de evento que aciona a função. Consulte Acionadores de função para informações sobre acionadores compatíveis, tipos de eventos e formatos de dados de eventos associados.

O repositório de Eventos do Google contém recursos para trabalhar com CloudEvents emitidos pelo Google.

Encerramento da função

O Cloud Run considera a execução da função orientada a eventos concluída quando a função é retornada. Se a função criar tarefas em segundo plano (como linhas de execução, futuros, objetos de promessas do JavaScript, callbacks ou processos do sistema), é necessário encerrar ou resolver essas tarefas antes de retornar da função. As tarefas não encerradas antes do retorno da função podem não ser concluídas e podem causar um comportamento indefinido.

Novas tentativas automáticas

As funções baseadas em eventos podem ser configuradas para repetir automaticamente invocações com falha. Consulte Como repetir funções orientadas a eventos para mais informações.

A seguir