Questo tutorial mostra come utilizzare le funzioni Cloud Scheduler e Cloud Run per avviare e arrestare automaticamente le istanze Compute Engine in base a una pianificazione regolare utilizzando le etichette delle risorse.
Obiettivi
- Scrivi ed esegui il deployment di un insieme di funzioni con Cloud Run Functions che avviano e arrestano le istanze Compute Engine.
- Crea un insieme di job con Cloud Scheduler che pianificano le istanze
con un'etichetta risorsa
dev
da eseguire dalle 9:00 alle 17:00, dal lunedì al venerdì, in modo da corrispondere al tipico orario di apertura.
Costi
In questo documento utilizzi i seguenti componenti fatturabili di Google Cloud:
- Cloud Scheduler
- Cloud Run functions
- Pub/Sub
- Compute Engine
Per generare una stima dei costi in base all'utilizzo previsto,
utilizza il calcolatore prezzi.
Prima di iniziare
- Configura l'ambiente per Cloud Scheduler.
-
Enable the Cloud Run functions, Pub/Sub, and Compute Engine APIs.
Architettura dell'applicazione
Questa soluzione include i seguenti Google Cloud componenti:
- Istanza Compute Engine che vogliamo eseguire in base a una pianificazione.
- Funzioni Cloud Run per avviare e arrestare l'istanza che vogliamo pianificare.
- Messaggi Pub/Sub inviati e ricevuti per ogni evento di avvio e interruzione.
- Job Cloud Scheduler per effettuare chiamate in base a una pianificazione prestabilita per avviare e arrestare l'istanza.
Requisiti per le località
Alcuni componenti sono supportati solo in determinate regioni:
- Istanza Compute Engine: supportata in qualsiasi regione elencata in Regioni e zone.
- Cloud Run Functions: supportate nelle regioni elencate in Località.
- Messaggi Pub/Sub: supportati a livello globale poiché Pub/Sub è un servizio globale.
- I job Cloud Scheduler con destinazioni Pub/Sub sono supportati in qualsiasi Google Cloud posizione.
Perché non HTTP anziché Pub/Sub?
Potresti voler semplificare questa architettura utilizzando i trigger HTTP delle funzioni Cloud Run anziché i trigger Pub/Sub.
Questo tutorial utilizza Pub/Sub come trigger delle funzioni Cloud Run perché questo metodo era in precedenza più sicuro dell'utilizzo di HTTP. Tuttavia, anche HTTP è una scelta valida e ora può essere protetto richiedendo l'autenticazione.
Per informazioni sulla protezione delle funzioni Cloud Run, consulta la panoramica sulla sicurezza di Cloud Run Functions. Per un confronto tra i trigger HTTP e Pub/Sub, consulta la documentazione sui trigger di Cloud Run Functions.
Configura l'istanza Compute Engine
Console
- Nella console Google Cloud , vai alla pagina Istanze VM.
Vai alla pagina Istanze VM. - Fai clic su Crea istanza.
- Imposta Nome su
dev-instance
. - Nella sezione Etichette, fai clic su Aggiungi etichette.
- Fai clic su Aggiungi etichetta.
- Inserisci
env
in Chiave edev
in Valore. - In Regione, seleziona us-west1.
- In Zona, seleziona us-west1-b.
- Fai clic su Salva.
- Fai clic su Crea nella parte inferiore della pagina.
gcloud
gcloud compute instances create dev-instance \ --network default \ --zone us-west1-b \ --labels=env=dev
Esegui il deployment di funzioni attivate da Pub/Sub tramite Cloud Run Functions
Crea ed esegui il deployment delle funzioni
Console
Crea la funzione di avvio.
- Vai alla pagina Cloud Run Functions nella console Google Cloud .
Vai alla pagina Cloud Run Functions. - Fai clic su Crea funzione.
- Per Ambiente, seleziona 1ª generazione.
- Imposta Nome funzione su
startInstancePubSub
. - Lascia invariato il valore predefinito per Regione.
- Per Tipo di trigger, seleziona Cloud Pub/Sub.
- In Seleziona un argomento Cloud Pub/Sub, fai clic su Crea un argomento.
- Dovrebbe essere visualizzata la finestra di dialogo Crea argomento.
- In ID argomento, inserisci
start-instance-event
. - Fai clic su Crea per completare la finestra di dialogo.
- In ID argomento, inserisci
- Fai clic su Salva nella parte inferiore della casella Trigger.
- Fai clic su Avanti nella parte inferiore della pagina.
- Per Runtime, seleziona Node.js 16 o versioni successive.
- In Punto di ingresso, inserisci
startInstancePubSub
. - Sul lato sinistro dell'editor di codice, seleziona index.js.
Sostituisci il codice iniziale con il seguente:
Sul lato sinistro dell'editor di codice, seleziona package.json.
Sostituisci il codice iniziale con il seguente:
Fai clic su Esegui il deployment nella parte inferiore della pagina.
Crea la funzione di interruzione.
- Dovresti trovarti nella pagina Cloud Run Functions della console Google Cloud .
- Fai clic su Crea funzione.
- Per Ambiente, seleziona 1ª generazione.
- Imposta Nome funzione su
stopInstancePubSub
. - Lascia invariato il valore predefinito per Regione.
- Per Tipo di trigger, seleziona Cloud Pub/Sub.
- In Seleziona un argomento Cloud Pub/Sub, fai clic su Crea un argomento.
- Dovrebbe essere visualizzata la finestra di dialogo Crea argomento.
- In ID argomento, inserisci
stop-instance-event
. - Fai clic su Crea per completare la finestra di dialogo.
- In ID argomento, inserisci
- Fai clic su Salva nella parte inferiore della casella Trigger.
- Fai clic su Avanti nella parte inferiore della pagina.
- Per Runtime, seleziona Node.js 16 o versioni successive.
- In Punto di ingresso, inserisci
stopInstancePubSub
. - Sul lato sinistro dell'editor di codice, seleziona index.js.
Sostituisci il codice iniziale con il seguente:
Sul lato sinistro dell'editor di codice, seleziona package.json.
Sostituisci il codice iniziale con il seguente:
Fai clic su Esegui il deployment nella parte inferiore della pagina.
gcloud
Crea gli argomenti Pub/Sub.
gcloud pubsub topics create start-instance-event
gcloud pubsub topics create stop-instance-event
Ottieni il codice
Scarica il codice.
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
In alternativa, puoi scaricare il campione come file ZIP ed estrarlo.
Vai alla directory corretta.
cd nodejs-docs-samples/functions/scheduleinstance/
Crea le funzioni di avvio e arresto.
Dovresti trovarti nella directory nodejs-docs-samples/functions/scheduleinstance/
.
gcloud functions deploy startInstancePubSub \ --trigger-topic start-instance-event \ --runtime nodejs18 \ --allow-unauthenticated
gcloud functions deploy stopInstancePubSub \ --trigger-topic stop-instance-event \ --runtime nodejs18 \ --allow-unauthenticated
(Facoltativo) Verifica il funzionamento delle funzioni
Console
Arresta l'istanza
- Vai alla pagina Cloud Run Functions nella console Google Cloud .
Vai alla pagina Cloud Run Functions. - Fai clic sulla funzione denominata
stopInstancePubSub
. - Dovresti visualizzare diverse schede: Generale, Attivatore, Origine, Autorizzazioni e Test. Fai clic sulla scheda Test.
Per Evento di trigger, inserisci quanto segue:
{"data":"eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo="}
Si tratta semplicemente della stringa con codifica base64 per
{"zone":"us-west1-b", "label":"env=dev"}
Se vuoi codificare la tua stringa, puoi utilizzare qualsiasi strumento di codifica base64 online.
Fai clic sul pulsante Testa la funzione.
Al termine dell'esecuzione, dovresti visualizzare
Successfully stopped instance dev-instance
stampato sotto Output. L'operazione potrebbe richiedere fino a 60 secondi.Se invece vedi
error: 'Error: function failed to load.'
, aspetta circa 10 secondi che la funzione venga implementata e riprova.Se invece vedi
error: 'Error: function execution attempt timed out.'
, passa al passaggio successivo per verificare se l'istanza impiega molto tempo per arrestarsi.Se invece termina l'esecuzione, ma non mostra nulla, probabilmente è andato in timeout. Passa al passaggio successivo per verificare se l'istanza richiede solo molto tempo per spegnersi.
Nella console Google Cloud , vai alla pagina Istanze VM.
Vai alla pagina Istanze VM.Verifica che l'istanza denominata
dev-instance
abbia un quadrato grigio accanto al nome, a indicare che è stata arrestata. L'operazione potrebbe richiedere fino a 30 secondi.- Se il caricamento non sembra terminare, prova a fare clic su Aggiorna nella parte superiore della pagina.
Avvia l'istanza
- Vai alla pagina Cloud Run Functions nella console Google Cloud .
Vai alla pagina Cloud Run Functions. - Fai clic sulla funzione denominata
startInstancePubSub
. - Dovresti visualizzare diverse schede: Generale, Attivatore, Origine, Autorizzazioni e Test. Fai clic sulla scheda Test.
Per Evento di trigger, inserisci quanto segue:
{"data":"eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo="}
- Anche in questo caso, si tratta semplicemente della stringa codificata in base64 per
{"zone":"us-west1-b", "label":"env=dev"}
- Anche in questo caso, si tratta semplicemente della stringa codificata in base64 per
Fai clic sul pulsante Testa la funzione.
Al termine dell'esecuzione, dovresti visualizzare
Successfully started instance dev-instance
stampato sotto Output.Nella console Google Cloud , vai alla pagina Istanze VM.
Vai alla pagina Istanze VM.Verifica che accanto al nome dell'istanza denominata
dev-instance
sia presente un segno di spunta verde che indica che è in esecuzione. L'avvio potrebbe richiedere fino a 30 secondi.
gcloud
Arresta l'istanza
Chiama la funzione per arrestare l'istanza.
gcloud functions call stopInstancePubSub \ --data '{"data":"eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo="}'
Si tratta semplicemente della stringa con codifica base64 per
{"zone":"us-west1-b", "label":"env=dev"}
Se vuoi codificare la tua stringa, puoi utilizzare qualsiasi strumento. Ecco un esempio di utilizzo dello strumento a riga di comando
base64
:echo '{"zone":"us-west1-b", "label":"env=dev"}' | base64
eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo=
Al termine della funzione, dovresti visualizzare quanto segue:
result: Successfully stopped instance dev-instance
L'operazione potrebbe richiedere fino a 60 secondi.
Se invece ricevi l'errore:
error: 'Error: function failed to load.`
Attendi circa 10 secondi per il completamento del deployment della funzione e riprova.
Se invece ricevi l'errore:
error: `Error: function execution attempt timed out.`
Passa al passaggio successivo per verificare se l'istanza impiega molto tempo per arrestarsi.
Se invece non ricevi alcun risultato, probabilmente la funzione è scaduta. Passa al passaggio successivo per verificare se l'istanza impiega molto tempo per arrestarsi.
Verifica che l'istanza abbia lo stato
TERMINATED
. L'operazione potrebbe richiedere fino a 30 secondi.gcloud compute instances describe dev-instance \ --zone us-west1-b \ | grep status
status: TERMINATED
Avvia l'istanza
Chiama la funzione per avviare l'istanza.
gcloud functions call startInstancePubSub \ --data '{"data":"eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo="}'
- Anche in questo caso, si tratta semplicemente della stringa codificata in base64 per
{"zone":"us-west1-b", "label":"env=dev"}
Al termine della funzione, dovresti visualizzare quanto segue:
result: Successfully started instance dev-instance
- Anche in questo caso, si tratta semplicemente della stringa codificata in base64 per
Verifica che l'istanza abbia lo stato
RUNNING
. L'avvio potrebbe richiedere fino a 30 secondi.gcloud compute instances describe dev-instance \ --zone us-west1-b \ | grep status
status: RUNNING
Configura i job Cloud Scheduler per chiamare Pub/Sub
Creare i job
Console
Crea il job di avvio.
- Vai alla pagina Cloud Scheduler nella Google Cloud console.
Vai alla pagina Cloud Scheduler. - Fai clic su Crea un job.
- Lascia la regione predefinita.
- Imposta Nome su
startup-dev-instances
. - In Frequenza, inserisci
0 9 * * 1-5
.- Verrà eseguito alle 9:00 ogni giorno dal lunedì al venerdì.
- Per Fuso orario, seleziona il paese e il fuso orario che preferisci. Questo
esempio utilizzerà
United States
eLos Angeles
. - Fai clic su Continua.
- In Tipo di target, seleziona
Pub/Sub
. - Seleziona
start-instance-event
dal menu a discesa degli argomenti. - In Messaggio, inserisci quanto segue:
{"zone":"us-west1-b","label":"env=dev"}
- Fai clic su Crea.
Crea il job di interruzione.
- Dovresti trovarti nella pagina Cloud Scheduler della console Google Cloud .
- Fai clic su Crea job.
- Lascia la regione predefinita e fai clic su Avanti in fondo alla pagina.
- Imposta Nome su
shutdown-dev-instances
. - In Frequenza, inserisci
0 17 * * 1-5
.- Verrà eseguito alle 17:00 ogni giorno dal lunedì al venerdì.
- Per Fuso orario, seleziona il paese e il fuso orario che preferisci. Questo
esempio utilizzerà
United States
eLos Angeles
. - Fai clic su Continua.
- In Tipo di target, seleziona
Pub/Sub
. - Seleziona
stop-instance-event
dal menu a discesa dell'argomento. - In Messaggio, inserisci quanto segue:
{"zone":"us-west1-b","label":"env=dev"}
- Fai clic su Crea.
gcloud
Crea il job di avvio.
gcloud scheduler jobs create pubsub startup-dev-instances \ --schedule '0 9 * * 1-5' \ --topic start-instance-event \ --message-body '{"zone":"us-west1-b", "label":"env=dev"}' \ --time-zone 'America/Los_Angeles' \ --location us-central1
Crea il job di interruzione.
gcloud scheduler jobs create pubsub shutdown-dev-instances \ --schedule '0 17 * * 1-5' \ --topic stop-instance-event \ --message-body '{"zone":"us-west1-b", "label":"env=dev"}' \ --time-zone 'America/Los_Angeles' \ --location us-central1
(Facoltativo) Verifica il funzionamento dei job
Console
Arresta l'istanza
- Vai alla pagina Cloud Scheduler nella Google Cloud console.
Vai alla pagina Cloud Scheduler. - Per il job denominato
shutdown-dev-instances
, fai clic sul pulsante Esegui ora sul lato destro della pagina. - Nella console Google Cloud , vai alla pagina Istanze VM.
Vai alla pagina Istanze VM. - Verifica che l'istanza denominata
dev-instance
abbia un quadrato grigio accanto al nome, a indicare che è stata arrestata. Potrebbero essere necessari fino a 30 secondi per completare l'arresto.
Avvia l'istanza
- Vai alla pagina Cloud Scheduler nella Google Cloud console.
Vai alla pagina Cloud Scheduler. - Per il job denominato
startup-dev-instances
, fai clic sul pulsante Esegui ora sul lato destro della pagina. - Nella console Google Cloud , vai alla pagina Istanze VM.
Vai alla pagina Istanze VM. - Verifica che accanto al nome dell'istanza denominata
dev-instance
sia presente un segno di spunta verde che indica che è in esecuzione. L'avvio potrebbe richiedere fino a 30 secondi.
gcloud
Arresta l'istanza
Esegui il job dello scheduler per arrestare l'istanza.
gcloud beta scheduler jobs run shutdown-dev-instances
Verifica che l'istanza abbia lo stato
TERMINATED
. Potrebbero essere necessari fino a 30 secondi per completare l'arresto.gcloud compute instances describe dev-instance \ --zone us-west1-b \ | grep status
status: TERMINATED
Avvia l'istanza
Esegui il job dello scheduler per avviare l'istanza.
gcloud beta scheduler jobs run startup-dev-instances
Verifica che l'istanza abbia lo stato
RUNNING
. L'avvio potrebbe richiedere fino a 30 secondi.gcloud compute instances describe dev-instance \ --zone us-west1-b \ | grep status
status: RUNNING
Esegui la pulizia
Al termine del tutorial, puoi liberare spazio eliminando le risorse che hai creato in modo che non utilizzino più la quota e non generino addebiti. Le seguenti sezioni descrivono come eliminare o disattivare queste risorse.
Elimina i job Cloud Scheduler
Vai alla pagina Cloud Scheduler nella Google Cloud console.
Fai clic sulle caselle di controllo accanto ai tuoi lavori.
Fai clic sul pulsante Elimina nella parte superiore della pagina e conferma l'eliminazione.
Elimina gli argomenti Pub/Sub
Vai alla pagina Pub/Sub nella console Google Cloud .
Fai clic sulle caselle di controllo accanto agli argomenti.
Fai clic su Elimina nella parte superiore della pagina e conferma l'eliminazione.
Elimina le funzioni di cui è stato eseguito il deployment tramite Cloud Run Functions
Vai alla pagina Cloud Run Functions nella console Google Cloud .
Fai clic sulle caselle di controllo accanto alle funzioni.
Fai clic sul pulsante Elimina nella parte superiore della pagina e conferma l'eliminazione.
Elimina l'istanza Compute Engine
Per eliminare un'istanza di Compute Engine:
- In the Google Cloud console, go to the VM instances page.
- Select the checkbox for the instance that you want to delete.
- To delete the instance, click More actions, click Delete, and then follow the instructions.
Elimina il progetto
Il modo più semplice per eliminare la fatturazione è eliminare il progetto creato per il tutorial.
Per eliminare il progetto:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Passaggi successivi
- Esplora architetture di riferimento, diagrammi e best practice su Google Cloud. Consulta il nostro Cloud Architecture Center.