Ejecutar funciones con Functions Framework

Cloud Run Functions usa las bibliotecas de código abierto Functions Framework para envolver las funciones implementadas en una aplicación HTTP persistente.

Functions Framework también se puede ejecutar en cualquier otra plataforma que admita el lenguaje, como tu máquina local, servidores on-premise, Compute Engine y Cloud Run.

Instalar dependencias

En el directorio de tu función, instala la biblioteca Functions Framework para tu idioma:

Consulta más información en la biblioteca del framework de funciones de Java.

Node.js

npm install --save-dev @google-cloud/functions-framework

Python

pip install functions-framework

Go

go install github.com/GoogleCloudPlatform/functions-framework-go/funcframework

Java

Maven

Si usas Maven, añade lo siguiente a tu archivo pom.xml:

<dependency>
  <groupId>com.google.cloud.functions</groupId>
  <artifactId>functions-framework-api</artifactId>
  <version>1.1.0</version>
  <scope>provided</scope>
</dependency>

Gradle

Si usas Gradle, añade lo siguiente al archivo build.gradle:

dependencies {
  // Every function needs this dependency to get the Functions Framework API.
  compileOnly 'com.google.cloud.functions:functions-framework-api:1.1.0'

  // To run function locally using Functions Framework's local invoker
  invoker 'com.google.cloud.functions.invoker:java-function-invoker:1.3.1'
}

C#

Los comandos que se indican a continuación usan plantillas de .NET para crear una nueva base de código de función de Cloud Run de .NET con la biblioteca del framework de funciones de.NET como dependencia:

# HTTP functions
dotnet new gcf-http

# CloudEvent functions
dotnet new gcf-event

Ruby

En Ruby, el framework de funciones debe añadirse a las dependencias de tu función para poder desplegarla en Cloud Run Functions:

bundle add functions_framework

PHP

composer require google/cloud-functions-framework

Configurar Functions Framework

Antes de ejecutar una función con Functions Framework, primero debes especificar el tipo y el nombre de la función que quieras ejecutar. Estos atributos se pueden especificar como una marca de la interfaz de línea de comandos (CLI) o como variables de entorno.

Tipos de funciones admitidos

Functions Framework admite los tres tipos de funciones compatibles con Cloud Run Functions de primera generación. Todos los tiempos de ejecución de los lenguajes admiten http y event o cloudevent.

Tipo de función Tipo de firma Descripción Entornos de ejecución compatibles
Funciones activadas por HTTP http Funciones que reciben solicitudes HTTP y responden a ellas. Todos los entornos de ejecución
Funciones en segundo plano event Formato de evento específico de Cloud Run Functions Node.js, Python, Go, Java
Funciones de CloudEvent cloudevent Formato de evento estándar del sector .NET, Ruby, PHP

Especificar qué función se va a ejecutar

Antes de ejecutar una función con Functions Framework, primero debe especificar qué función de su código se debe ejecutar. En la mayoría de los idiomas, puedes hacerlo especificando el nombre del método de la función de destino, como se muestra en las tablas de abajo. (También se muestran a continuación las excepciones a esta regla, como Java y .NET).

Instrucciones por idioma

En la tabla de abajo se muestra una lista de las opciones de configuración admitidas en cada idioma.

Node.js

Argumento de CLI Variable de entorno Descripción
--port PORT Puerto en el que se escuchan las solicitudes. Valor predeterminado: 8080
--target FUNCTION_TARGET Nombre de la función exporteditada que se va a invocar. Valor predeterminado: function
--signature-type FUNCTION_SIGNATURE_TYPE El tipo de firma que usa tu función. Puede ser http (el valor predeterminado), event o cloudevent.

Python

Argumento de CLI Variable de entorno Descripción
--port PORT Puerto en el que se escuchan las solicitudes. Valor predeterminado: 8080
--target FUNCTION_TARGET Nombre de la función exporteditada que se va a invocar. Valor predeterminado: function
--signature-type FUNCTION_SIGNATURE_TYPE El tipo de firma que usa tu función. Puede ser http (el valor predeterminado), event o cloudevent.

Go

Variable de entorno Descripción
PORT Puerto en el que se escuchan las solicitudes. Valor predeterminado: 8080

Java

Nombre del argumento Variable de entorno Descripción
run.port PORT Puerto en el que se escuchan las solicitudes. Valor predeterminado: 8080
run.functionTarget FUNCTION_TARGET Nombre de la función exporteditada que se va a invocar. Valor predeterminado: function

C#

Argumento de CLI Variable de entorno Descripción
--port PORT Puerto en el que se escuchan las solicitudes. Valor predeterminado: 8080
--target (o el único argumento) FUNCTION_TARGET El nombre de la clase de la función que se va a invocar. Valor predeterminado: function

Ruby

Argumento de CLI Variable de entorno Descripción
--port PORT Puerto en el que se escuchan las solicitudes. Valor predeterminado: 8080
--target FUNCTION_TARGET Nombre de la función exporteditada que se va a invocar. Valor predeterminado: function

PHP

Variable de entorno Descripción
FUNCTION_TARGET Nombre de la función que se va a invocar. Valor predeterminado: function
FUNCTION_SIGNATURE_TYPE El tipo de firma que usa tu función. Puede ser http (el valor predeterminado), event o cloudevent.

Sigue las instrucciones que se indican a continuación para configurar y ejecutar Functions Framework:

Node.js

El framework de funciones de Node.js te permite especificar el nombre y el tipo de firma de tu función como argumentos de línea de comandos o variables de entorno.

También puede especificar estos valores en el archivo de compilación package.json añadiendo una secuencia de comandos start con los argumentos de la CLI necesarios, como se muestra en el ejemplo siguiente.

"scripts": {
  "start": "npx functions-framework --target=YOUR_FUNCTION_NAME [--signature-type=YOUR_SIGNATURE_TYPE]"
}

También se puede hacer lo mismo con las variables de entorno:

"scripts": {
  "start": "FUNCTION_TARGET=YOUR_FUNCTION_NAME FUNCTION_SIGNATURE_TYPE=YOUR_SIGNATURE_TYPE npx functions-framework"
}

Sustituye YOUR_FUNCTION_NAME por el nombre del método de tu función y YOUR_SIGNATURE_TYPE (si procede) por el tipo de firma de tu función, tal como se muestra en la tabla de arriba.

Python

Python Functions Framework le permite especificar el nombre y el tipo de firma de su función como argumentos de línea de comandos o variables de entorno. Los argumentos de línea de comandos deben especificarse al ejecutar el framework.

Go

Go Functions Framework usa funcframework.RegisterHTTPFunctionContext para especificar el destino de la función y el tipo de firma.

Java

Java Functions Framework acepta datos de configuración de tres fuentes diferentes, en el siguiente orden de prioridad (de la más específica a la menos específica):

  • Argumentos de línea de comandos
  • Archivos de compilación
  • Variables de entorno

Argumentos de línea de comandos

Maven

Puedes especificar la función que quieras ejecutar añadiendo la siguiente marca de interfaz de línea de comandos (CLI) a tus comandos de mvn:

-Drun.functionTarget=YOUR_FUNCTION_NAME

También puede especificar el puerto de destino añadiendo la siguiente marca de CLI de forma similar:

-Drun.port=12345

Gradle

Las marcas de la CLI de Gradle son casi idénticas a las de Maven. El único cambio que hace Gradle es sustituir el -D inicial de cada marca por un -P, como se muestra en el ejemplo siguiente:

# Maven version
-Drun.functionTarget=...

# Gradle version
-Prun.functionTarget=...

Archivos de compilación

También puedes especificar la función que quieras ejecutar en el archivo de compilación de tu proyecto. Aunque Maven y Gradle tienen marcas de CLI similares, sus cláusulas de archivo de compilación difieren significativamente.

Maven

Los archivos de compilación de Maven se denominan pom.xml. Añade la siguiente cláusula a este archivo para especificar una función de destino:

<plugin>
  <groupId>com.google.cloud.functions</groupId>
  <artifactId>function-maven-plugin</artifactId>
  <version>0.11.0</version>
  <configuration>
    <functionTarget>functions.HelloWorld</functionTarget>
  </configuration>
</plugin>

Sustituye <functionTarget> por el nombre de la clase de tu función. Por ejemplo, una función del paquete functions con el nombre de clase HelloCloudFunctions tendría el nombre de clase functions.HelloCloudFunctions. Es relativa al archivo de compilación principal (pom.xml o build.gradle).

Gradle

Los archivos de compilación de Gradle se llaman build.gradle. Añade la siguiente cláusula a este archivo para especificar una función de destino:

// Register a "runFunction" task to run the function locally
tasks.register("runFunction", JavaExec) {
  main = 'com.google.cloud.functions.invoker.runner.Invoker'
  classpath(configurations.invoker)
  inputs.files(configurations.runtimeClasspath, sourceSets.main.output)
  args(
    '--target', project.findProperty('run.functionTarget') ?: '',
    '--port', project.findProperty('run.port') ?: 8080
  )
  doFirst {
    args('--classpath', files(configurations.runtimeClasspath, sourceSets.main.output).asPath)
  }
}

C#

Si creas tu proyecto con dotnet new y una de las plantillas especificadas arriba, .NET Functions Framework detectará automáticamente tu función.

Si tu proyecto contiene varias funciones, consulta la sección Ejecutar el framework para obtener información sobre cómo ejecutar una función específica.

Ruby

Ruby Functions Framework te permite especificar el nombre y el tipo de firma de tu función como argumentos de línea de comandos o variables de entorno. Los argumentos de línea de comandos deben especificarse al ejecutar el framework.

PHP

El framework de funciones de PHP te permite especificar variables de entorno como argumentos de línea de comandos.

También puedes especificar estos valores en el archivo de compilación composer.json añadiendo una secuencia de comandos start, como se muestra en el ejemplo siguiente.

"scripts": {
   "start": [
       "Composer\\Config::disableProcessTimeout",
       "FUNCTION_TARGET=YOUR_FUNCTION_NAME php -S localhost:${PORT:-8080} vendor/bin/router.php"
    ]
}

Sustituye YOUR_FUNCTION_NAME por el nombre de tu función y YOUR_SIGNATURE_TYPE (si procede) por el tipo de firma de tu función, tal como se muestra en la tabla anterior.

Ejecutar el framework de Functions

Usa el siguiente comando para ejecutar tu función con Functions Framework. De forma predeterminada, se podrá acceder a tu función en localhost:8080, a menos que especifiques explícitamente un valor de PORT.

Node.js

npm start

Python

Usar argumentos de línea de comandos:

functions-framework --target=YOUR_FUNCTION_NAME

Usar variables de entorno:

FUNCTION_TARGET=YOUR_FUNCTION_NAME functions-framework

Sustituye YOUR_FUNCTION_NAME por el nombre del método de tu función.

Go

cd cmd
go build
./cmd

Usar variables de entorno:

cd cmd
go build
PORT=8080 ./cmd

Java

Maven

Usa el siguiente comando para ejecutar una función especificada en pom.xml:

mvn function:run

Usa el siguiente comando para ejecutar una función especificada en un argumento de línea de comandos:

mvn function:run -Drun.functionTarget=YOUR_FUNCTION_NAME

Usa el siguiente comando para ejecutar una función especificada como variable de entorno:

FUNCTION_TARGET=YOUR_FUNCTION_NAME mvn function:run

Sustituye YOUR_FUNCTION_NAME por el nombre de clase de tu función.

Gradle

Usa el siguiente comando para ejecutar una función especificada en build.gradle:

./gradlew runFunction

Usa el siguiente comando para ejecutar una función especificada en un argumento de línea de comandos:

./gradlew runFunction -Prun.functionTarget=YOUR_FUNCTION_NAME

Usa el siguiente comando para ejecutar una función especificada como variable de entorno:

FUNCTION_TARGET=YOUR_FUNCTION_NAME ./gradlew runFunction

Sustituye YOUR_FUNCTION_NAME por el nombre de clase de tu función.

C#

Usa el siguiente comando para ejecutar tu función cuando haya exactamente una función en el proyecto .NET actual. Esta es la estructura predeterminada de los proyectos creados a partir de plantillas.

dotnet run

Si tu proyecto de .NET contiene varias funciones, usa el siguiente comando para ejecutar una función específica. Sustituye YOUR_FUNCTION_CLASSNAME por el nombre de clase de tu función, incluido el espacio de nombres.

dotnet run YOUR_FUNCTION_CLASSNAME

Si quieres ejecutar varias funciones simultáneamente, tendrás que ejecutar varias instancias de Functions Framework. Para evitar conflictos entre las instancias del framework en ejecución, cada instancia debe usar un valor PORT diferente. El siguiente comando muestra cómo ejecutar una función con un valor PORT de 8080.

Usar argumentos de línea de comandos:

dotnet run --target YOUR_FUNCTION_CLASSNAME --port 8080

Usar variables de entorno:

FUNCTION_TARGET=YOUR_FUNCTION_CLASSNAME PORT=8080 dotnet run

Ruby

Usar argumentos de línea de comandos:

bundle exec functions-framework-ruby --target YOUR_FUNCTION_NAME

Usar variables de entorno:

FUNCTION_TARGET=YOUR_FUNCTION_NAME bundle exec functions-framework-ruby

Sustituye YOUR_FUNCTION_NAME por el nombre del método de tu función.

PHP

export FUNCTION_TARGET=YOUR_FUNCTION_NAME
php -S localhost:8080 vendor/bin/router.php

Sustituye YOUR_FUNCTION_NAME por el nombre de tu función.

Llamar a tu función

Consulta la página sobre cómo llamar a funciones locales para obtener instrucciones sobre cómo interactuar con tu función local.

Limpieza

Cuando hayas terminado de ejecutar la función, detén la instancia del framework en ejecución pulsando Control+C.