Este tutorial mostra como usar o Cloud Scheduler e as funções do Cloud Run para iniciar e interromper automaticamente as instâncias do Compute Engine em uma programação regular usando rótulos de recursos.
Objetivos
- Escrever e implantar um conjunto de funções com o Cloud Run que iniciam e param instâncias do Compute Engine.
- Crie um conjunto de tarefas com o Cloud Scheduler que agende instâncias com um rótulo de recurso
dev
para execução das 09:00-17:00, de segunda a sexta-feira, para corresponder ao horário comercial normal.
Custos
Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:
- Cloud Scheduler
- Cloud Run functions
- Pub/Sub
- Compute Engine
Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços.
Antes de começar
- Configure seu ambiente para o Cloud Scheduler.
-
Enable the Cloud Run functions, Pub/Sub, and Compute Engine APIs.
Arquitetura do aplicativo
Esta solução inclui os seguintes componentes do Google Cloud:
- Instância do Compute Engine que queremos executar em uma programação.
- Funções do Cloud Run para iniciar e interromper a instância que queremos programar.
- Mensagens do Pub/Sub enviadas e recebidas para cada evento de início e parada.
- Jobs do Cloud Scheduler para fazer chamadas em uma programação definida a fim de iniciar e interromper a instância.
Requisitos de localização
Alguns componentes são compatíveis apenas com determinadas regiões:
- Instância do Compute Engine: compatível com qualquer região listada em Regiões e zonas.
- Cloud Run functions: compatível com as regiões listadas em Locais.
- Mensagens do Pub/Sub: compatíveis globalmente, uma vez que o Pub/Sub é um serviço global.
- Jobs do Cloud Scheduler com destinos do Pub/Sub: são aceitos em qualquer local do Google Cloud.
Por que não HTTP em vez de Pub/Sub?
Você pode simplificar essa arquitetura usando os acionadores HTTP do Cloud Run Functions em vez dos acionadores do Pub/Sub.
Este tutorial usa o Pub/Sub como o gatilho das funções do Cloud Run porque esse método era mais seguro do que usar o HTTP. No entanto, o HTTP também é uma opção válida e agora pode ser protegido exigindo autenticação.
Para saber como proteger o Cloud Run functions, consulte a visão geral de segurança do Cloud Run functions. Para uma comparação entre os acionadores HTTP e do Pub/Sub, consulte a documentação de acionadores do Cloud Run functions.
Configurar a instância do Compute Engine
Console
- Acesse a página Instâncias de VMs no Console do Google Cloud.
Faça isso neste link - Clique em Criar instância.
- Defina o Nome como
dev-instance
. - Em Rótulos, clique em Adicionar rótulos.
- Clique em Adicionar rótulo.
- Digite
env
para Chave edev
para Valor. - Em Região, selecione us-west1.
- Em Zona, selecione us-west1-b.
- Clique em Salvar.
- 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
Implantar funções acionadas pelo Pub/Sub usando funções do Cloud Run
Criar e implantar as funções
Console
Criar a função de inicialização
- Acesse a página do Cloud Run functions no console do Google Cloud.
Acesse a página de funções do Cloud Run. - Clique em Criar função.
- Em Ambiente, selecione primeira geração.
- Defina o Nome da função como
startInstancePubSub
. - Deixe o valor padrão em Região.
- Em Tipo de gatilho, selecione Cloud Pub/Sub.
- Em Selecionar um tópico do Cloud Pub/Sub, clique em Criar um tópico.
- A caixa de diálogo Criar tópico vai aparecer.
- Em ID do tópico, insira
start-instance-event
. - Clique em Criar para fechar a caixa de diálogo.
- Em ID do tópico, insira
- Clique em Salvar na parte inferior da caixa gatilho.
- Clique em Avançar na parte inferior da página.
- Em Ambiente de execução, selecione Node.js 16 ou mais recente.
- Em Ponto de entrada, digite
startInstancePubSub
. - No lado esquerdo do editor de código, selecione index.js.
Substitua o código inicial pelo seguinte:
No lado esquerdo do editor de código, selecione package.json.
Substitua o código inicial pelo seguinte:
Clique em Deploy na parte inferior da página.
Criar a função de parada
- Você deve estar na página Funções do Cloud Run no console do Google Cloud.
- Clique em Criar função.
- Em Ambiente, selecione primeira geração.
- Defina o Nome da função como
stopInstancePubSub
. - Deixe o valor padrão em Região.
- Em Tipo de gatilho, selecione Cloud Pub/Sub.
- Em Selecionar um tópico do Cloud Pub/Sub, clique em Criar um tópico.
- A caixa de diálogo Criar tópico vai aparecer.
- Em ID do tópico, insira
stop-instance-event
. - Clique em Criar para fechar a caixa de diálogo.
- Em ID do tópico, insira
- Clique em Salvar na parte inferior da caixa gatilho.
- Clique em Avançar na parte inferior da página.
- Em Ambiente de execução, selecione Node.js 16 ou mais recente.
- Em Ponto de entrada, digite
stopInstancePubSub
. - No lado esquerdo do editor de código, selecione index.js.
Substitua o código inicial pelo seguinte:
No lado esquerdo do editor de código, selecione package.json.
Substitua o código inicial pelo seguinte:
Clique em Deploy 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
Receber o código
Faça o download do código.
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
Outra alternativa é fazer o download da amostra como um arquivo ZIP e extraí-lo.
Acesse o diretório correto.
cd nodejs-docs-samples/functions/scheduleinstance/
Criar as funções de inicialização e parada
Você 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) Verificar se as funções são executadas corretamente
Console
Interromper a instância
- Acesse a página do Cloud Run functions no console do Google Cloud.
Acesse a página de funções do Cloud Run. - Clique na função denominada
stopInstancePubSub
. - Você verá várias guias: Geral, gatilho, Origem, Permissões e Testes. Clique na guia Testes.
Em Evento acionador, digite o seguinte:
{"data":"eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo="}
Essa é simplesmente a sequência codificada em base64 para
{"zone":"us-west1-b", "label":"env=dev"}
Se quiser codificar sua própria string, use qualquer ferramenta de codificação base64 on-line.
Clique no botão Testar a função.
Quando terminar de executar, você verá
Successfully stopped instance dev-instance
impresso em Saída. A execução pode levar até 60 segundos para ser concluída.Se você vir
error: 'Error: function failed to load.'
, aguarde 10 segundos ou mais para que a função conclua a implantação e tente novamente.Se você vir
error: 'Error: function execution attempt timed out.'
, passe para a próxima etapa para ver se a instância está demorando muito para ser encerrada.Se a execução for encerrada e nenhuma informação for exibida, provavelmente o tempo expirou. Basta seguir para a próxima etapa e confirmar se a instância está demorando muito para ser desativada.
Acesse a página Instâncias de VMs no Console do Google Cloud.
Faça isso neste linkVerifique se a instância chamada
dev-instance
possui um quadrado cinza ao lado do nome, indicando que parou. Pode levar até 30 segundos para a desativação ser concluída.- Se a instância não for encerrada, clique em Atualizar na parte superior da página.
Iniciar a instância
- Acesse a página do Cloud Run functions no console do Google Cloud.
Acesse a página de funções do Cloud Run. - Clique na função denominada
startInstancePubSub
. - Você verá várias guias: Geral, gatilho, Origem, Permissões e Testes. Clique na guia Testes.
Em Evento acionador, digite o seguinte:
{"data":"eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo="}
- Novamente, essa é simplesmente a sequência codificada em base64 para
{"zone":"us-west1-b", "label":"env=dev"}
- Novamente, essa é simplesmente a sequência codificada em base64 para
Clique no botão Testar a função.
Quando terminar de executar, você verá
Successfully started instance dev-instance
impresso em Saída.Acesse a página Instâncias de VMs no Console do Google Cloud.
Faça isso neste linkVerifique se a instância chamada
dev-instance
possui uma marca de seleção verde ao lado do nome, indicando que está em execução. Pode levar até 30 segundos para a inicialização ser concluída.
gcloud
Interromper a instância
Chame a função para interromper a instância.
gcloud functions call stopInstancePubSub \ --data '{"data":"eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo="}'
Essa é simplesmente a sequência codificada em base64 para
{"zone":"us-west1-b", "label":"env=dev"}
Se você quiser codificar sua própria string, poderá utilizar qualquer ferramenta. Aqui está um exemplo usando a ferramenta de linha de comando
base64
:echo '{"zone":"us-west1-b", "label":"env=dev"}' | base64
eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo=
Quando a função for encerrada, você verá o seguinte:
result: Successfully stopped instance dev-instance
A execução pode levar até 60 segundos para ser concluída.
Se, em vez disso, você receber o erro:
error: 'Error: function failed to load.`
Aguarde cerca de 10 segundos até que a implantação seja concluída e tente novamente.
Se, em vez disso, você receber o erro:
error: `Error: function execution attempt timed out.`
Siga para a próxima etapa e confirme se a instância está demorando muito para ser desativada.
Se, em vez disso, você não receber resultados, provavelmente o tempo limite da função expirou. Siga para a próxima etapa e confirme se a instância está demorando muito para ser desativada.
Verifique se a instância tem um status
TERMINATED
. Pode levar até 30 segundos para que a desativação seja concluída.gcloud compute instances describe dev-instance \ --zone us-west1-b \ | grep status
status: TERMINATED
Iniciar a instância
Chame a função para iniciar a instância.
gcloud functions call startInstancePubSub \ --data '{"data":"eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo="}'
- Novamente, essa é simplesmente a sequência codificada em base64 para
{"zone":"us-west1-b", "label":"env=dev"}
Quando a função for encerrada, você verá o seguinte:
result: Successfully started instance dev-instance
- Novamente, essa é simplesmente a sequência codificada em base64 para
Verifique se a instância tem um status
RUNNING
. Pode levar até 30 segundos para a inicialização ser concluída.gcloud compute instances describe dev-instance \ --zone us-west1-b \ | grep status
status: RUNNING
Configure os trabalhos do Cloud Scheduler para chamar o Pub/Sub
Criar os jobs
Console
Criar o job de inicialização
- Vá para a página Cloud Scheduler no Console do Google Cloud.
Acessar a página do Cloud Scheduler. - Clique em Criar um job.
- Deixe a região padrão.
- Defina o Nome como
startup-dev-instances
. - Em Frequência, insira
0 9 * * 1-5
.- Isso será executado às 9h todos os dias, de segunda a sexta-feira.
- Em Fuso horário, selecione o país e o fuso horário desejados. Este exemplo usará
United States
eLos Angeles
. - Clique em Continuar.
- Em Tipo de destino, selecione
Pub/Sub
. - Selecione
start-instance-event
no menu suspenso de tópicos. - Em Mensagem, digite o seguinte:
{"zone":"us-west1-b","label":"env=dev"}
- Clique em Criar.
Criar o job de parada
- Você deve estar na página Cloud Scheduler no console do Google Cloud.
- Clique em Criar job.
- Mantenha a região padrão e clique em Avançar na parte inferior da página.
- Defina o Nome como
shutdown-dev-instances
. - Em Frequência, insira
0 17 * * 1-5
.- Isso será executado às 17h todos os dias, de segunda a sexta-feira.
- Em Fuso horário, selecione o país e o fuso horário desejados. Este exemplo usará
United States
eLos Angeles
. - Clique em Continuar.
- Em Tipo de destino, selecione
Pub/Sub
. - Selecione
stop-instance-event
no menu suspenso de tópicos. - Em Mensagem, digite o seguinte:
{"zone":"us-west1-b","label":"env=dev"}
- Clique em Criar.
gcloud
Criar o job de inicialização
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
Criar o job de parada
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) Verificar se os jobs são executados corretamente
Console
Interromper a instância
- Vá para a página Cloud Scheduler no Console do Google Cloud.
Acessar a página do Cloud Scheduler. - Para o job chamado
shutdown-dev-instances
, clique no botão Executar agora no lado direito da página. - Acesse a página Instâncias de VMs no Console do Google Cloud.
Faça isso neste link - Verifique se a instância chamada
dev-instance
possui um quadrado cinza ao lado do nome, indicando que parou. Pode levar até 30 segundos para a desativação ser concluída.
Iniciar a instância
- Vá para a página Cloud Scheduler no Console do Google Cloud.
Acessar a página do Cloud Scheduler. - Para o job chamado
startup-dev-instances
, clique no botão Executar agora no lado direito da página. - Acesse a página Instâncias de VMs no Console do Google Cloud.
Faça isso neste link - Verifique se a instância chamada
dev-instance
possui uma marca de seleção verde ao lado do nome, indicando que está em execução. Pode demorar até 30 segundos para a inicialização ser concluída.
gcloud
Interromper a instância
Execute o job do programador para interromper a instância.
gcloud beta scheduler jobs run shutdown-dev-instances
Verifique se a instância tem um status
TERMINATED
. Pode levar até 30 segundos para a desativação ser concluída.gcloud compute instances describe dev-instance \ --zone us-west1-b \ | grep status
status: TERMINATED
Iniciar a instância
Execute o job do programador para iniciar a instância.
gcloud beta scheduler jobs run startup-dev-instances
Verifique se a instância tem um status
RUNNING
. Pode levar até 30 segundos para a inicialização ser concluída.gcloud compute instances describe dev-instance \ --zone us-west1-b \ | grep status
status: RUNNING
Limpar
Depois de concluir o tutorial, você pode limpar os recursos que criou para que eles parem de usar a cota e gerar cobranças. Nas seções a seguir, você aprenderá a excluir e desativar esses recursos.
Excluir os jobs do Cloud Scheduler
Vá para a página Cloud Scheduler no Console do Google Cloud.
Clique nas caixas de seleção ao lado dos seus jobs.
Clique no botão Excluir na parte superior da página e confirme.
Excluir os tópicos do Pub/Sub
Acesse a página Pub/Sub no console do Google Cloud.
Clique nas caixas de seleção ao lado dos seus tópicos.
Clique em Excluir na parte superior da página e confirme.
Excluir as funções implantadas pelo Cloud Run
Acesse a página do Cloud Run functions no console do Google Cloud.
Clique nas caixas de seleção ao lado das funções.
Clique no botão Excluir na parte superior da página e confirme.
Excluir a instância do Compute Engine
Para excluir 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.
Exclua o projeto
O jeito mais fácil de evitar cobranças é excluindo o projeto que você criou para o tutorial.
Para excluir 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.
A seguir
- Confira arquiteturas de referência, diagramas, tutoriais e práticas recomendadas do Google Cloud. Confira o Centro de arquitetura do Cloud.