Você pode usar o Cloud Scheduler para iniciar e interromper instâncias do Cloud SQL em uma programação regular. Por exemplo, talvez você queira que as instâncias sejam executadas apenas durante determinados horários.
Neste tutorial, mostramos como iniciar e interromper automaticamente uma instância do Cloud SQL para SQL Server criando uma arquitetura orientada a eventos usando produtos do Google Cloud .
Objetivos
Neste tutorial, você vai criar jobs do Cloud Scheduler que agendam instâncias do Cloud SQL com um rótulo de recurso env=dev para serem executadas durante horários específicos. Você vai programar apenas uma instância. No entanto, a arquitetura
descrita neste tutorial pode ser usada para parar e iniciar várias instâncias
em que o rótulo de recurso é env=dev.
Para isso, siga estas etapas:
- Crie uma instância do Cloud SQL para SQL Server e atribua a ela um rótulo de recurso específico (
env=dev). - Crie dois tópicos do Pub/Sub para atuar como fontes de eventos para seus gatilhos do Eventarc e como agentes de mensagens.
- Crie e implante duas funções do Cloud Run orientadas a eventos acionadas pelos tópicos do Pub/Sub. Quando acionadas, as funções procuram
instâncias do Cloud SQL no seu projeto que correspondam ao rótulo fornecido no
payload da mensagem do Pub/Sub (
env=dev). - Crie e implante dois gatilhos do Eventarc. Os eventos de tópico do Pub/Sub são encaminhados para suas funções como solicitações HTTP, e o conteúdo da mensagem de evento é transmitido como dados de entrada para as funções.
- Crie dois cron jobs do Cloud Scheduler para publicar uma mensagem contendo o rótulo de destino nos tópicos do Pub/Sub em horários específicos. Programe as instâncias para iniciar às 9h e parar às 17h, de segunda a sexta-feira.
O diagrama a seguir fornece uma visão geral da arquitetura orientada a eventos:
Custos
Neste documento, você vai usar os seguintes componentes faturáveis do Google Cloud:
-
Cloud Run functions
Cloud Run functions operate as Cloud Run services and are billed accordingly.
- Cloud Scheduler
- Cloud SQL for SQL Server
-
Eventarc
Cloud Run uses Eventarc for event delivery. Pricing for Eventarc is not included in the Cloud Run pricing.
- Pub/Sub
Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços.
Ao concluir as tarefas descritas neste documento, é possível evitar o faturamento contínuo excluindo os recursos criados. Para mais informações, consulte Limpeza.
Antes de começar
As restrições de segurança definidas pela sua organização podem impedir que você conclua as etapas a seguir. Para informações sobre solução de problemas, consulte Desenvolver aplicativos em um ambiente restrito de Google Cloud .
- Faça login na sua conta do Google Cloud . Se você começou a usar o Google Cloud, crie uma conta para avaliar o desempenho de nossos produtos em situações reais. Clientes novos também recebem US$ 300 em créditos para executar, testar e implantar cargas de trabalho.
-
Instale a CLI do Google Cloud.
-
Ao usar um provedor de identidade (IdP) externo, primeiro faça login na CLI gcloud com sua identidade federada.
-
Para inicializar a CLI gcloud, execute o seguinte comando:
gcloud init -
Crie ou selecione um Google Cloud projeto.
Funções necessárias para selecionar ou criar um projeto
- Selecionar um projeto: não é necessário um papel específico do IAM para selecionar um projeto. Você pode escolher qualquer projeto em que tenha recebido um papel.
-
Criar um projeto: para criar um projeto, é necessário ter o papel de Criador de projetos
(
roles/resourcemanager.projectCreator), que contém a permissãoresourcemanager.projects.create. Saiba como conceder papéis.
-
Crie um projeto do Google Cloud :
gcloud projects create PROJECT_ID
Substitua
PROJECT_IDpor um nome para o projeto Google Cloud que você está criando. -
Selecione o projeto Google Cloud que você criou:
gcloud config set project PROJECT_ID
Substitua
PROJECT_IDpelo nome do projeto do Google Cloud .
-
Se este guia estiver usando um projeto atual, verifique se você tem as permissões necessárias para concluir o guia. Se você criou um projeto, já tem as permissões necessárias.
-
Verifique se o faturamento está ativado para o projeto do Google Cloud .
Ative as APIs Cloud Build, Cloud Functions, Cloud Pub/Sub, Cloud Run Admin, Cloud Scheduler, Cloud SQL Admin e Eventarc:
Funções necessárias para ativar APIs
Para ativar APIs, você precisa da permissão
serviceusage.services.enable. Se você criou o projeto, provavelmente já tem essa permissão com o papel de Proprietário (roles/owner). Caso contrário, é possível receber essa permissão com o papel de Administrador do Service Usage (roles/serviceusage.serviceUsageAdmin). Saiba como conceder papéis.gcloud services enable cloudbuild.googleapis.com
cloudfunctions.googleapis.com pubsub.googleapis.com run.googleapis.com cloudscheduler.googleapis.com sqladmin.googleapis.com eventarc.googleapis.com -
Configure a autenticação:
-
Verifique se você tem o papel do IAM de criação de contas de serviço
(
roles/iam.serviceAccountCreator) e o papel de administrador do IAM do projeto (roles/resourcemanager.projectIamAdmin). Saiba como conceder papéis. -
Crie a conta de serviço:
gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
Substitua
SERVICE_ACCOUNT_NAMEpor um nome para a conta de serviço. -
Conceda papéis à conta de serviço. Execute uma vez o seguinte comando para cada um dos seguintes papéis do IAM:
roles/cloudbuild.builds.builder, roles/cloudsql.editor, roles/run.invokergcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" --role=ROLE
Substitua:
SERVICE_ACCOUNT_NAME: o nome da conta de serviço.PROJECT_ID: o ID do projeto em que você criou a conta de serviçoROLE: o papel a ser concedido
-
Verifique se você tem o papel do IAM de criação de contas de serviço
(
-
Instale a CLI do Google Cloud.
-
Ao usar um provedor de identidade (IdP) externo, primeiro faça login na CLI gcloud com sua identidade federada.
-
Para inicializar a CLI gcloud, execute o seguinte comando:
gcloud init -
Crie ou selecione um Google Cloud projeto.
Funções necessárias para selecionar ou criar um projeto
- Selecionar um projeto: não é necessário um papel específico do IAM para selecionar um projeto. Você pode escolher qualquer projeto em que tenha recebido um papel.
-
Criar um projeto: para criar um projeto, é necessário ter o papel de Criador de projetos
(
roles/resourcemanager.projectCreator), que contém a permissãoresourcemanager.projects.create. Saiba como conceder papéis.
-
Crie um projeto do Google Cloud :
gcloud projects create PROJECT_ID
Substitua
PROJECT_IDpor um nome para o projeto Google Cloud que você está criando. -
Selecione o projeto Google Cloud que você criou:
gcloud config set project PROJECT_ID
Substitua
PROJECT_IDpelo nome do projeto do Google Cloud .
-
Se este guia estiver usando um projeto atual, verifique se você tem as permissões necessárias para concluir o guia. Se você criou um projeto, já tem as permissões necessárias.
-
Verifique se o faturamento está ativado para o projeto do Google Cloud .
Ative as APIs Cloud Build, Cloud Functions, Cloud Pub/Sub, Cloud Run Admin, Cloud Scheduler, Cloud SQL Admin e Eventarc:
Funções necessárias para ativar APIs
Para ativar APIs, você precisa da permissão
serviceusage.services.enable. Se você criou o projeto, provavelmente já tem essa permissão com o papel de Proprietário (roles/owner). Caso contrário, é possível receber essa permissão com o papel de Administrador do Service Usage (roles/serviceusage.serviceUsageAdmin). Saiba como conceder papéis.gcloud services enable cloudbuild.googleapis.com
cloudfunctions.googleapis.com pubsub.googleapis.com run.googleapis.com cloudscheduler.googleapis.com sqladmin.googleapis.com eventarc.googleapis.com -
Configure a autenticação:
-
Verifique se você tem o papel do IAM de criação de contas de serviço
(
roles/iam.serviceAccountCreator) e o papel de administrador do IAM do projeto (roles/resourcemanager.projectIamAdmin). Saiba como conceder papéis. -
Crie a conta de serviço:
gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
Substitua
SERVICE_ACCOUNT_NAMEpor um nome para a conta de serviço. -
Conceda papéis à conta de serviço. Execute uma vez o seguinte comando para cada um dos seguintes papéis do IAM:
roles/cloudbuild.builds.builder, roles/cloudsql.editor, roles/run.invokergcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" --role=ROLE
Substitua:
SERVICE_ACCOUNT_NAME: o nome da conta de serviço.PROJECT_ID: o ID do projeto em que você criou a conta de serviçoROLE: o papel a ser concedido
-
Verifique se você tem o papel do IAM de criação de contas de serviço
(
Criar uma instância do Cloud SQL
Para criar uma instância do Cloud SQL para SQL Server com o rótulo de recurso env=dev,
use o comando gcloud beta sql instances create:
gcloud beta sql instances create dev-instance \ --database-version=SQLSERVER_2019_EXPRESS \ --region=us-west1 \ --tier=db-custom-2-3840 \ --root-password=YourStrongPassword123! \ --labels=env=dev
A criação da instância pode levar alguns minutos. Para mais informações, consulte Criar instâncias.
Criar tópicos Pub/Sub
Para criar os dois tópicos do Pub/Sub que atuam como fontes de eventos para
seus gatilhos do Eventarc, use o comando
gcloud pubsub topics create:
gcloud pubsub topics create start-instance-event gcloud pubsub topics create stop-instance-event
Para mais informações, consulte Criar um tópico.
Criar e implantar funções do Cloud Run
Crie e implante duas funções do Cloud Run (Node.js) acionadas
pelo Eventarc usando tópicos do Pub/Sub. Quando acionadas, as funções pesquisam instâncias do Cloud SQL no seu projeto que correspondem ao rótulo fornecido na carga útil da mensagem do Pub/Sub (env=dev):
- A função "start" atualiza o
activationPolicyda instância paraALWAYS, o que a ativa. - A função de interrupção atualiza o
activationPolicyparaNEVER, o que desliga a instância.
Para mais informações, consulte Escrever funções do Cloud Run e Acionadores de função do Cloud Run.
Criar as funções
Crie funções do Cloud Run orientadas a eventos que cancelem automaticamente o marshal de eventos em conformidade com a especificação CloudEvents. Essa especificação padrão do setor descreve os dados de eventos de uma maneira comum.
O código-fonte precisa definir um ponto de entrada de função, que é o código executado quando o Cloud Run invoca sua função. Você especifica esse ponto de entrada ao implantar a função.
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/
Implantar as funções orientadas a eventos
Para implantar as funções no Cloud Run, use o comando
gcloud run deploy.
Implante a função que inicia a instância do Cloud SQL:
gcloud run deploy startinstance \ --source . \ --function startInstanceEvent \ --base-image nodejs24 \ --region=us-west1 \ --build-service-account=projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \ --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
Se você for solicitado a criar um repositório na região especificada, digite
y.No prompt
Allow unauthenticated invocations, digiten.Implante a função que encerra a instância do Cloud SQL:
gcloud run deploy stopinstance \ --source . \ --function stopInstanceEvent \ --base-image nodejs24 \ --region=us-west1 \ --build-service-account=projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \ --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
Se você for solicitado a criar um repositório na região especificada, digite
y.No prompt
Allow unauthenticated invocations, digiten.
Quando a implantação for concluída, a Google Cloud CLI vai mostrar um URL em que o serviço está em execução.
Criar gatilhos do Eventarc
Para criar gatilhos do Eventarc que roteiam eventos do
Pub/Sub, use o comando
gcloud eventarc triggers create. Cada mensagem publicada no tópico do Pub/Sub aciona a função correspondente, e o conteúdo da mensagem é transmitido como dados de entrada.
Crie um gatilho que inicie a instância do Cloud SQL:
gcloud eventarc triggers create start-instance-trigger \ --location=us-west1 \ --destination-run-service=startinstance \ --destination-run-region=us-west1 \ --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \ --transport-topic=start-instance-event \ --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
Crie um gatilho que pare a instância do Cloud SQL:
gcloud eventarc triggers create stop-instance-trigger \ --location=us-west1 \ --destination-run-service=stopinstance \ --destination-run-region=us-west1 \ --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \ --transport-topic=stop-instance-event \ --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
Pode levar até dois minutos para um novo gatilho ficar ativo.
Opcional: verificar se as funções funcionam
Para verificar se as funções funcionam, publique mensagens diretamente nos tópicos do Pub/Sub. A atualização da instância do Cloud SQL pode levar alguns minutos.
Para interromper instâncias com o rótulo
env=dev, use o comandogcloud pubsub topics publishpara publicar uma mensagem no tópico de interrupção:gcloud pubsub topics publish stop-instance-event --message='{"label":"env=dev"}'
Para confirmar que a instância foi interrompida, verifique a política de ativação dela usando o comando
gcloud sql instances describe:gcloud sql instances describe dev-instance --format="value(settings.activationPolicy)"
A saída precisa ser
NEVER.Para iniciar instâncias com o rótulo
env=dev, publique uma mensagem no tópico start:gcloud pubsub topics publish start-instance-event --message='{"label":"env=dev"}'
Confirme se a instância foi iniciada verificando a política de ativação dela:
gcloud sql instances describe dev-instance --format="value(settings.activationPolicy)"
A saída precisa ser
ALWAYS.
Criar os jobs do Cloud Scheduler
Crie jobs do Cloud Scheduler que publiquem mensagens nos tópicos do Pub/Sub em uma programação regular.
Para criar um job que seja executado às 9h, de segunda a sexta-feira, e que inicie as instâncias, use o comando
gcloud scheduler jobs create:gcloud scheduler jobs create pubsub startup-dev-instances \ --schedule '0 9 * * 1-5' \ --topic start-instance-event \ --message-body '{"label":"env=dev"}' \ --time-zone 'America/Los_Angeles' \ --location us-east1
Crie um job que seja executado às 17h, de segunda a sexta-feira, e que pare as instâncias:
gcloud scheduler jobs create pubsub shutdown-dev-instances \ --schedule '0 17 * * 1-5' \ --topic stop-instance-event \ --message-body '{"label":"env=dev"}' \ --time-zone 'America/Los_Angeles' \ --location us-east1
Devido a algumas configurações iniciais, a execução do primeiro job criado em um projeto pode levar alguns minutos.
Opcional: verificar se os jobs funcionam
É possível executar manualmente os jobs do Cloud Scheduler para verificar se eles acionam as funções de início e parada corretamente. A atualização da instância do Cloud SQL pode levar alguns minutos.
Para executar o job e interromper a instância do Cloud SQL, use o comando
gcloud scheduler jobs run:gcloud scheduler jobs run shutdown-dev-instances --location="us-east1"
Verifique se a política de ativação de
dev-instanceéNEVER:gcloud sql instances describe dev-instance --format="value(settings.activationPolicy)"
Execute o job para iniciar a instância:
gcloud scheduler jobs run startup-dev-instances --location="us-east1"
Verifique se a política de ativação de
dev-instanceéALWAYS:gcloud sql instances describe dev-instance --format="value(settings.activationPolicy)"
Limpar
Para evitar cobranças pelos recursos usados neste tutorial, exclua-os.
- Exclua os jobs do Cloud Scheduler.
gcloud scheduler jobs delete startup-dev-instances --location=us-east1 --quiet gcloud scheduler jobs delete shutdown-dev-instances --location=us-east1 --quiet
- Exclua os gatilhos do Eventarc:
gcloud eventarc triggers delete start-instance-trigger --location=us-west1 --quiet gcloud eventarc triggers delete stop-instance-trigger --location=us-west1 --quiet
- Exclua os serviços do Cloud Run:
gcloud run services delete startinstance --region=us-west1 --quiet gcloud run services delete stopinstance --region=us-west1 --quiet
- Excluir os tópicos do Pub/Sub:
gcloud pubsub topics delete start-instance-event gcloud pubsub topics delete stop-instance-event
- Exclua a instância do Cloud SQL:
gcloud sql instances delete dev-instance --quiet
- Se preferir, exclua o projeto do Google Cloud para evitar cobranças. A exclusão do projeto Google Cloud interrompe o faturamento de todos os
recursos usados nele.
Excluir um projeto do Google Cloud :
gcloud projects delete PROJECT_ID
A seguir
- Confira arquiteturas de referência, diagramas, tutoriais e práticas recomendadas do Google Cloud. Confira o Centro de arquitetura do Cloud.