安排 Cloud SQL 实例的启动或停止时间

您可以使用 Cloud Scheduler 按常规时间表启动和停止 Cloud SQL 实例。例如,您可能希望实例仅在特定时段运行。

本教程演示了如何使用 Google Cloud 产品构建事件驱动型架构,以自动启动和停止 Cloud SQL for SQL Server 实例。

目标

在本教程中,您将创建 Cloud Scheduler 作业,以调度带有 env=dev 资源标签的 Cloud SQL 实例在特定时间运行。您将仅安排一个实例。不过,本教程中介绍的架构可用于停止和启动资源标签为 env=dev 的多个实例。

为实现此目标,请完成以下步骤:

  1. 创建 Cloud SQL for SQL Server 实例,并为其分配特定的资源标签 (env=dev)。
  2. 创建两个 Pub/Sub 主题,用作 Eventarc 触发器的事件源和消息代理。
  3. 创建并部署两个通过 Pub/Sub 主题触发的事件驱动型 Cloud Run 函数。触发后,函数会在您的项目中搜索与 Pub/Sub 消息载荷 (env=dev) 中提供的标签匹配的 Cloud SQL 实例。
  4. 创建并部署两个 Eventarc 触发器。 Pub/Sub 主题事件会以 HTTP 请求的形式路由到您的函数,并且事件消息内容会作为输入数据传递给函数。
  5. 创建两个 Cloud Scheduler cron 作业,以在特定时间将包含目标标签的消息发布到 Pub/Sub 主题。将实例安排为在周一至周五的上午 9:00 启动,下午 5:00 停止。

下图概述了事件驱动型架构:

按时间表启动和停止 Cloud SQL 实例
按计划启动和停止 Cloud SQL 实例(点击图表可放大)。

费用

在本文档中,您将使用 Google Cloud的以下收费组件:

如需根据您的预计使用情况来估算费用,请使用价格计算器

新 Google Cloud 用户可能有资格申请免费试用

完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理

准备工作

您的组织定义的安全限制条件可能会导致您无法完成以下步骤。如需了解相关问题排查信息,请参阅在受限的 Google Cloud 环境中开发应用

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud新手,请 创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 安装 Google Cloud CLI。

  3. 如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI

  4. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init
  5. 创建或选择 Google Cloud 项目

    选择或创建项目所需的角色

    • 选择项目:选择项目不需要特定的 IAM 角色,您可以选择已获授角色的任何项目。
    • 创建项目:如需创建项目,您需要拥有 Project Creator 角色 (roles/resourcemanager.projectCreator),该角色包含 resourcemanager.projects.create 权限。了解如何授予角色
    • 创建 Google Cloud 项目:

      gcloud projects create PROJECT_ID

      PROJECT_ID 替换为您要创建的 Google Cloud 项目的名称。

    • 选择您创建的 Google Cloud 项目:

      gcloud config set project PROJECT_ID

      PROJECT_ID 替换为您的 Google Cloud 项目名称。

  6. 如果您要使用现有项目来完成本指南,请验证您是否拥有完成本指南所需的权限。如果您创建了新项目,则您已拥有所需的权限。

  7. 验证是否已为您的 Google Cloud 项目启用结算功能

  8. 启用 Cloud Build、Cloud Functions、Cloud Pub/Sub、Cloud Run Admin、Cloud Scheduler、Cloud SQL Admin 和 Eventarc API:

    启用 API 所需的角色

    如需启用 API,您需要拥有 serviceusage.services.enable 权限。如果您创建了项目,则可能已经通过 Owner 角色 (roles/owner) 获得了此权限。否则,您可以通过 Service Usage Admin 角色 (roles/serviceusage.serviceUsageAdmin) 获得此权限。了解如何授予角色

    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. 设置身份验证:

    1. 确保您拥有 Create Service Accounts IAM 角色 (roles/iam.serviceAccountCreator) 和 Project IAM Admin 角色 (roles/resourcemanager.projectIamAdmin)。了解如何授予角色
    2. 创建服务账号:

      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

      SERVICE_ACCOUNT_NAME 替换为服务账号的名称。

    3. 向服务账号授予角色。对以下每个 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

      请替换以下内容:

      • SERVICE_ACCOUNT_NAME:服务账号的名称
      • PROJECT_ID:您在其中创建服务账号的项目的 ID
      • ROLE:要授予的角色
  10. 安装 Google Cloud CLI。

  11. 如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI

  12. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init
  13. 创建或选择 Google Cloud 项目

    选择或创建项目所需的角色

    • 选择项目:选择项目不需要特定的 IAM 角色,您可以选择已获授角色的任何项目。
    • 创建项目:如需创建项目,您需要拥有 Project Creator 角色 (roles/resourcemanager.projectCreator),该角色包含 resourcemanager.projects.create 权限。了解如何授予角色
    • 创建 Google Cloud 项目:

      gcloud projects create PROJECT_ID

      PROJECT_ID 替换为您要创建的 Google Cloud 项目的名称。

    • 选择您创建的 Google Cloud 项目:

      gcloud config set project PROJECT_ID

      PROJECT_ID 替换为您的 Google Cloud 项目名称。

  14. 如果您要使用现有项目来完成本指南,请验证您是否拥有完成本指南所需的权限。如果您创建了新项目,则您已拥有所需的权限。

  15. 验证是否已为您的 Google Cloud 项目启用结算功能

  16. 启用 Cloud Build、Cloud Functions、Cloud Pub/Sub、Cloud Run Admin、Cloud Scheduler、Cloud SQL Admin 和 Eventarc API:

    启用 API 所需的角色

    如需启用 API,您需要拥有 serviceusage.services.enable 权限。如果您创建了项目,则可能已经通过 Owner 角色 (roles/owner) 获得了此权限。否则,您可以通过 Service Usage Admin 角色 (roles/serviceusage.serviceUsageAdmin) 获得此权限。了解如何授予角色

    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. 设置身份验证:

    1. 确保您拥有 Create Service Accounts IAM 角色 (roles/iam.serviceAccountCreator) 和 Project IAM Admin 角色 (roles/resourcemanager.projectIamAdmin)。了解如何授予角色
    2. 创建服务账号:

      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

      SERVICE_ACCOUNT_NAME 替换为服务账号的名称。

    3. 向服务账号授予角色。对以下每个 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

      请替换以下内容:

      • SERVICE_ACCOUNT_NAME:服务账号的名称
      • PROJECT_ID:您在其中创建服务账号的项目的 ID
      • ROLE:要授予的角色

创建 Cloud SQL 实例

如需创建资源标签为 env=dev 的 Cloud SQL for SQL Server 实例,请使用 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

创建实例可能需要几分钟时间。如需了解详情,请参阅创建实例

创建 Pub/Sub 主题

如需创建两个充当 Eventarc 触发器事件来源的 Pub/Sub 主题,请使用 gcloud pubsub topics create 命令:

gcloud pubsub topics create start-instance-event
gcloud pubsub topics create stop-instance-event

如需了解详情,请参阅创建主题

创建和部署 Cloud Run 函数

创建并部署两个由 Eventarc 通过 Pub/Sub 主题触发的 Cloud Run (Node.js) 函数。触发后,函数会在您的项目中搜索与 Pub/Sub 消息载荷 (env=dev) 中提供的标签匹配的 Cloud SQL 实例:

  • 启动函数会将实例的 activationPolicy 更新为 ALWAYS,从而开启实例。
  • 停止函数会将 activationPolicy 更新为 NEVER,从而关闭实例。

如需了解详情,请参阅编写 Cloud Run functions 函数Cloud Run functions 触发器

创建函数

创建事件驱动型 Cloud Run 函数,该函数会自动取消封送符合 CloudEvents 规范的事件。此行业标准规范以通用方式描述事件数据。

源代码必须定义函数入口点,这是 Cloud Run 调用函数时运行的代码。您可以在部署函数时指定此入口点。

  1. 下载代码。

    git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git

    或者,您也可以下载该示例的 zip 文件并将其解压缩。

  2. 转到正确的目录。

    cd nodejs-docs-samples/functions/scheduleinstance/

部署事件驱动型函数

如需在 Cloud Run 上部署函数,请使用 gcloud run deploy 命令。

  1. 部署用于启动 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. 如果系统提示您在指定区域中创建仓库,请键入 y

  3. Allow unauthenticated invocations 提示符处,输入 n

  4. 部署用于关停 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. 如果系统提示您在指定区域中创建仓库,请键入 y

  6. Allow unauthenticated invocations 提示符处,输入 n

部署完成后,Google Cloud CLI 会显示运行服务的网址。

创建 Eventarc 触发器

如需创建 Eventarc 触发器以路由来自 Pub/Sub 的事件,请使用 gcloud eventarc triggers create 命令。发布到 Pub/Sub 主题的每条消息都会触发相应函数,并且消息内容会作为输入数据传递。

  1. 创建用于启动 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. 创建用于停止 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

新触发器最多可能需要 2 分钟才能生效。

可选:验证函数能否正常运行

您可以直接向 Pub/Sub 主题发布消息,以验证函数是否正常运行。更新 Cloud SQL 实例可能需要几分钟时间。

  1. 如需停止具有 env=dev 标签的实例,请使用 gcloud pubsub topics publish 命令向停止主题发布消息:

    gcloud pubsub topics publish stop-instance-event --message='{"label":"env=dev"}'
  2. 如需确认实例已停止,请使用 gcloud sql instances describe 命令检查其激活政策:

    gcloud sql instances describe dev-instance --format="value(settings.activationPolicy)"

    输出应为 NEVER

  3. 如需启动具有标签 env=dev 的实例,请向启动主题发布消息:

    gcloud pubsub topics publish start-instance-event --message='{"label":"env=dev"}'
  4. 通过检查实例的激活政策来确认实例是否已启动:

    gcloud sql instances describe dev-instance --format="value(settings.activationPolicy)"

    输出应为 ALWAYS

创建 Cloud Scheduler 作业

创建 Cloud Scheduler 作业,以便按预定的时间表将消息发布到 Pub/Sub 主题。

  1. 如需创建在周一至周五上午 9:00 运行并启动实例的作业,请使用 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. 创建一项作业,该作业在周一至周五下午 5:00 运行,并停止实例:

    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

由于需要进行一些初始配置,因此在项目中创建的第一项作业可能需要几分钟时间才能运行完毕。

可选:验证作业是否能正常运行

您可以手动运行 Cloud Scheduler 作业,以验证它们是否成功触发了启动和停止函数。更新 Cloud SQL 实例可能需要几分钟时间。

  1. 如需运行作业并停止 Cloud SQL 实例,请使用 gcloud scheduler jobs run 命令:

    gcloud scheduler jobs run shutdown-dev-instances --location="us-east1"
  2. 验证 dev-instance 的激活政策是否为 NEVER

    gcloud sql instances describe dev-instance --format="value(settings.activationPolicy)"
  3. 运行作业以启动实例:

    gcloud scheduler jobs run startup-dev-instances --location="us-east1"
  4. 验证 dev-instance 的激活政策是否为 ALWAYS

    gcloud sql instances describe dev-instance --format="value(settings.activationPolicy)"

清理

为避免因本教程中使用的资源产生费用,请通过删除这些资源来清理它们。

  1. 删除 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. 删除 Eventarc 触发器:
    gcloud eventarc triggers delete start-instance-trigger --location=us-west1 --quiet
    gcloud eventarc triggers delete stop-instance-trigger --location=us-west1 --quiet
  3. 删除 Cloud Run 服务:
    gcloud run services delete startinstance --region=us-west1 --quiet
    gcloud run services delete stopinstance --region=us-west1 --quiet
  4. 删除 Pub/Sub 主题:
    gcloud pubsub topics delete start-instance-event
    gcloud pubsub topics delete stop-instance-event
  5. 删除 Cloud SQL 实例:
    gcloud sql instances delete dev-instance --quiet
  6. 或者,您也可以删除 Google Cloud 项目,以避免产生费用。删除 Google Cloud 项目后,系统会停止对该项目中使用的所有资源计费。

    删除 Google Cloud 项目:

    gcloud projects delete PROJECT_ID

后续步骤

  • 探索有关 Google Cloud 的参考架构、图表和最佳做法。查看我们的 Cloud 架构中心