Esegui funzioni con il framework di Functions

Cloud Functions utilizza le librerie open source Functions Framework per eseguire il wrapping delle funzioni di cui hai eseguito il deployment in un'applicazione HTTP permanente.

Il framework di Functions può inoltre essere eseguito su qualsiasi altra piattaforma che supporti il linguaggio stesso, inclusi macchina locale, server on-premise, Compute Engine e Cloud Run.

Installa le dipendenze

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

Per ulteriori informazioni, consulta la libreria framework Java Functions.

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

Se utilizzi Maven, aggiungi quanto segue al 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 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 seguenti utilizzano i modelli .NET per creare un nuovo codebase della funzione Cloud Functions .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 di Functions deve essere aggiunto alle dipendenze della funzione per poterne eseguire il deployment in Cloud Functions:

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 specificare sia il tipo sia il nome della funzione che vuoi eseguire. Questi attributi possono essere specificati come flag dell'interfaccia a riga di comando o come variabili di ambiente.

Tipi di funzioni supportati

Il framework di Functions supporta tutti e tre i tipi di funzioni supportate da Cloud Functions (1ª generazione.). Tutti i runtime dei linguaggi supportano http e uno tra event o 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 in background event Formato degli eventi specifico per Cloud Functions Node.js, Python, Go, Java
Funzioni di CloudEvent cloudevent Formato dell'evento standard di settore .NET, Ruby, PHP

Specifica quale funzione eseguire

Prima di eseguire una funzione con il framework di Functions, devi specificare quale funzione all'interno del codice deve essere eseguita. Per la maggior parte delle lingue, puoi farlo specificando il nome del metodo della funzione target, come mostrato nelle tabelle seguenti. (Le eccezioni a questa regola, ad esempio Java e .NET, sono riportate di seguito.)

Istruzioni in base alla lingua

Consulta la tabella seguente per un elenco delle opzioni di configurazione supportate da ciascuna lingua.

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 exported da richiamare. (Valore predefinito: function)
--signature-type FUNCTION_SIGNATURE_TYPE Il tipo di firma utilizzato dalla tua funzione. Può essere uno dei seguenti valori: http (valore predefinito), event 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 exported da richiamare. (Valore predefinito: function)
--signature-type FUNCTION_SIGNATURE_TYPE Il tipo di firma utilizzato dalla tua funzione. Può essere uno dei seguenti valori: http (valore predefinito), event o cloudevent.

Go

Variabile di ambiente Descrizione
PORT La porta su cui rimanere in ascolto delle 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 rimanere in ascolto delle richieste. (Valore predefinito: 8080)
--target (o solo argomento) FUNCTION_TARGET Il nome classe della funzione da richiamare. (Valore predefinito: function)

Ruby

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 exported 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 tua funzione. Può essere uno dei seguenti valori: http (valore predefinito), event o cloudevent.

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

Node.js

Il framework delle funzioni 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 dell'interfaccia a riga di comando richiesti, come mostrato nell'esempio di seguito.

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

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 illustrato nella tabella riportata sopra.

Python

Il framework delle funzioni Python 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.

Go

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

Java

Il framework di funzioni Java accetta dati di configurazione da tre origini diverse, nel seguente ordine di priorità (dal più specifico al meno specifico):

  • Argomenti della riga di comando
  • File di build
  • Variabili di ambiente

Argomenti della riga di comando

Maven

Puoi specificare la funzione da eseguire aggiungendo il seguente flag dell'interfaccia a riga di comando (CLI) ai tuoi 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 modo simile:

-Drun.port=12345

Gradle

I flag dell'interfaccia a riga di comando di Gradle sono quasi identici a quelli di Maven. L'unica modifica apportata da Gradle è lo scambio del valore -D iniziale in ogni flag con un -P, come mostrato nell'esempio di seguito:

# Maven version
-Drun.functionTarget=...

# Gradle version
-Prun.functionTarget=...

File di build

Puoi anche specificare la funzione che vuoi eseguire nel file di build del progetto. Sebbene Maven e Gradle abbiano flag dell'interfaccia a riga di comando simili, le 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 specificare 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 nome di classe HelloCloudFunctions avrà il nome di classe functions.HelloCloudFunctions. È relativo al file di build padre pom.xml o build.gradle).

Gradle

I file di build 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 in precedenza, .NET Functions Framework rileverà automaticamente la funzione.

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

Ruby

Il framework di funzioni Ruby 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 di PHP Functions consente di specificare le 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 di seguito.

"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 illustrato nella tabella riportata sopra.

Esegui il framework di Functions

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

Node.js

npm start

Python

functions-framework --target=YOUR_FUNCTION_NAME

Sostituisci YOUR_FUNCTION_NAME con il nome del metodo della funzione.

Go

cd cmd
go build
./cmd

Java

Maven

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

mvn function:run

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

mvn function:run -Drun.functionTarget=YOUR_FUNCTION_NAME

Sostituisci YOUR_FUNCTION_NAME con il nome classe della funzione.

Gradle

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

./gradlew runFunction

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

./gradlew runFunction -Prun.functionTarget=YOUR_FUNCTION_NAME

Sostituisci YOUR_FUNCTION_NAME con il nome classe della funzione.

C#

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

dotnet run

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

dotnet run YOUR_FUNCTION_CLASSNAME

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

dotnet run --target YOUR_FUNCTION_CLASSNAME --port 8080

Ruby

bundle exec functions-framework-ruby --target YOUR_FUNCTION_NAME

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

Per le istruzioni su come interagire con la funzione eseguita localmente, consulta la pagina relativa alle chiamate delle funzioni locali.

Esegui la pulizia

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