您可以使用 Cloud Scheduler 按常规时间表启动和停止 Cloud SQL 实例。例如,您可能希望实例仅在特定时段运行。
本教程演示了如何使用 Google Cloud 产品构建事件驱动型架构,以自动启动和停止 Cloud SQL for SQL Server 实例。
目标
在本教程中,您将创建 Cloud Scheduler 作业,以调度带有 env=dev 资源标签的 Cloud SQL 实例在特定时间运行。您将仅安排一个实例。不过,本教程中介绍的架构可用于停止和启动资源标签为 env=dev 的多个实例。
为实现此目标,请完成以下步骤:
- 创建 Cloud SQL for SQL Server 实例,并为其分配特定的资源标签 (
env=dev)。 - 创建两个 Pub/Sub 主题,用作 Eventarc 触发器的事件源和消息代理。
- 创建并部署两个通过 Pub/Sub 主题触发的事件驱动型 Cloud Run 函数。触发后,函数会在您的项目中搜索与 Pub/Sub 消息载荷 (
env=dev) 中提供的标签匹配的 Cloud SQL 实例。 - 创建并部署两个 Eventarc 触发器。 Pub/Sub 主题事件会以 HTTP 请求的形式路由到您的函数,并且事件消息内容会作为输入数据传递给函数。
- 创建两个 Cloud Scheduler cron 作业,以在特定时间将包含目标标签的消息发布到 Pub/Sub 主题。将实例安排为在周一至周五的上午 9:00 启动,下午 5:00 停止。
下图概述了事件驱动型架构:
费用
在本文档中,您将使用 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
如需根据您的预计使用情况来估算费用,请使用价格计算器。
完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理。
准备工作
您的组织定义的安全限制条件可能会导致您无法完成以下步骤。如需了解相关问题排查信息,请参阅在受限的 Google Cloud 环境中开发应用。
- 登录您的 Google Cloud 账号。如果您是 Google Cloud新手,请 创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
-
安装 Google Cloud CLI。
-
如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI。
-
如需初始化 gcloud CLI,请运行以下命令:
gcloud init -
选择或创建项目所需的角色
- 选择项目:选择项目不需要特定的 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 项目名称。
-
如果您要使用现有项目来完成本指南,请验证您是否拥有完成本指南所需的权限。如果您创建了新项目,则您已拥有所需的权限。
启用 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 -
设置身份验证:
-
确保您拥有 Create Service Accounts IAM 角色 (
roles/iam.serviceAccountCreator) 和 Project IAM Admin 角色 (roles/resourcemanager.projectIamAdmin)。了解如何授予角色。 -
创建服务账号:
gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
将
SERVICE_ACCOUNT_NAME替换为服务账号的名称。 -
向服务账号授予角色。对以下每个 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
请替换以下内容:
SERVICE_ACCOUNT_NAME:服务账号的名称PROJECT_ID:您在其中创建服务账号的项目的 IDROLE:要授予的角色
-
确保您拥有 Create Service Accounts IAM 角色 (
-
安装 Google Cloud CLI。
-
如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI。
-
如需初始化 gcloud CLI,请运行以下命令:
gcloud init -
选择或创建项目所需的角色
- 选择项目:选择项目不需要特定的 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 项目名称。
-
如果您要使用现有项目来完成本指南,请验证您是否拥有完成本指南所需的权限。如果您创建了新项目,则您已拥有所需的权限。
启用 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 -
设置身份验证:
-
确保您拥有 Create Service Accounts IAM 角色 (
roles/iam.serviceAccountCreator) 和 Project IAM Admin 角色 (roles/resourcemanager.projectIamAdmin)。了解如何授予角色。 -
创建服务账号:
gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
将
SERVICE_ACCOUNT_NAME替换为服务账号的名称。 -
向服务账号授予角色。对以下每个 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
请替换以下内容:
SERVICE_ACCOUNT_NAME:服务账号的名称PROJECT_ID:您在其中创建服务账号的项目的 IDROLE:要授予的角色
-
确保您拥有 Create Service Accounts IAM 角色 (
创建 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 调用函数时运行的代码。您可以在部署函数时指定此入口点。
下载代码。
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
或者,您也可以下载该示例的 zip 文件并将其解压缩。
转到正确的目录。
cd nodejs-docs-samples/functions/scheduleinstance/
部署事件驱动型函数
如需在 Cloud Run 上部署函数,请使用 gcloud run deploy 命令。
部署用于启动 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
如果系统提示您在指定区域中创建仓库,请键入
y。在
Allow unauthenticated invocations提示符处,输入n。部署用于关停 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
如果系统提示您在指定区域中创建仓库,请键入
y。在
Allow unauthenticated invocations提示符处,输入n。
部署完成后,Google Cloud CLI 会显示运行服务的网址。
创建 Eventarc 触发器
如需创建 Eventarc 触发器以路由来自 Pub/Sub 的事件,请使用 gcloud eventarc triggers create 命令。发布到 Pub/Sub 主题的每条消息都会触发相应函数,并且消息内容会作为输入数据传递。
创建用于启动 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
创建用于停止 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 实例可能需要几分钟时间。
如需停止具有
env=dev标签的实例,请使用gcloud pubsub topics publish命令向停止主题发布消息:gcloud pubsub topics publish stop-instance-event --message='{"label":"env=dev"}'
如需确认实例已停止,请使用
gcloud sql instances describe命令检查其激活政策:gcloud sql instances describe dev-instance --format="value(settings.activationPolicy)"
输出应为
NEVER。如需启动具有标签
env=dev的实例,请向启动主题发布消息:gcloud pubsub topics publish start-instance-event --message='{"label":"env=dev"}'
通过检查实例的激活政策来确认实例是否已启动:
gcloud sql instances describe dev-instance --format="value(settings.activationPolicy)"
输出应为
ALWAYS。
创建 Cloud Scheduler 作业
创建 Cloud Scheduler 作业,以便按预定的时间表将消息发布到 Pub/Sub 主题。
如需创建在周一至周五上午 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
创建一项作业,该作业在周一至周五下午 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 实例可能需要几分钟时间。
如需运行作业并停止 Cloud SQL 实例,请使用
gcloud scheduler jobs run命令:gcloud scheduler jobs run shutdown-dev-instances --location="us-east1"
验证
dev-instance的激活政策是否为NEVER:gcloud sql instances describe dev-instance --format="value(settings.activationPolicy)"
运行作业以启动实例:
gcloud scheduler jobs run startup-dev-instances --location="us-east1"
验证
dev-instance的激活政策是否为ALWAYS:gcloud sql instances describe dev-instance --format="value(settings.activationPolicy)"
清理
为避免因本教程中使用的资源产生费用,请通过删除这些资源来清理它们。
- 删除 Cloud Scheduler 作业:
gcloud scheduler jobs delete startup-dev-instances --location=us-east1 --quiet gcloud scheduler jobs delete shutdown-dev-instances --location=us-east1 --quiet
- 删除 Eventarc 触发器:
gcloud eventarc triggers delete start-instance-trigger --location=us-west1 --quiet gcloud eventarc triggers delete stop-instance-trigger --location=us-west1 --quiet
- 删除 Cloud Run 服务:
gcloud run services delete startinstance --region=us-west1 --quiet gcloud run services delete stopinstance --region=us-west1 --quiet
- 删除 Pub/Sub 主题:
gcloud pubsub topics delete start-instance-event gcloud pubsub topics delete stop-instance-event
- 删除 Cloud SQL 实例:
gcloud sql instances delete dev-instance --quiet
- 或者,您也可以删除 Google Cloud 项目,以避免产生费用。删除 Google Cloud 项目后,系统会停止对该项目中使用的所有资源计费。
删除 Google Cloud 项目:
gcloud projects delete PROJECT_ID
后续步骤
- 探索有关 Google Cloud 的参考架构、图表和最佳做法。查看我们的 Cloud 架构中心。