El entorno de ejecución de Go

El entorno de ejecución de Go para las funciones de Cloud Functions se basa en la versión de Go 1.11.6. A fin de obtener instrucciones para preparar tu máquina local en el caso de la programación con Go, consulta Configura un entorno de desarrollo de Go.

Para comenzar con Go en Cloud Functions, consulta la guía de inicio rápido.

Selecciona el entorno de ejecución

Puedes seleccionar el entorno de ejecución de Go para tu función durante la implementación.

gcloud

Si usas la herramienta de línea de comandos de gcloud, puedes especificar el entorno de ejecución con el parámetro --runtime. Por ejemplo:

gcloud functions deploy FUNCTION_NAME --runtime go111 FLAGS...

FLAGS... refiere a los argumentos que se pasaron durante la primera implementación de tu función. Para obtener más información sobre los argumentos obligatorios y los opcionales, consulta Implementa con la herramienta de gcloud.

Console

Si usas GCP Console, puedes seleccionar el entorno de ejecución cuando creas e implementas una función.

  1. En GCP Console, ve a la página Descripción general de Cloud Functions.

    Ir a la página Descripción general de Cloud Functions

    Asegúrate de que el proyecto para el que habilitaste Cloud Functions esté seleccionado.

  2. Haz clic en Crear función.

  3. En Entorno de ejecución, selecciona Go 1.11.

Entorno de ejecución

El entorno de ejecución incluye el entorno de ejecución, el sistema operativo, los paquetes y una biblioteca que invoca tu función.

El entorno de ejecución de Go utiliza un entorno de ejecución basado en Ubuntu 18.04 con la versión 1.11.6 de Go. Consulta Entorno de ejecución de Cloud Functions para obtener más información.

Estructura del código fuente

A fin de que Cloud Functions encuentre la definición de tu función, cada entorno de ejecución tiene ciertos requisitos de estructura para el código fuente. Consulta Escribe funciones de Cloud Functions para obtener más información.

Especifica dependencias

Cloud Functions en Go debe proporcionar todas sus dependencias a través de los módulos de Go con un archivo go.mod o un directorio vendor. Para obtener más información, consulta Especifica dependencias en Go.

Inicialización única

Es posible que tus funciones necesiten realizar una inicialización única, como crear clientes de API y configurar el acceso a bases de datos. Hay muchas formas de hacerlo:

  • Usa una función func init() para inicializar los valores cuando se inicie una nueva instancia de tu función. Ten en cuenta que el código en la función func init() se ejecuta antes de que tu función reciba su primera solicitud.

  • Usa la función sync.Once.Do() para ejecutar códigos una vez por instancia de Cloud Functions. Hacer esto resulta útil en los casos en los que solo quieres inicializar a pedido y no cuando la instancia de la función se inicia primero. Por ejemplo, es posible que solo necesites inicializar un cliente de base de datos en ciertas circunstancias.

context.Context

El paquete context de Go define el tipo Context, que lleva fechas límite, indicadores de cancelación y otros valores de alcance de la solicitud en todos los límites de API y entre procesos.

Los clientes de API que sobreviven a la invocación de una función dada deben inicializarse con un valor context.Context global, como el creado por la función context.Background(). Para optimizar el rendimiento, podrías inicializar un cliente en alcance global. Es posible que este cliente y su contexto se conserven durante el ciclo de vida de una instancia de función determinada.

Solo debes usar el contexto de invocación de función para objetos u operaciones que caen dentro del ciclo de vida de una invocación de función específica. El contexto de invocación podría cancelarse en cualquier punto después de que tu función termina de ejecutarse, lo que significa que cualquier cliente inicializado con este contexto podría cerrarse. Se puede acceder al contexto de invocación de la función a través de los argumentos de la función: generalmente r.Context() para las funciones de HTTP y ctx en el caso de las funciones en segundo plano.

Consulta el siguiente código para ver un ejemplo con un cliente de Cloud Pub/Sub:


// Package contexttip is an example of how to use Pub/Sub and context.Context in
// a Cloud Function.
package contexttip

import (
	"context"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"os"

	"cloud.google.com/go/pubsub"
)

// projectID is set from the GCP_PROJECT environment variable, which is
// automatically set by the Cloud Functions runtime.
var projectID = os.Getenv("GCP_PROJECT")

// client is a global Pub/Sub client, initialized once per instance.
var client *pubsub.Client

func init() {
	// err is pre-declared to avoid shadowing client.
	var err error

	// client is initialized with context.Background() because it should
	// persist between function invocations.
	client, err = pubsub.NewClient(context.Background(), projectID)
	if err != nil {
		log.Fatalf("pubsub.NewClient: %v", err)
	}
}

type publishRequest struct {
	Topic string `json:"topic"`
}

// PublishMessage publishes a message to Pub/Sub. PublishMessage only works
// with topics that already exist.
func PublishMessage(w http.ResponseWriter, r *http.Request) {
	// Read the request body.
	data, err := ioutil.ReadAll(r.Body)
	if err != nil {
		log.Printf("ioutil.ReadAll: %v", err)
		http.Error(w, "Error reading request", http.StatusBadRequest)
		return
	}

	// Parse the request body to get the topic name.
	p := publishRequest{}
	if err := json.Unmarshal(data, &p); err != nil {
		log.Printf("json.Unmarshal: %v", err)
		http.Error(w, "Error parsing request", http.StatusBadRequest)
		return
	}

	m := &pubsub.Message{
		Data: []byte("Test message"),
	}
	// Publish and Get use r.Context() because they are only needed for this
	// function invocation. If this were a background function, they would use
	// the ctx passed as an argument.
	id, err := client.Topic(p.Topic).Publish(r.Context(), m).Get(r.Context())
	if err != nil {
		log.Printf("topic(%s).Publish.Get: %v", p.Topic, err)
		http.Error(w, "Error publishing message", http.StatusInternalServerError)
		return
	}
	fmt.Fprintf(w, "Published msg: %v", id)
}
¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Documentación de Cloud Functions