Escreva funções do Cloud Run orientadas por eventos

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

Implemente funções de controlador baseadas em eventos

As funções orientadas por eventos baseiam-se em CloudEvents, uma especificação de norma da indústria para descrever dados de eventos de forma comum. Pode saber mais acerca da especificação CloudEvents no repositório do GitHub do CloudEvents. O projeto CloudEvents também fornece um conjunto de SDKs CloudEvents para ajudar a trabalhar com objetos CloudEvents no seu código.

O exemplo seguinte mostra um ficheiro de origem de função acionada por eventos para cada tempo de execução. Consulte a secção Estrutura do diretório de origem para obter 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 seguintes dependências, incluindo "type": "module" no ficheiro 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 ficheiro package.json:

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

No Node.js, regista uma função de controlador de CloudEvent com o Functions Framework para Node.js. A função do controlador tem de aceitar um objeto CloudEvent como argumento.

O ponto de entrada da função é o nome com o qual o controlador está registado 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, regista uma função de controlador de CloudEvent com o Functions Framework para Python. A função do controlador tem de aceitar um objeto CloudEvent como argumento.

O ponto de entrada da função é o nome da função de controlador registada no Functions Framework. Neste exemplo, o ponto de entrada é my_cloudevent_function.

Ir

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, regista uma função de controlador de CloudEvents com o Functions Framework para Go. A função de controlador tem de aceitar um objeto event.Event CloudEvents como argumento.

O ponto de entrada da função é o nome com o qual o controlador está registado 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, usa a API Java do Functions Framework para implementar uma classe de controlador CloudEvent com a interface CloudEventsFunction. O método accept() tem de aceitar um objeto CloudEvent como argumento e realizar qualquer processamento no evento.

O ponto de entrada da função é o nome totalmente qualificado da classe do controlador 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 runtimes .NET, usa o Functions Framework para .NET para implementar uma classe de controlador CloudEvent com a interface ICloudEventFunction<T>. O método HandleAsync() aceita um objeto CloudEvent e a carga útil de dados CloudEvent associada como argumentos.

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

O ponto de entrada da função é o nome totalmente qualificado da classe do controlador de CloudEvent, incluindo o espaço de nomes. 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

Em Ruby, regista uma função de controlador de CloudEvent com o Functions Framework for Ruby. A função de controlador tem de aceitar um objeto CloudEvents Event como argumento.

O ponto de entrada da função é o nome com o qual o controlador está registado 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, regista uma função de controlador de CloudEvent com o Functions Framework para PHP. A função de controlador tem de aceitar um argumento em conformidade com a interface CloudEventInterface.

O ponto de entrada da função é o nome com o qual o controlador está registado no Functions Framework. Neste exemplo, o ponto de entrada é myCloudEventFunction.

Para funções acionadas por eventos, os dados de eventos são transmitidos à sua função no formato CloudEvents, com uma carga útil de dados CloudEvent correspondente ao tipo de evento que aciona a sua função. Consulte os acionadores de funções para ver informações sobre os acionadores suportados, os tipos de eventos e os formatos de dados de eventos associados.

O repositório Google Events contém recursos para trabalhar com CloudEvents emitidos pela Google.

Terminação da função

O Cloud Run considera a execução da função baseada em eventos concluída quando a função devolve um valor. Se a função criar tarefas em segundo plano (como com threads, futuros, objetos JavaScript Promise, callbacks ou processos do sistema), tem de terminar ou resolver estas tarefas antes de regressar da função. As tarefas não terminadas antes de a função ser devolvida podem não ser concluídas e podem causar um comportamento indefinido.

Novas tentativas automáticas

As funções acionadas por eventos podem ser configuradas para repetir automaticamente as invocações com falhas. Consulte o artigo Voltar a tentar funções acionadas por eventos para mais informações.

O que se segue?