Este tutorial mostra como usar as funções do Cloud Scheduler e do Cloud Run para iniciar e parar automaticamente instâncias do Compute Engine num horário regular usando etiquetas de recursos.
Objetivos
- Escreva e implemente um conjunto de funções com funções do Cloud Run que iniciam e param instâncias do Compute Engine.
- Crie um conjunto de tarefas com o Cloud Scheduler que agendem instâncias
com uma etiqueta de recurso
dev
para serem executadas das 09:00 às 17:00, de segunda a sexta-feira, para corresponder ao horário de funcionamento típico.
Custos
Neste documento, usa os seguintes componentes faturáveis do Google Cloud:
- Cloud Scheduler
- Cloud Run functions
- Pub/Sub
- Compute Engine
Para gerar uma estimativa de custos com base na sua utilização projetada,
use a calculadora de preços.
Antes de começar
- Configure o seu ambiente para o Cloud Scheduler.
-
Enable the Cloud Run functions, Pub/Sub, and Compute Engine APIs.
Arquitetura de aplicações
Esta solução inclui os seguintes Google Cloud componentes:
- Instância do Compute Engine que queremos executar de acordo com uma programação.
- Funções do Cloud Run para iniciar e parar a instância que queremos agendar.
- Mensagens do Pub/Sub enviadas e recebidas para cada evento de início e paragem.
- Tarefas do Cloud Scheduler para fazer chamadas num horário definido para iniciar e parar a instância.
Requisitos de localização
Alguns componentes só são suportados em determinadas regiões:
- Instância do Compute Engine: suportada em qualquer região listada em Regiões e zonas.
- Funções do Cloud Run: suportadas nas regiões indicadas em Localizações.
- Mensagens do Pub/Sub: suportadas globalmente, uma vez que o Pub/Sub é um serviço global.
- Tarefas do Cloud Scheduler com destinos do Pub/Sub: suportadas em qualquer Google Cloud localização.
Por que motivo não usar HTTP em vez de Pub/Sub?
Pode simplificar esta arquitetura usando funções do Cloud Run Acionadores HTTP em vez de Acionadores do Pub/Sub.
Este tutorial usa o Pub/Sub como o acionador das funções do Cloud Run porque este método era anteriormente mais seguro do que usar HTTP. No entanto, o HTTP também é uma escolha válida e agora pode ser protegido através da exigência de autenticação.
Para saber como proteger as funções do Cloud Run, consulte a vista geral da segurança das funções do Cloud Run. Para uma comparação entre acionadores HTTP e Pub/Sub, consulte a documentação Acionadores de funções do Cloud Run.
Configure a instância do Compute Engine
Consola
- Aceda à página Instâncias de VM na Google Cloud consola.
Aceda à página de instâncias de VM. - Clique em Criar instância.
- Defina o Nome como
dev-instance
. - Em Etiquetas, clique em Adicionar etiquetas.
- Clique em Adicionar etiqueta.
- Introduza
env
para Chave edev
para Valor. - Para Região, selecione us-west1.
- Para Zona, selecione us-west1-b.
- Clique em Guardar.
- Clique em Criar na parte inferior da página.
gcloud
gcloud compute instances create dev-instance \ --network default \ --zone us-west1-b \ --labels=env=dev
Implemente funções acionadas pelo Pub/Sub através de funções do Cloud Run
Crie e implemente as funções
Consola
Crie a função de início.
- Aceda à página Funções do Cloud Run na Google Cloud consola.
Aceda à página de funções do Cloud Run. - Clique em Criar função.
- Para Ambiente, selecione 1.ª geração.
- Defina o Nome da função como
startInstancePubSub
. - Mantenha o valor predefinido de Região.
- Em Tipo de acionador, selecione Cloud Pub/Sub.
- Em Selecionar um tópico do Cloud Pub/Sub, clique em Criar um tópico.
- Deve aparecer uma caixa de diálogo Criar tópico.
- Em ID do tópico, introduza
start-instance-event
. - Clique em Criar para concluir a caixa de diálogo.
- Em ID do tópico, introduza
- Clique em Guardar na parte inferior da caixa Acionador.
- Clique em Seguinte na parte inferior da página.
- Para Tempo de execução, selecione Node.js 16 ou posterior.
- Para Entry point, introduza
startInstancePubSub
. - No lado esquerdo do editor de código, selecione index.js.
Substitua o código inicial pelo seguinte código:
No lado esquerdo do editor de código, selecione package.json.
Substitua o código inicial pelo seguinte código:
Clique em Implementar na parte inferior da página.
Crie a função de paragem.
- Deve estar na página Funções do Cloud Run na Google Cloud consola.
- Clique em Criar função.
- Para Ambiente, selecione 1.ª geração.
- Defina o Nome da função como
stopInstancePubSub
. - Mantenha o valor predefinido de Região.
- Em Tipo de acionador, selecione Cloud Pub/Sub.
- Em Selecionar um tópico do Cloud Pub/Sub, clique em Criar um tópico.
- Deve aparecer uma caixa de diálogo Criar tópico.
- Em ID do tópico, introduza
stop-instance-event
. - Clique em Criar para concluir a caixa de diálogo.
- Em ID do tópico, introduza
- Clique em Guardar na parte inferior da caixa Acionador.
- Clique em Seguinte na parte inferior da página.
- Para Tempo de execução, selecione Node.js 16 ou posterior.
- Para Entry point, introduza
stopInstancePubSub
. - No lado esquerdo do editor de código, selecione index.js.
Substitua o código inicial pelo seguinte código:
No lado esquerdo do editor de código, selecione package.json.
Substitua o código inicial pelo seguinte código:
Clique em Implementar na parte inferior da página.
gcloud
Crie os tópicos do Pub/Sub.
gcloud pubsub topics create start-instance-event
gcloud pubsub topics create stop-instance-event
Obter o código
Transfira o código.
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
Em alternativa, pode transferir o exemplo como um ficheiro ZIP e extraí-lo.
Aceda ao diretório correto.
cd nodejs-docs-samples/functions/scheduleinstance/
Crie as funções de início e fim.
Deve estar no diretório 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
(Opcional) Valide se as funções funcionam
Consola
Pare a instância
- Aceda à página Funções do Cloud Run na Google Cloud consola.
Aceda à página de funções do Cloud Run. - Clique na função denominada
stopInstancePubSub
. - Deve ver vários separadores: Geral, Acionador, Origem, Autorizações e Testes. Clique no separador Testes.
Para Evento de acionamento, introduza o seguinte:
{"data":"eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo="}
Esta é simplesmente a string codificada em base64 para
{"zone":"us-west1-b", "label":"env=dev"}
Se quiser codificar a sua própria string, pode usar qualquer ferramenta de codificação base64 online.
Clique no botão Testar a função.
Quando a execução estiver concluída, deve ver
Successfully stopped instance dev-instance
impresso em Output. A execução pode demorar até 60 segundos.Se, em alternativa, vir
error: 'Error: function failed to load.'
, basta aguardar cerca de 10 segundos para que a função termine a implementação e tentar novamente.Se, em vez disso, vir
error: 'Error: function execution attempt timed out.'
, avance para o passo seguinte para ver se a instância está apenas a demorar muito tempo a ser encerrada.Se, em vez disso, terminar a execução, mas não mostrar nada, é provável que o tempo limite também tenha sido excedido. Basta avançar para o passo seguinte para ver se a instância está a demorar muito tempo a ser encerrada.
Aceda à página Instâncias de VM na Google Cloud consola.
Aceda à página de instâncias de VM.Verifique se a instância denominada
dev-instance
tem um quadrado cinzento junto ao nome, o que indica que foi interrompida. O encerramento pode demorar até 30 segundos.- Se não parecer estar a terminar, experimente clicar em Atualizar na parte superior da página.
Inicie a instância
- Aceda à página Funções do Cloud Run na Google Cloud consola.
Aceda à página de funções do Cloud Run. - Clique na função denominada
startInstancePubSub
. - Deve ver vários separadores: Geral, Acionador, Origem, Autorizações e Testes. Clique no separador Testes.
Para Evento de acionamento, introduza o seguinte:
{"data":"eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo="}
- Mais uma vez, esta é simplesmente a string codificada em base64 para
{"zone":"us-west1-b", "label":"env=dev"}
- Mais uma vez, esta é simplesmente a string codificada em base64 para
Clique no botão Testar a função.
Quando a execução estiver concluída, deve ver
Successfully started instance dev-instance
impresso em Output.Aceda à página Instâncias de VM na Google Cloud consola.
Aceda à página de instâncias de VM.Verifique se a instância denominada
dev-instance
tem uma marca de verificação verde junto ao nome, o que indica que está em execução. O arranque pode demorar até 30 segundos.
gcloud
Pare a instância
Chame a função para parar a instância.
gcloud functions call stopInstancePubSub \ --data '{"data":"eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo="}'
Esta é simplesmente a string codificada em base64 para
{"zone":"us-west1-b", "label":"env=dev"}
Se quiser codificar a sua própria string, pode usar qualquer ferramenta. Segue-se um exemplo com a ferramenta de linha de comandos
base64
:echo '{"zone":"us-west1-b", "label":"env=dev"}' | base64
eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo=
Quando a função terminar, deve ver o seguinte:
result: Successfully stopped instance dev-instance
A execução pode demorar até 60 segundos.
Se, em vez disso, receber o erro:
error: 'Error: function failed to load.`
Aguarde cerca de 10 segundos para que a função termine a implementação e tente novamente.
Se, em vez disso, receber o erro:
error: `Error: function execution attempt timed out.`
Avance para o passo seguinte para ver se a instância está apenas a demorar muito tempo a ser encerrada.
Se, em alternativa, não receber nenhum resultado, é provável que a função tenha excedido o tempo limite. Avance para o passo seguinte para ver se a instância está apenas a demorar muito tempo a ser encerrada.
Verifique se a instância tem o estado
TERMINATED
. O encerramento pode demorar até 30 segundos.gcloud compute instances describe dev-instance \ --zone us-west1-b \ | grep status
status: TERMINATED
Inicie a instância
Chame a função para iniciar a instância.
gcloud functions call startInstancePubSub \ --data '{"data":"eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo="}'
- Mais uma vez, esta é simplesmente a string codificada em base64 para
{"zone":"us-west1-b", "label":"env=dev"}
Quando a função terminar, deve ver o seguinte:
result: Successfully started instance dev-instance
- Mais uma vez, esta é simplesmente a string codificada em base64 para
Verifique se a instância tem o estado
RUNNING
. O arranque pode demorar até 30 segundos.gcloud compute instances describe dev-instance \ --zone us-west1-b \ | grep status
status: RUNNING
Configure as tarefas do Cloud Scheduler para chamar o Pub/Sub
Crie os trabalhos
Consola
Crie a tarefa de início.
- Aceda à página Cloud Scheduler na Google Cloud consola.
Aceda à página do Cloud Scheduler. - Clique em Criar tarefa.
- Deixe a região predefinida.
- Defina o Nome como
startup-dev-instances
. - Para Frequência, introduza
0 9 * * 1-5
.- Esta ação é executada todos os dias úteis às 09:00.
- Para Fuso horário, selecione o país e o fuso horário pretendidos. Este exemplo vai usar
United States
eLos Angeles
. - Clique em Continuar.
- Para Tipo de segmentação, selecione
Pub/Sub
. - Selecione
start-instance-event
no menu pendente de tópicos. - Para Mensagem, introduza o seguinte:
{"zone":"us-west1-b","label":"env=dev"}
- Clique em Criar.
Crie o trabalho de paragem.
- Deve estar na página Cloud Scheduler na Google Cloud consola.
- Clique em Criar tarefa.
- Deixe a região predefinida e clique em Seguinte na parte inferior da página.
- Defina o Nome como
shutdown-dev-instances
. - Para Frequência, introduza
0 17 * * 1-5
.- Esta ação é executada todos os dias úteis às 17:00.
- Para Fuso horário, selecione o país e o fuso horário pretendidos. Este exemplo vai usar
United States
eLos Angeles
. - Clique em Continuar.
- Para Tipo de segmentação, selecione
Pub/Sub
. - Selecione
stop-instance-event
no menu pendente de tópicos. - Para Mensagem, introduza o seguinte:
{"zone":"us-west1-b","label":"env=dev"}
- Clique em Criar.
gcloud
Crie a tarefa de início.
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
Crie o trabalho de paragem.
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
(Opcional) Valide se os trabalhos funcionam
Consola
Pare a instância
- Aceda à página Cloud Scheduler na Google Cloud consola.
Aceda à página do Cloud Scheduler. - Para a tarefa denominada
shutdown-dev-instances
, clique no botão Executar agora no lado direito da página. - Aceda à página Instâncias de VM na Google Cloud consola.
Aceda à página de instâncias de VM. - Verifique se a instância denominada
dev-instance
tem um quadrado cinzento junto ao nome, o que indica que foi interrompida. Pode demorar até 30 segundos a concluir o encerramento.
Inicie a instância
- Aceda à página Cloud Scheduler na Google Cloud consola.
Aceda à página do Cloud Scheduler. - Para a tarefa denominada
startup-dev-instances
, clique no botão Executar agora no lado direito da página. - Aceda à página Instâncias de VM na Google Cloud consola.
Aceda à página de instâncias de VM. - Verifique se a instância denominada
dev-instance
tem uma marca de verificação verde junto ao nome, o que indica que está em execução. O arranque pode demorar até 30 segundos.
gcloud
Pare a instância
Execute a tarefa do programador para parar a instância.
gcloud beta scheduler jobs run shutdown-dev-instances
Verifique se a instância tem o estado
TERMINATED
. Pode demorar até 30 segundos para que o dispositivo seja desligado.gcloud compute instances describe dev-instance \ --zone us-west1-b \ | grep status
status: TERMINATED
Inicie a instância
Execute a tarefa do programador para iniciar a instância.
gcloud beta scheduler jobs run startup-dev-instances
Verifique se a instância tem o estado
RUNNING
. O arranque pode demorar até 30 segundos.gcloud compute instances describe dev-instance \ --zone us-west1-b \ | grep status
status: RUNNING
Limpar
Depois de concluir o tutorial, pode limpar os recursos que criou para que deixem de usar a quota e incorrer em custos. As secções seguintes descrevem como eliminar ou desativar estes recursos.
Elimine as tarefas do Cloud Scheduler
Aceda à página Cloud Scheduler na Google Cloud consola.
Clique nas caixas de verificação junto aos seus trabalhos.
Clique no botão Eliminar na parte superior da página e confirme a eliminação.
Elimine os tópicos do Pub/Sub
Aceda à página Pub/Sub na Google Cloud consola.
Clique nas caixas de verificação junto aos seus tópicos.
Clique em Eliminar na parte superior da página e confirme a eliminação.
Elimine as funções implementadas através das funções do Cloud Run
Aceda à página Funções do Cloud Run na Google Cloud consola.
Clique nas caixas de verificação junto às suas funções.
Clique no botão Eliminar na parte superior da página e confirme a eliminação.
Elimine a instância do Compute Engine
Para eliminar uma instância do 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.
Elimine o projeto
A forma mais fácil de eliminar a faturação é eliminar o projeto que criou para o tutorial.
Para eliminar o projeto:
- 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.
O que se segue?
- Explore arquiteturas de referência, diagramas e práticas recomendadas sobre o Google Cloud. Consulte o nosso Centro de arquitetura na nuvem.