Exécuter des fonctions avec les frameworks des fonctions

En interne, Cloud Functions utilise des bibliothèques Open Source appelées frameworks des fonctions qui encapsulent les fonctions utilisateur au sein d'une application HTTP persistante.

Les frameworks des fonctions peuvent également s'exécuter sur n'importe quelle plate-forme compatible avec le langage proprement dit, y compris votre machine locale, vos serveurs sur site, Compute Engine et Clou Run.

Installer les dépendances

Dans le répertoire de votre fonction, installez la bibliothèque du framework des fonctions pour votre langage :

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 vous utilisez Maven, ajoutez les lignes suivantes à votre fichier pom.xml :

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

Gradle

Si vous utilisez Gradle, ajoutez les lignes suivantes à votre fichier build.gradle :

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

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

C#

Les commandes ci-dessous exploitent des modèles .NET pour créer un codebase Cloud Functions .NET avec la bibliothèque du framework des fonctions .NET en tant que dépendance :

# HTTP functions
dotnet new gcf-http

# CloudEvent functions
dotnet new gcf-event

Ruby

Dans Ruby, le framework des fonctions doit être ajouté aux dépendances de votre fonction afin de pouvoir le déployer dans Cloud Functions :

bundle add functions_framework

PHP

composer require google/cloud-functions-framework

Configurer le framework

Avant d'exécuter une fonction à l'aide du framework des fonctions, vous devez d'abord spécifier le type et le nom de la fonction concernée. Ces attributs peuvent être spécifiés en tant qu'options d'interface de ligne de commande (CLI) ou en tant que variables d'environnement.

Types de fonctions

Collectivement, le framework des fonctions est compatible avec trois types de fonctions acceptés par Cloud Functions. Chaque environnement d'exécution de langage n'accepte généralement que deux de ces formats : http et event ou cloudevent.

Type de fonction Type de signature Description Environnements d'exécution acceptés
Fonctions déclenchées par HTTP http Fonctions qui reçoivent des requêtes HTTP et y répondent. Tous
Fonctions d'arrière-plan event Format d'événement spécifique à Cloud Functions Java, Node.js, Go et Python
Fonctions CloudEvent cloudevent Format d'événement standard dans l'industrie PHP, Ruby et .NET

Spécifier la fonction à exécuter

Avant d'exécuter une fonction avec le framework des fonctions, vous devez d'abord spécifier quelle fonction dans votre code doit être exécutée. Dans la plupart des langages, vous pouvez pour cela spécifier le nom de la méthode de la fonction cible, comme indiqué dans les tableaux ci-dessous. (Les exceptions à cette règle, telles que Java et .NET, sont également décrites ci-dessous.)

Instructions pour chaque langage

Pour connaître la liste des options de configuration compatibles avec chaque langage, reportez-vous au tableau ci-dessous.

Node.js

Argument CLI Variable d'environnement Description
--port PORT Port sur lequel écouter les requêtes. (Par défaut : 8080)
--target FUNCTION_TARGET Nom de la fonction exportée (export) à appeler. (Par défaut : function)
--signature-type FUNCTION_SIGNATURE_TYPE Type de signature utilisé par votre fonction. Il peut s'agir de http (par défaut), de event ou de cloudevent.

Python

Argument CLI Variable d'environnement Description
--port PORT Port sur lequel écouter les requêtes. (Par défaut : 8080)
--target FUNCTION_TARGET Nom de la fonction exportée (export) à appeler. (Par défaut : function)
--signature-type FUNCTION_SIGNATURE_TYPE Type de signature utilisé par votre fonction. Il peut s'agir de http (par défaut), de event ou de cloudevent.

Go

Variable d'environnement Description
PORT Port sur lequel écouter les requêtes. (Par défaut : 8080)

Java

Nom de l'argument Variable d'environnement Description
run.port PORT Port sur lequel écouter les requêtes. (Par défaut : 8080)
run.functionTarget FUNCTION_TARGET Nom de la fonction exportée (export) à appeler. (Par défaut : function)

C#

Argument CLI Variable d'environnement Description
--port PORT Port sur lequel écouter les requêtes. (Par défaut : 8080)
--target (ou argument seul) FUNCTION_TARGET Nom de classe de la fonction à appeler. (Par défaut : function)

Ruby

Argument CLI Variable d'environnement Description
--port PORT Port sur lequel écouter les requêtes. (Par défaut : 8080)
--target FUNCTION_TARGET Nom de la fonction exportée (export) à appeler. (Par défaut : function)

PHP

Variable d'environnement Description
FUNCTION_TARGET Nom de la fonction à appeler. (Par défaut : function)
FUNCTION_SIGNATURE_TYPE Type de signature utilisé par votre fonction. Il peut s'agir de http (par défaut), de event ou de cloudevent.

Suivez les instructions ci-dessous pour configurer et exécuter le framework des fonctions :

Node.js

Le framework des fonctions Node.js vous permet de spécifier le nom et le type de signature de votre fonction en tant qu'arguments de ligne de commande ou en tant que variables d'environnement.

Vous pouvez également spécifier ces valeurs dans le fichier de build package.json en ajoutant un script start avec les arguments CLI requis, comme illustré dans l'exemple ci-dessous.

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

Remplacez YOUR_FUNCTION_NAME par le nom de la méthode de votre fonction et YOUR_SIGNATURE_TYPE (le cas échéant) par le type de signature de votre fonction, comme indiqué dans le tableau ci-dessus.

Python

Le framework des fonctions Python vous permet de spécifier le nom et le type de signature de votre fonction en tant qu'arguments de ligne de commande ou en tant que variables d'environnement. Les arguments de ligne de commande doivent être spécifiés lorsque vous exécutez le framework.

Go

Le framework des fonctions Go utilise funcframework.RegisterHTTPFunctionContext pour spécifier le type de signature et la cible de la fonction.

Java

Le framework des fonctions Java accepte des données de configuration provenant de trois sources différentes, dans l'ordre de priorité suivant (du plus spécifique au moins spécifique) :

  • Arguments de ligne de commande
  • Fichiers de build
  • Variables d'environnement

Arguments de ligne de commande

Maven

Vous pouvez spécifier la fonction à exécuter en ajoutant l'option d'interface de ligne de commande (CLI) suivante à vos commandes mvn :

-Drun.functionTarget=YOUR_FUNCTION_NAME

Vous pouvez également spécifier le port cible en ajoutant l'option CLI suivante de la même manière :

-Drun.port=12345

Gradle

Les options CLI de Gradle sont presque identiques à celles de Maven. La seule différence est que Gradle remplace l'élément -D initial de chaque option par -P, comme le montre l'exemple ci-dessous :

# Maven version
-Drun.functionTarget=...

# Gradle version
-Prun.functionTarget=...

Fichiers de build

Vous pouvez également spécifier la fonction à exécuter dans le fichier de build de votre projet. Bien que Maven et Gradle présentent des options CLI similaires, leurs clauses de fichier de build sont sensiblement différentes.

Maven

Les fichiers de build Maven sont nommés pom.xml. Ajoutez la clause suivante à ce fichier pour spécifier une fonction cible :

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

Remplacez YOUR_FUNCTION_PACKAGE_NAME par le nom du package de votre fonction.

Gradle

Les fichiers de build Gradle sont nommés build.gradle. Ajoutez la clause suivante à ce fichier pour spécifier une fonction cible :

// 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)
  }
}

Remplacez YOUR_FUNCTION_CLASS_NAME par le nom de classe de votre fonction. (Par exemple, une fonction du package functions avec le nom de classe HelloCloudFunctions possède le nom de classe functions.HelloCloudFunctions.)

C#

Si vous créez votre projet à l'aide de dotnet new et de l'un des modèles spécifiés ci-dessus, le framework des fonctions .NET détecte automatiquement votre fonction.

Si votre projet contient plusieurs fonctions, consultez la section Exécuter le framework pour en savoir plus sur l'exécution d'une fonction spécifique.

Ruby

Le framework des fonctions Ruby vous permet de spécifier le nom et le type de signature de votre fonction en tant qu'arguments de ligne de commande ou en tant que variables d'environnement. Les arguments de ligne de commande doivent être spécifiés lorsque vous exécutez le framework.

PHP

Le framework des fonctions PHP vous permet de spécifier des variables d'environnement en tant qu'arguments de ligne de commande.

Vous pouvez également spécifier ces valeurs dans le fichier de compilation composer.json en ajoutant un script start, comme illustré dans l'exemple ci-dessous.

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

Remplacez YOUR_FUNCTION_NAME par le nom de votre fonction et YOUR_SIGNATURE_TYPE (le cas échéant) par le type de signature de votre fonction, comme indiqué dans le tableau ci-dessus.

Exécuter le framework

Utilisez la commande ci-dessous pour exécuter votre fonction avec le framework des fonctions. Par défaut, votre fonction est accessible à l'adresse localhost:8080, sauf si vous spécifiez explicitement une valeur PORT.

Node.js

npm start

Python

functions_framework --target=YOUR_FUNCTION_NAME

Remplacez YOUR_FUNCTION_NAME par le nom de la méthode de votre fonction.

Go

cd cmd
go build
./cmd

Java

Maven

Utilisez la commande suivante pour exécuter une fonction spécifiée dans pom.xml :

mvn function:run

Utilisez la commande suivante pour exécuter une fonction spécifiée dans un argument de ligne de commande :

mvn function:run -Drun.functionTarget=YOUR_FUNCTION_NAME

Remplacez YOUR_FUNCTION_NAME par le nom de classe de votre fonction.

Gradle

Utilisez la commande suivante pour exécuter une fonction spécifiée dans build.gradle :

./gradlew runFunction

Utilisez la commande suivante pour exécuter une fonction spécifiée dans un argument de ligne de commande :

./gradlew runFunction -Prun.functionTarget=YOUR_FUNCTION_NAME

Remplacez YOUR_FUNCTION_NAME par le nom de classe de votre fonction.

C#

Utilisez la commande suivante pour exécuter votre fonction lorsqu'une seule fonction est présente dans le projet .NET actuel. (Il s'agit de la structure par défaut pour les projets créés à l'aide d'un modèle.)

dotnet run

Si votre projet .NET contient plusieurs fonctions, utilisez la commande suivante pour exécuter une fonction spécifique. Remplacez YOUR_FUNCTION_CLASSNAME par le nom de classe de votre fonction, en incluant l'espace de noms.

dotnet run YOUR_FUNCTION_CLASSNAME

Si vous souhaitez exécuter plusieurs fonctions simultanément, vous devez exécuter plusieurs instances du framework des fonctions. Pour éviter les conflits entre les instances du framework en cours d'exécution, chaque instance doit utiliser une valeur PORT différente. La commande suivante montre comment exécuter une fonction avec une valeur PORT définie sur 8080.

dotnet run --target YOUR_FUNCTION_CLASSNAME --port 8080

Ruby

bundle exec functions-framework-ruby --target YOUR_FUNCTION_NAME

Remplacez YOUR_FUNCTION_NAME par le nom de la méthode de votre fonction.

PHP

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

Remplacez YOUR_FUNCTION_NAME par le nom de votre fonction.

Appeler votre fonction

Consultez la page Appeler des fonctions en cours d'exécution pour découvrir comment interagir avec votre fonction exécutée localement.

Nettoyer

Une fois l'exécution de votre fonction terminée, appuyez sur CTRL-C pour arrêter l'instance du framework en cours d'exécution.