Neste tutorial, mostramos como usar o Cloud Scheduler e o Cloud Functions para iniciar e interromper automaticamente 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 Functions que iniciem e interrompam 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 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.
-
Ative as APIs Cloud Functions, Pub/Sub, and Compute Engine.
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.
- Cloud Functions para iniciar e interromper a instância a ser programada.
- 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 para iniciar e interromper a instância.
Requisitos para locais
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 Functions: compatível com as regiões listadas em Locais.
- Mensagens do Pub/Sub: compatíveis globalmente, porque o Pub/Sub é um serviço global.
- Jobs do Cloud Scheduler com destinos do Pub/Sub: compatíveis com qualquer local do Google Cloud.
Por que não HTTP em vez de Pub/Sub?
Você pode simplificar essa arquitetura usando Gatilhos HTTP do Cloud Functions em vez de Gatilhos do Pub/Sub.
Neste tutorial, usamos o Pub/Sub como o gatilho do Cloud Functions porque esse método anteriormente era mais seguro do que o uso de HTTP. No entanto, o HTTP também é uma opção válida e agora pode ser protegido com a exigência de autenticação.
Para saber como proteger o Cloud Functions, consulte a visão geral de segurança do Cloud Functions. Para uma comparação entre acionadores HTTP e Pub/Sub, consulte a documentação Acionadores do Cloud 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 marcador.
- Insira
env
em Chave edev
em Valor. - Em Região, selecione us-west1.
- Em Zona, selecione us-west1-b.
- Clique em Save.
- 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 com o Cloud Functions
Criar e implantar as funções
Console
Criar a função de inicialização
- Acesse a página de visão geral do Cloud Functions no console do Google Cloud.
Acessar a página Cloud Functions. - 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 acionador, selecione Cloud Pub/Sub.
- Em Selecionar um tópico do Cloud Pub/Sub, clique em Criar um tópico.
- Uma caixa de diálogo Create topic será exibida.
- 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 posterior.
- 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 o 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 Cloud Functions 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 acionador, selecione Cloud Pub/Sub.
- Em Selecionar um tópico do Cloud Pub/Sub, clique em Criar um tópico.
- Uma caixa de diálogo Create topic será exibida.
- 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 posterior.
- 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 o 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 de visão geral do Cloud Functions no console do Google Cloud.
Acessar a página Cloud Functions. - 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 de visão geral do Cloud Functions no console do Google Cloud.
Acessar a página Cloud Functions. - 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 a desativação ser 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 temas. - Em Mensagem, insira 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 temas. - Em Mensagem, insira 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 que o desligamento seja concluído.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 com o Cloud Functions
Acesse a página de visão geral do Cloud 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:
- No Console do Google Cloud, acesse a página Instâncias de VMs.
- Marque a caixa de seleção de a instância que você quer excluir.
- Para excluir a instância, clique em Mais ações, clique em Excluir e siga as instruções.
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, faça o seguinte:
- No Console do Google Cloud, acesse a página Gerenciar recursos.
- Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
- Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.
A seguir
- Confira arquiteturas de referência, diagramas, tutoriais e práticas recomendadas do Google Cloud. Confira o Centro de arquitetura do Cloud.