Ejecuta funciones con Functions Framework

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

Functions Framework también puede ejecutarse en cualquier otra plataforma que admita el lenguaje en sí, como tu máquina local, servidores locales, Compute Engine y Cloud Run.

Instala dependencias

En el directorio de la función, instala la biblioteca de Functions Framework para tu lenguaje, que debe ser uno de los siguientes:

Consulta la biblioteca de Functions Framework para Java a fin de obtener más información.

Node.js

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

Python

pip3 install functions-framework

Go

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

Java

Maven

Si usas Maven, agrega lo siguiente al 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, agrega 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 siguientes comandos usan plantillas .NET a fin de crear una base de código nueva de Cloud Function para .NET con la biblioteca de Functions Framework de.NET como una dependencia:

# HTTP functions
dotnet new gcf-http

# CloudEvent functions
dotnet new gcf-event

Ruby

En Ruby, Functions Framework debe agregarse a las dependencias de la función para implementarla en Cloud Run Functions:

bundle add functions_framework

PHP

composer require google/cloud-functions-framework

Configura Functions Framework

Debes especificar el tipo y el nombre de la función que desees ejecutar antes de ejecutarla mediante Functions Framework. Estos atributos se pueden especificar como marcas de la interfaz de línea de comandos (CLI) o como variables de entorno.

Tipos de funciones compatibles

Functions Framework admite ambos tipos de funciones compatibles con Cloud Run Functions. Todos los entornos de ejecución de lenguajes admiten los tipos de firma http y cloudevent.

Tipo de función Tipo de firma Descripción Entornos de ejecución compatibles
Funciones activadas por HTTP http Funciones que reciben y responden solicitudes HTTP Todos los entornos de ejecución
Funciones de CloudEvent cloudevent Formato de evento estándar de la industria Todos los entornos de ejecución

Especifica qué función se ejecutará

Debes especificar qué función dentro de tu código se debe ejecutar antes de ejecutar una función con Functions Framework. Para la mayoría de los lenguajes, puedes hacerlo si especificas el nombre del método de la función de destino como se muestra en las tablas a continuación. También se muestran las excepciones a esta regla, como Java y .NET.

Instrucciones por lenguaje

Consulta la tabla a continuación para obtener una lista de las opciones de configuración compatibles con cada lenguaje.

Node.js

Argumento de la CLI Variable de entorno Descripción
--port PORT El puerto en el que se deben escuchar las solicitudes (Predeterminado: 8080)
--target FUNCTION_TARGET El nombre de la función export que se invocará (Predeterminado: function)
--signature-type FUNCTION_SIGNATURE_TYPE El tipo de firma que usa tu función. Puede ser http (predeterminado), o cloudevent.

Python

Argumento de la CLI Variable de entorno Descripción
--port PORT El puerto en el que se deben escuchar las solicitudes (Predeterminado: 8080)
--target FUNCTION_TARGET El nombre de la función export que se invocará (Predeterminado: function)
--signature-type FUNCTION_SIGNATURE_TYPE El tipo de firma que usa tu función. Puede ser http (predeterminado), o cloudevent.

Go

Variable de entorno Descripción
PORT El puerto en el que se deben escuchar las solicitudes (Predeterminado: 8080)

Java

Nombre del argumento Variable de entorno Descripción
run.port PORT El puerto en el que se deben escuchar las solicitudes (Predeterminado: 8080)
run.functionTarget FUNCTION_TARGET El nombre de la función export que se invocará (Predeterminado: function)

C#

Argumento de la CLI Variable de entorno Descripción
--port PORT El puerto en el que se deben escuchar las solicitudes (Predeterminado: 8080)
--target (o solo el argumento) FUNCTION_TARGET El classname de la función que se invocará (Predeterminado: function)

Ruby

Argumento de la CLI Variable de entorno Descripción
--port PORT El puerto en el que se deben escuchar las solicitudes (Predeterminado: 8080)
--target FUNCTION_TARGET El nombre de la función export que se invocará (Predeterminado: function)

PHP

Variable de entorno Descripción
FUNCTION_TARGET El nombre de la función que se invocará (Default: function)
FUNCTION_SIGNATURE_TYPE El tipo de firma que usa tu función. Puede ser http (predeterminado), o cloudevent.

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

Node.js

Functions Framework para 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 puedes especificar estos valores en el archivo de compilación package.json si agregas una secuencia de comandos start con los argumentos de la CLI requeridos, como se muestra en el siguiente ejemplo.

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

Lo mismo se puede hacer con las variables de entorno:

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

Reemplaza YOUR_FUNCTION_NAME por el nombre del método y YOUR_SIGNATURE_TYPE por el tipo de firma de la función, si corresponde, como se muestra en la tabla anterior.

Python

Functions Framework para Python te permite especificar el nombre y el tipo de firma de la función como argumentos de línea de comandos o variables de entorno. Los argumentos de línea de comandos deben especificarse cuando ejecutas el framework.

Go

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

Java

Functions Framework para Java acepta datos de configuración de tres fuentes diferentes en el siguiente orden de prioridad (del más específico al menos específico):

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

Argumentos de la línea de comandos

Maven

Para especificar la función que deseas ejecutar, agrega la siguiente marca de la interfaz de línea de comandos (CLI) a los comandos mvn:

-Drun.functionTarget=YOUR_FUNCTION_NAME

También puedes especificar el puerto de destino si agregas la siguiente marca de la CLI de forma similar:

-Drun.port=12345

Gradle

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

# Maven version
-Drun.functionTarget=...

# Gradle version
-Prun.functionTarget=...

Archivos de compilación

También puedes especificar la función que desees ejecutar en el archivo de compilación del proyecto. Si bien Maven y Gradle tienen marcas similares de la CLI, sus cláusulas de archivo de compilación difieren de manera significativa.

Maven

Los archivos de compilación de Maven se denominan pom.xml. Agrega 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>

Reemplaza <functionTarget> por el nombre de clase de tu función. Por ejemplo, una función en el paquete functions con el nombre de clase HelloCloudFunctions tendría un nombre de clase functions.HelloCloudFunctions. Esto está relacionado con el archivo de compilación superior, ya sea pom.xml o build.gradle.

Gradle

Los archivos de compilación de Gradle se denominan build.gradle. Agrega 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 mediante dotnet new y una de las plantillas especificadas antes, Functions Framework para .NET detectará de forma automática la función.

Si tu proyecto contiene varias funciones, consulta la sección Ejecuta el framework a fin de obtener información para ejecutar una función específica.

Ruby

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

PHP

Functions Framework 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 si agregas una secuencia de comandos start como se muestra en el siguiente ejemplo.

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

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

Ejecuta Functions Framework

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

Node.js

npm start

Python

Usa los argumentos de línea de comandos:

functions-framework --target=YOUR_FUNCTION_NAME

Usa variables de entorno

FUNCTION_TARGET=YOUR_FUNCTION_NAME functions-framework

Reemplaza YOUR_FUNCTION_NAME por el nombre del método de la función.

Go

cd cmd
go build
./cmd

Usa 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 una variable de entorno:

FUNCTION_TARGET=YOUR_FUNCTION_NAME mvn function:run

Reemplaza YOUR_FUNCTION_NAME por el nombre de clase de la 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 una variable de entorno:

FUNCTION_TARGET=YOUR_FUNCTION_NAME ./gradlew runFunction

Reemplaza YOUR_FUNCTION_NAME por el nombre de clase de la función.

C#

Usa el siguiente comando para ejecutar la función cuando esté presente solo una función en el proyecto .NET actual (esta es la estructura predeterminada para los proyectos creados con plantillas).

dotnet run

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

dotnet run YOUR_FUNCTION_CLASSNAME

Si deseas ejecutar varias funciones de forma simultánea, deberás ejecutar varias instancias de Functions Framework. Para evitar conflictos entre las instancias de framework en ejecución, cada instancia debe usar un valor PORT diferente. En el siguiente comando, se muestra cómo ejecutar una función con un valor PORT de 8080.

Usa los argumentos de línea de comandos:

dotnet run --target YOUR_FUNCTION_CLASSNAME --port 8080

Usa variables de entorno

FUNCTION_TARGET=YOUR_FUNCTION_CLASSNAME PORT=8080 dotnet run

Ruby

Usa los argumentos de línea de comandos:

bundle exec functions-framework-ruby --target YOUR_FUNCTION_NAME

Usa variables de entorno

FUNCTION_TARGET=YOUR_FUNCTION_NAME bundle exec functions-framework-ruby

Reemplaza YOUR_FUNCTION_NAME por el nombre del método de la función.

PHP

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

Reemplaza YOUR_FUNCTION_NAME por el nombre de la función.

Cómo llamar a tu función

Consulta la página Llama a funciones locales si deseas obtener instrucciones para interactuar con la función que se ejecuta de forma local.

Limpia

Cuando termines de ejecutar la función, presiona Control + C para detener la instancia del framework en ejecución.