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
:
Gradle
Si usas Gradle, agrega lo siguiente al archivo build.gradle
:
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:
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:
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.
Llama 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.