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
:
Gradle
Si usas Gradle, añade lo siguiente al archivo build.gradle
:
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 export editada 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 export editada 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 export editada 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 export editada 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:
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:
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.