Le funzioni Cloud Run supportano diversi metodi per eseguire le funzioni al di fuori dell'ambiente di deployment di destinazione. Questo è particolarmente utile per lo sviluppo iterativo e per le situazioni in cui vuoi testare la funzione prima del deployment.
La possibilità di eseguire le funzioni senza eseguirne il deployment può semplificare i test locali, la conformità alle limitazioni relative alla località dei dati e i deployment multicloud:
Restrizioni di località dei dati: testa la funzione localmente senza accedere ai dati di produzione per evitare di violare le regole di località dei dati della tua organizzazione.
Deployment multi-cloud: i deployment delle funzioni multi-cloud sono uno schema consolidato per ridurre il rischio di tempi di riposo in ambienti in cui l'affidabilità è fondamentale. Il deployment di funzioni in ambienti diversi dalle funzioni Cloud Run stesse riduce il rischio che la tua applicazione abbia tempi di riposo imprevisti.
Sviluppare funzioni localmente utilizzando il framework di funzioni
Puoi sviluppare e testare le funzioni localmente utilizzando Functions Framework. Lo sviluppo di una funzione localmente può aiutarti a testare il codice senza dover ricostruire il contenitore della funzione. In questo modo puoi risparmiare tempo e semplificare il test della funzione.
Cloud Run utilizza le librerie open source Functions Framework per racchiudere le funzioni di cui è stato eseguito il deployment in un'applicazione HTTP persistente.
Il framework Functions può essere eseguito anche su qualsiasi altra piattaforma che supporti il linguaggio stesso, inclusa la tua macchina locale, i server on-premise e Compute Engine.
Installa le dipendenze
Nella directory della funzione, installa la libreria Functions Framework per il tuo linguaggio:
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 quanto segue al file pom.xml
:
Gradle
Se utilizzi Gradle, aggiungi quanto segue al tuo
build.gradle
file:
Per ulteriori informazioni, consulta la libreria Java Functions Framework.
C#
I seguenti comandi utilizzano i modelli .NET per creare un nuovo codebase della funzione .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 eseguirne il deployment in 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 Functions, devi prima specificare sia il tipo sia il nome della funzione da eseguire. Questi attributi possono essere specificati come flag dell'interfaccia a riga di comando (CLI) 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 | Runtime supportati |
---|---|---|---|
Funzioni attivate da HTTP |
http
|
Funzioni che ricevono e rispondono alle richieste HTTP. | Tutti i runtime |
Funzioni CloudEvent |
cloudevent
|
Formato degli eventi 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 da eseguire nel codice. Per la maggior parte delle lingue, puoi farlo specificando il nome del metodo della funzione di destinazione come mostrato nelle seguenti tabelle. Tieni presente che esistono eccezioni a questa regola per gli ambienti di runtime Java e .NET.
Istruzioni per lingua
Consulta la tabella seguente per un elenco delle opzioni di configurazione supportate da ciascun linguaggio.
Node.js
Argomento CLI | Variabile di ambiente | Descrizione |
---|---|---|
--port
|
PORT
|
La porta su cui attendere le richieste. (valore predefinito: 8080 )
|
--target
|
FUNCTION_TARGET
|
Il nome della funzione export ata 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 CLI | Variabile di ambiente | Descrizione |
---|---|---|
--port
|
PORT
|
La porta su cui attendere le richieste. (valore predefinito: 8080 )
|
--target
|
FUNCTION_TARGET
|
Il nome della funzione export ata 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 attendere le richieste. (valore predefinito: 8080 )
|
run.functionTarget
|
FUNCTION_TARGET
|
Il nome della funzione export ata da richiamare. (valore predefinito:
function )
|
C#
Argomento CLI | 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 attendere le richieste. (valore predefinito: 8080 )
|
--target
|
FUNCTION_TARGET
|
Il nome della funzione export ata 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 queste istruzioni 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 sezione Tipi di funzioni supportati.
Python
Il framework di funzioni Python 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.
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
- Buildfile
- 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 CLI 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 seguente:
# Maven version -Drun.functionTarget=... # Gradle version -Prun.functionTarget=...
Buildfile
Puoi anche specificare la funzione da eseguire nel file 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 compilazione di Maven sono denominati pom.xml
. Aggiungi la seguente clausola a questo file per
specificare una funzione target:
Sostituisci <functionTarget>
con il nome della classe della funzione. Ad esempio, una funzione nel pacchetto functions
con nome di classe
HelloCloudFunctions
avrà un nome di classe
functions.HelloCloudFunctions
. Si riferisce 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:
C#
Se crei il progetto utilizzando dotnet new
e uno dei modelli specificati
in precedenza, 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; non è incluso nell'esempio mostrato qui).
Esegui la funzione
Utilizza il comando seguente per eseguire la funzione con il framework Functions.
Per impostazione predefinita, la funzione sarà accessibile all'indirizzo localhost:8080
, a meno che non specifichi 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
Per prima cosa, crea un file cmd/main.go
come descritto sul sito
Functions Framework for Go.
cd cmd go build ./cmd
Utilizzo delle variabili di ambiente:
cd cmd go build PORT=8080 ./cmd
Java
Maven
Utilizza il seguente comando per eseguire una funzione specificata in pom.xml
:
mvn function:run
Utilizza il seguente comando per eseguire una funzione specificata in un argomento della riga di comando:
mvn function:run -Drun.functionTarget=YOUR_FUNCTION_NAME
Utilizza il comando seguente per eseguire una funzione specificata come variabile di ambiente:
FUNCTION_TARGET=YOUR_FUNCTION_NAME mvn function:run
Sostituisci YOUR_FUNCTION_NAME con il nome della 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 il comando seguente 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. Tieni presente che questa è la struttura predefinita per i progetti creati da modelli.
dotnet run
Se il progetto .NET contiene più funzioni, utilizza il seguente comando 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. Il
comando seguente mostra come eseguire una funzione con un valore PORT
di 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.
Chiama la funzione in esecuzione locale
Gli esercizi in questa sezione presuppongono che tu abbia configurato una funzione in esecuzione locale su localhost
utilizzando il Functions Framework.
Puoi attivare le funzioni in esecuzione locale inviando richieste HTTP instradate tramite un processo di pubblicazione locale.
Funzioni HTTP
Quando testi la funzione HTTP dal tuo ambiente di sviluppo, in genere ascolta le richieste su localhost:8080
. Questa interfaccia è accessibile solo dalla macchina o dalla VM su cui è in esecuzione la funzione. Le richieste inviate da qualsiasi altro sistema non possono raggiungerla. Per questo motivo, devi emettere la richiesta HTTP dallo stesso sistema su cui è in esecuzione la funzione. Nei seguenti esempi, se la funzione è in ascolto su una porta diversa da 8080, sostituisci 8080 nell'esempio con il numero di porta della funzione.
Test delle funzioni HTTP con Cloud Shell
Se utilizzi Cloud Shell per creare e testare la funzione, avviala localmente nella finestra del terminale di Cloud Shell, quindi emetti la richiesta di attivazione HTTP da un browser o da un'istanza curl
come segue:
Browser
Fai clic sull'icona nella barra degli strumenti di Cloud Shell e scegli porta 8080 o Cambia porta per scegliere un'altra porta. Si aprirà una finestra del browser sul sistema corretto e verrà inviata una richiesta GET alla porta indicata.
Curl
Per controllare il formato della richiesta HTTP o per visualizzare la risposta non formattata,
utilizza curl
:
- Fai clic sull'icona + nella barra dei menu di Cloud Shell per aprire una nuova finestra del terminale sullo stesso sistema su cui è in esecuzione la funzione.
Da questa finestra, esegui il comando
curl
per attivare la funzione. Ad esempio:curl localhost:8080
Test delle funzioni HTTP sul server desktop
Se stai creando ed eseguendo la funzione sul tuo sistema desktop locale, avviala innanzitutto in locale, quindi emetti la richiesta di attivazione HTTP da un browser o da un'istanza curl
come segue:
Browser
Apri una nuova finestra o scheda del browser e digita http://localhost:8080
nella barra degli indirizzi del browser. Si apre una finestra del browser su localhost:8080
sul
suo
server desktop per attivare la funzione.
Curl
Apri una nuova finestra del terminale sul computer locale, quindi esegui il comando curl
nella finestra per attivare la funzione. Ad esempio:
curl localhost:8080
Viene eseguito il comando curl
specificato per attivare la funzione e viene visualizzata la risposta non formattata.
Funzioni CloudEvent
Puoi inviare eventi di esempio alle
funzioni CloudEvent
utilizzando curl
. Le seguenti richieste curl
mostrano come inviare eventi di Pub/Sub e Cloud Storage di esempio a una funzione CloudEvent in esecuzione su localhost:8080
.
Pub/Sub
curl localhost:8080 \ -X POST \ -H "Content-Type: application/json" \ -H "ce-id: 123451234512345" \ -H "ce-specversion: 1.0" \ -H "ce-time: 2020-01-02T12:34:56.789Z" \ -H "ce-type: google.cloud.pubsub.topic.v1.messagePublished" \ -H "ce-source: //pubsub.googleapis.com/projects/MY-PROJECT/topics/MY-TOPIC" \ -d '{ "message": { "data": "d29ybGQ=", "attributes": { "attr1":"attr1-value" } }, "subscription": "projects/MY-PROJECT/subscriptions/MY-SUB" }'
Cloud Storage
curl localhost:8080 \ -X POST \ -H "Content-Type: application/json" \ -H "ce-id: 123451234512345" \ -H "ce-specversion: 1.0" \ -H "ce-time: 2020-01-02T12:34:56.789Z" \ -H "ce-type: google.cloud.storage.object.v1.finalized" \ -H "ce-source: //storage.googleapis.com/projects/_/buckets/MY-BUCKET-NAME" \ -H "ce-subject: objects/MY_FILE.txt" \ -d '{ "bucket": "MY_BUCKET", "contentType": "text/plain", "kind": "storage#object", "md5Hash": "...", "metageneration": "1", "name": "MY_FILE.txt", "size": "352", "storageClass": "MULTI_REGIONAL", "timeCreated": "2020-04-23T07:38:57.230Z", "timeStorageClassUpdated": "2020-04-23T07:38:57.230Z", "updated": "2020-04-23T07:38:57.230Z" }'