Programar o início ou a interrupção de uma instância do Cloud SQL

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:

  1. Crie uma instância do Cloud SQL para SQL Server e atribua a ela um rótulo de recurso específico (env=dev).
  2. Crie dois tópicos do Pub/Sub para atuar como fontes de eventos para seus gatilhos do Eventarc e como agentes de mensagens.
  3. 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).
  4. 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.
  5. 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:

Como iniciar e interromper instâncias do Cloud SQL com base em uma programação
Como iniciar e parar instâncias do Cloud SQL de acordo com uma programação. Clique no diagrama para ampliar.

Custos

Neste documento, você vai usar os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços.

Novos usuários do Google Cloud podem estar qualificados para um teste sem custo financeiro.

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 .

  1. 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.
  2. Instale a CLI do Google Cloud.

  3. Ao usar um provedor de identidade (IdP) externo, primeiro faça login na CLI gcloud com sua identidade federada.

  4. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  5. 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ão resourcemanager.projects.create. Saiba como conceder papéis.
    • Crie um projeto do Google Cloud :

      gcloud projects create PROJECT_ID

      Substitua PROJECT_ID por 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_ID pelo nome do projeto do Google Cloud .

  6. 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.

  7. Verifique se o faturamento está ativado para o projeto do Google Cloud .

  8. 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
  9. Configure a autenticação:

    1. 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.
    2. Crie a conta de serviço:

      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

      Substitua SERVICE_ACCOUNT_NAME por um nome para a conta de serviço.

    3. 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.invoker

      gcloud 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ço
      • ROLE: o papel a ser concedido
  10. Instale a CLI do Google Cloud.

  11. Ao usar um provedor de identidade (IdP) externo, primeiro faça login na CLI gcloud com sua identidade federada.

  12. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  13. 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ão resourcemanager.projects.create. Saiba como conceder papéis.
    • Crie um projeto do Google Cloud :

      gcloud projects create PROJECT_ID

      Substitua PROJECT_ID por 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_ID pelo nome do projeto do Google Cloud .

  14. 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.

  15. Verifique se o faturamento está ativado para o projeto do Google Cloud .

  16. 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
  17. Configure a autenticação:

    1. 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.
    2. Crie a conta de serviço:

      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

      Substitua SERVICE_ACCOUNT_NAME por um nome para a conta de serviço.

    3. 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.invoker

      gcloud 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ço
      • ROLE: o papel a ser concedido

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 activationPolicy da instância para ALWAYS, o que a ativa.
  • A função de interrupção atualiza o activationPolicy para NEVER, 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.

  1. 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.

  2. 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.

  1. 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
  2. Se você for solicitado a criar um repositório na região especificada, digite y.

  3. No prompt Allow unauthenticated invocations, digite n.

  4. 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
  5. Se você for solicitado a criar um repositório na região especificada, digite y.

  6. No prompt Allow unauthenticated invocations, digite n.

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.

  1. 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
  2. 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.

  1. Para interromper instâncias com o rótulo env=dev, use o comando gcloud pubsub topics publish para publicar uma mensagem no tópico de interrupção:

    gcloud pubsub topics publish stop-instance-event --message='{"label":"env=dev"}'
  2. 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.

  3. 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"}'
  4. 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.

  1. 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
  2. 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.

  1. 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"
  2. Verifique se a política de ativação de dev-instance é NEVER:

    gcloud sql instances describe dev-instance --format="value(settings.activationPolicy)"
  3. Execute o job para iniciar a instância:

    gcloud scheduler jobs run startup-dev-instances --location="us-east1"
  4. 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.

  1. 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
  2. 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
  3. 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
  4. Excluir os tópicos do Pub/Sub:
    gcloud pubsub topics delete start-instance-event
    gcloud pubsub topics delete stop-instance-event
  5. Exclua a instância do Cloud SQL:
    gcloud sql instances delete dev-instance --quiet
  6. 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