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 de forma regular usando etiquetas de recursos.
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
envpara Chave edevpara 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.
- É apresentada 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.
- É apresentada 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-instanceimpresso 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 alternativa, 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á apenas 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-instancetem 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-instanceimpresso 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-instancetem 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"}' | base64eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo=
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 statusstatus: 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 statusstatus: 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 StateseLos Angeles. - Clique em Continuar.
- Para Tipo de segmentação, selecione
Pub/Sub. - Selecione
start-instance-eventno 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 StateseLos Angeles. - Clique em Continuar.
- Para Tipo de segmentação, selecione
Pub/Sub. - Selecione
stop-instance-eventno 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-instancetem um quadrado cinzento junto ao nome, o que indica que foi interrompida. Pode demorar até 30 segundos para que o encerramento seja concluído.
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-instancetem uma marca de verificação verde junto ao nome, o que indica que está em execução. Pode demorar até 30 segundos para terminar o arranque.
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 statusstatus: 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 statusstatus: RUNNING