Esegui funzioni con il framework di Functions

Le funzioni Cloud Run utilizzano le librerie open source Functions Framework per racchiudere le funzioni di cui è stato eseguito il deployment in un'applicazione HTTP persistente.

Il framework di Functions può essere eseguito anche su qualsiasi altra piattaforma che supporta del linguaggio stesso, tra cui la tua macchina locale, i server on-premise, Compute Engine e Cloud Run.

Installa le dipendenze

Nella directory della funzione, installa la libreria Functions Framework per la tua lingua:

Per ulteriori informazioni, consulta la libreria Java Functions Framework.

Node.js

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

Python

pip3 install functions-framework

Vai

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

Java

Maven

Se utilizzi Maven, aggiungi il parametro che segue al tuo file pom.xml:

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

Gradle

Se utilizzi Gradle, aggiungi quanto segue al tuo File 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#

I comandi riportati di seguito utilizzano i modelli .NET per creare un nuovo codice di funzione Cloud Run .NET con la libreria .NET Functions Framework come dipendenza:

# HTTP functions
dotnet new gcf-http

# CloudEvent functions
dotnet new gcf-event

Ruby

In Ruby, il framework Functions deve essere aggiunto alle dipendenze della funzione per poter eseguire il deployment nelle funzioni Cloud Run:

bundle add functions_framework

PHP

composer require google/cloud-functions-framework

Configura il framework di Functions

Prima di eseguire una funzione utilizzando il framework di Functions, devi prima specificare sia il tipo sia il nome della funzione che vuoi eseguire. Questi gli attributi possono essere specificati come flag dell'interfaccia a riga di comando o come variabili di ambiente.

Tipi di funzioni supportati

Il framework Functions supporta entrambi i tipi di funzioni supportati dalle funzioni Cloud Run. Tutti i runtime linguistici supportano sia i tipi di firma http che cloudevent.

Tipo di funzione Tipo di firma Descrizione Supporto dei runtime
Funzioni attivate da HTTP http Funzioni che ricevono e rispondono alle richieste HTTP. Tutti i runtime
Funzioni di CloudEvent cloudevent Formato dell'evento standard di settore Tutti i runtime

Specifica la funzione da eseguire

Prima di eseguire una funzione con il framework Functions, devi prima specificare la funzione all'interno del codice da eseguire. Per la maggior parte delle lingue, puoi specificando il nome del metodo della funzione target come mostrato in tabelle seguenti. (Eccezioni a questa regola, ad esempio Java e .NET è mostrato di seguito.

Istruzioni in base alla lingua

Nella tabella seguente è riportato un elenco delle opzioni di configurazione supportate da ogni linguaggio.

Node.js

Argomento interfaccia a riga di comando Variabile di ambiente Descrizione
--port PORT La porta su cui rimanere in ascolto delle richieste. (Valore predefinito: 8080)
--target FUNCTION_TARGET Il nome della funzione export da richiamare. (valore predefinito: function)
--signature-type FUNCTION_SIGNATURE_TYPE Il tipo di firma utilizzato dalla funzione. Può essere http (il valore predefinito) o cloudevent.

Python

Argomento interfaccia a riga di comando Variabile di ambiente Descrizione
--port PORT La porta su cui rimanere in ascolto delle richieste. (Valore predefinito: 8080)
--target FUNCTION_TARGET Il nome della funzione export da richiamare. (valore predefinito: function)
--signature-type FUNCTION_SIGNATURE_TYPE Il tipo di firma utilizzato dalla funzione. Può essere http (il valore predefinito) o cloudevent.

Vai

Variabile di ambiente Descrizione
PORT La porta su cui attendere le richieste. (Valore predefinito: 8080)

Java

Nome argomento Variabile di ambiente Descrizione
run.port PORT La porta su cui rimanere in ascolto delle richieste. (Valore predefinito: 8080)
run.functionTarget FUNCTION_TARGET Il nome della funzione exported da richiamare. (valore predefinito: function)

C#

Argomento interfaccia a riga di comando Variabile di ambiente Descrizione
--port PORT La porta su cui attendere le richieste. (Valore predefinito: 8080)
--target (o solo argomento) FUNCTION_TARGET Il nomeclasse della funzione da richiamare. (valore predefinito: function)

Ruby

Argomento CLI Variabile di ambiente Descrizione
--port PORT La porta su cui rimanere in ascolto delle richieste. (Valore predefinito: 8080)
--target FUNCTION_TARGET Il nome della funzione export da richiamare. (valore predefinito: function)

PHP

Variabile di ambiente Descrizione
FUNCTION_TARGET Il nome della funzione da richiamare. (valore predefinito: function)
FUNCTION_SIGNATURE_TYPE Il tipo di firma utilizzato dalla funzione. Può essere http (il valore predefinito) o cloudevent.

Segui le istruzioni riportate di seguito per configurare ed eseguire il framework Functions:

Node.js

Il framework Functions di Node.js ti consente di specificare il nome e il tipo di firma della funzione come argomenti della riga di comando o variabili di ambiente.

Puoi anche specificare questi valori nel file di build package.json aggiungendo uno script start con gli argomenti CLI richiesti, come mostrato nell'esempio seguente.

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

Lo stesso può essere fatto utilizzando le variabili di ambiente:

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

Sostituisci YOUR_FUNCTION_NAME con il nome del metodo della funzione e YOUR_SIGNATURE_TYPE (se applicabile) con il tipo di firma della funzione come mostrato nella tabella sopra.

Python

Il framework delle funzioni Python consente di specificare il nome e tipo di firma come argomenti della riga di comando o variabili di ambiente. Gli argomenti della riga di comando devono essere specificati quando esegui il framework.

Vai

Il framework Go Functions utilizza funcframework.RegisterHTTPFunctionContext per specificare il target e il tipo di firma della funzione.

Java

Java Functions Framework accetta i dati di configurazione da tre diverse fonti, nel seguente ordine di priorità (dal più specifico al meno specifico):

  • Argomenti della riga di comando
  • Buildfiles
  • Variabili di ambiente

Argomenti della riga di comando

Maven

Puoi specificare la funzione da eseguire aggiungendo il seguente opzione dell'interfaccia a riga di comando (CLI) ai comandi mvn:

-Drun.functionTarget=YOUR_FUNCTION_NAME

Puoi anche specificare la porta di destinazione aggiungendo il seguente flag dell'interfaccia a riga di comando in un in modo simile:

-Drun.port=12345

Gradle

I flag della CLI di Gradle sono quasi identici a quelli di Maven. L'unica modifica apportata da Gradle è sostituire il -D iniziale in ogni flag con un -P, come mostrato nell'esempio riportato di seguito:

# Maven version
-Drun.functionTarget=...

# Gradle version
-Prun.functionTarget=...

Buildfiles

Puoi anche specificare la funzione che vuoi eseguire nel file di build del progetto. Sebbene Maven e Gradle abbiano flag CLI simili, le relative clausole del file di build differiscono in modo significativo.

Maven

I file di build Maven sono denominati pom.xml. Aggiungi la seguente clausola a questo file per specifica una funzione target:

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

Sostituisci <functionTarget> con il nome della classe della funzione. Ad esempio, una funzione nel pacchetto functions con il nome della classe HelloCloudFunctions avrebbe il nome della classe functions.HelloCloudFunctions. Questo valore è relativo al file di compilazione principale (pom.xml o build.gradle).

Gradle

I file di build di Gradle sono denominati build.gradle. Aggiungi la seguente clausola a questo file per specificare una funzione target:

// 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#

Se crei il progetto utilizzando dotnet new e uno dei modelli specificati sopra, il framework .NET Functions rileverà automaticamente la funzione.

Se il progetto contiene più funzioni, consulta la sezione Eseguire il framework per informazioni su come eseguire una funzione specifica.

Ruby

Il framework Ruby Functions ti consente di specificare il nome e il tipo di firma della funzione come argomenti della riga di comando o variabili di ambiente. Gli argomenti della riga di comando devono essere specificati quando esegui il framework.

PHP

Il framework PHP Functions ti consente di specificare variabili di ambiente come argomenti della riga di comando.

Puoi anche specificare questi valori nel file di build composer.json aggiungendo uno script start come mostrato nell'esempio seguente.

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

Sostituisci YOUR_FUNCTION_NAME con il nome della funzione e YOUR_SIGNATURE_TYPE (se applicabile) con il tipo di firma della funzione, come mostrato nella tabella sopra.

esegui il framework di Functions

Utilizza il comando seguente per eseguire la funzione con il framework Functions. Per impostazione predefinita, la funzione sarà accessibile in localhost:8080 a meno che tu specificare esplicitamente un valore PORT.

Node.js

npm start

Python

Utilizzo degli argomenti della riga di comando:

functions-framework --target=YOUR_FUNCTION_NAME

Utilizzo delle variabili di ambiente:

FUNCTION_TARGET=YOUR_FUNCTION_NAME functions-framework

Sostituisci YOUR_FUNCTION_NAME con il nome del metodo della funzione.

Vai

cd cmd
go build
./cmd

Utilizzo delle variabili di ambiente:

cd cmd
go build
PORT=8080 ./cmd

Java

Maven

Utilizza questo comando per eseguire una funzione specificata in pom.xml:

mvn function:run

Utilizza il seguente comando per eseguire una funzione specificata in una riga di comando argomento:

mvn function:run -Drun.functionTarget=YOUR_FUNCTION_NAME

Utilizza questo comando per eseguire una funzione specificata come variabile di ambiente:

FUNCTION_TARGET=YOUR_FUNCTION_NAME mvn function:run

Sostituisci YOUR_FUNCTION_NAME con il nome classe della funzione.

Gradle

Utilizza il seguente comando per eseguire una funzione specificata in build.gradle:

./gradlew runFunction

Utilizza il seguente comando per eseguire una funzione specificata in un argomento della riga di comando:

./gradlew runFunction -Prun.functionTarget=YOUR_FUNCTION_NAME

Utilizza questo comando per eseguire una funzione specificata come variabile di ambiente:

FUNCTION_TARGET=YOUR_FUNCTION_NAME ./gradlew runFunction

Sostituisci YOUR_FUNCTION_NAME con il nome della classe della funzione.

C#

Utilizza il comando seguente per eseguire la funzione quando nel progetto .NET corrente è presente esattamente una funzione. Questa è la struttura predefinita per i progetti creati da modelli.

dotnet run

Se il progetto .NET contiene più funzioni, usa il comando seguente per eseguire una funzione specifica. Sostituisci YOUR_FUNCTION_CLASSNAME con il nome della classe della funzione, incluso lo spazio dei nomi.

dotnet run YOUR_FUNCTION_CLASSNAME

Se vuoi eseguire più funzioni contemporaneamente, devi eseguire più istanze di Functions Framework. Per evitare conflitti tra le istanze del framework in esecuzione, ogni istanza deve utilizzare un valore PORT diverso. La Il seguente comando mostra come eseguire una funzione con un valore PORT pari a 8080.

Utilizzo degli argomenti della riga di comando:

dotnet run --target YOUR_FUNCTION_CLASSNAME --port 8080

Utilizzo delle variabili di ambiente:

FUNCTION_TARGET=YOUR_FUNCTION_CLASSNAME PORT=8080 dotnet run

Ruby

Utilizzo degli argomenti della riga di comando:

bundle exec functions-framework-ruby --target YOUR_FUNCTION_NAME

Utilizzo delle variabili di ambiente:

FUNCTION_TARGET=YOUR_FUNCTION_NAME bundle exec functions-framework-ruby

Sostituisci YOUR_FUNCTION_NAME con il nome del metodo della funzione.

PHP

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

Sostituisci YOUR_FUNCTION_NAME con il nome della funzione.

Richiama la funzione

Consulta la pagina Chiamata a funzioni locali per istruzioni su come interagire con la funzione in esecuzione locale.

Esegui la pulizia

Al termine dell'esecuzione della funzione, arresta l'istanza del framework in esecuzione premendo Ctrl+C.