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.
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 le funzioni Cloud Run Trigger HTTP anziché 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 scoprire di più 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 in Output. L'operazione potrebbe richiedere fino a 60 secondi.Se invece vedi
error: 'Error: function failed to load.'
, aspetta circa 10 secondi affinché 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 accanto al nome dell'istanza
dev-instance
sia presente un quadrato grigio, che indica 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 in Output.Nella console Google Cloud , vai alla pagina Istanze VM.
Vai alla pagina Istanze VM.Verifica che accanto al nome dell'istanza
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 console Google Cloud .
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
.- L'azione verrà eseguita 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 degli argomenti. - 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 console Google Cloud .
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 accanto al nome dell'istanza
dev-instance
sia presente un quadrato grigio, che indica che è stata arrestata. Potrebbero essere necessari fino a 30 secondi per completare l'arresto.
Avvia l'istanza
- Vai alla pagina Cloud Scheduler nella console Google Cloud .
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
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