Escribir funciones de Cloud Run basadas en eventos

En las funciones de Cloud Run, se escribe una función basada en eventos cuando se quiere que se active directamente en respuesta a eventos de tuGoogle Cloud proyecto, como mensajes de un tema de Pub/Sub o cambios en un segmento de Cloud Storage.

Implementar funciones de controlador basadas en eventos

Las funciones basadas en eventos se basan en CloudEvents, una especificación estándar del sector para describir datos de eventos de forma común. Puedes consultar más información sobre la especificación de CloudEvents en el repositorio de GitHub de CloudEvents. El proyecto CloudEvents también proporciona un conjunto de SDKs de CloudEvents para ayudarte a trabajar con objetos CloudEvents en tu código.

En el siguiente ejemplo se muestra un archivo de origen de función basada en eventos para cada tiempo de ejecución. Consulta la sección Estructura del directorio de origen para saber dónde encontrar el código fuente.

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   }); 

Añade las siguientes dependencias, incluida "type": "module", a tu archivo 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 }); 

Añade las siguientes dependencias en tu archivo package.json:

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

En Node.js, se registra una función de controlador de CloudEvents con el Functions Framework para Node.js. Tu función de controlador debe aceptar un objeto CloudEvent como argumento.

El punto de entrada de la función es el nombre con el que el controlador se registra en Functions Framework. En este ejemplo, el punto de entrada es 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 

En Python, se registra una función de controlador de CloudEvents con el Functions Framework para Python. Tu función de controlador debe aceptar un objeto CloudEvent como argumento.

El punto de entrada de la función es el nombre de la función de controlador registrada en Functions Framework. En este ejemplo, el punto de entrada es 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 } 

En Go, se registra una función de controlador de CloudEvents con el Functions Framework para Go. La función de controlador debe aceptar un objeto event.Event de CloudEvents como argumento.

El punto de entrada de la función es el nombre con el que el controlador se registra en Functions Framework. En este ejemplo, el punto de entrada es 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())   } } 

En Java, se usa la API de Java de Functions Framework para implementar una clase de controlador de CloudEvents con la interfaz CloudEventsFunction. El método accept() debe aceptar un objeto CloudEvent como argumento y realizar cualquier procesamiento en el evento.

El punto de entrada de la función es el nombre completo de la clase del controlador de CloudEvents, incluido el nombre del paquete. En este ejemplo, el punto de entrada es 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;       }   } }

En los tiempos de ejecución de .NET, se usa el Functions Framework para .NET para implementar una clase de controlador de CloudEvents con la interfaz ICloudEventFunction<T>. El método HandleAsync() acepta un objeto CloudEvent y la carga útil de datos de CloudEvent asociada como argumentos.

El tipo del argumento de carga útil de datos de CloudEvent, que se muestra en el código de ejemplo como CloudEventDataType, debe corresponder al tipo de evento que gestiona la función. La biblioteca .NET de Google CloudEvents proporciona tipos de datos para los distintos eventos admitidos por Google.

El punto de entrada de la función es el nombre completo de la clase de controlador de CloudEvent, incluido el espacio de nombres. En este ejemplo, el punto de entrada es 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 

En Ruby, se registra una función de controlador de CloudEvent con el Functions Framework para Ruby. Tu función de controlador debe aceptar un objeto CloudEvents Event como argumento.

El punto de entrada de la función es el nombre con el que el controlador se registra en Functions Framework. En este ejemplo, el punto de entrada es 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() } 

En PHP, se registra una función de controlador de CloudEvents con el framework de Functions para PHP. Tu función de controlador debe aceptar un argumento que cumpla la interfaz CloudEventInterface.

El punto de entrada de la función es el nombre con el que el controlador se registra en Functions Framework. En este ejemplo, el punto de entrada es myCloudEventFunction.

En el caso de las funciones basadas en eventos, los datos de eventos se transfieren a tu función en el formato CloudEvents, con una carga útil de datos de CloudEvent correspondiente al tipo de evento que activa tu función. Consulta la sección Activadores de funciones para obtener información sobre los activadores, los tipos de eventos y los formatos de datos de eventos asociados admitidos.

El repositorio Google Events contiene recursos para trabajar con CloudEvents emitidos por Google.

Finalización de la función

Cloud Run considera que la ejecución de una función basada en eventos se ha completado cuando la función devuelve un valor. Si la función crea tareas en segundo plano (por ejemplo, con hilos, futuros, objetos Promise de JavaScript, retrollamadas o procesos del sistema), debes finalizar o resolver estas tareas antes de volver de la función. Es posible que las tareas que no se hayan finalizado antes de que la función devuelva un valor no se completen y provoquen un comportamiento indefinido.

Reintentos automáticos

Las funciones basadas en eventos se pueden configurar para que vuelvan a intentar automáticamente las invocaciones fallidas. Consulta más información en Volver a intentar funciones basadas en eventos.

Siguientes pasos