本教程介绍了如何使用 Cloud Scheduler 和 Cloud Run 函数通过资源标签定期自动启动和停止 Compute Engine 实例。
目标
- 使用 Cloud Run 函数编写和部署一组启用和停止 Compute Engine 实例的函数。
- 使用 Cloud Scheduler 创建一组作业,调度带
dev
资源标签的实例在周一至周五的 09:00-17:00 运行,以匹配典型的工作时间。
费用
在本文档中,您将使用 Google Cloud 的以下收费组件:
- Cloud Scheduler
- Cloud Run functions
- Pub/Sub
- Compute Engine
准备工作
- 为 Cloud Scheduler 设置环境。
-
Enable the Cloud Run functions, Pub/Sub, and Compute Engine APIs.
应用架构
此解决方案包含以下 Google Cloud 组件:
- 我们希望按时间表运行的 Compute Engine 实例。
- Cloud Run 函数,用于启动和停止我们要调度的实例。
- 针对每个启动和停止事件发送和接收的 Pub/Sub 消息。
- Cloud Scheduler 作业:根据具体时间表进行调用以启动和停止实例的作业。
地理位置要求
某些组件仅在特定区域受支持:
- Compute Engine 实例:在区域和地区中列出的任何区域中皆受支持。
- Cloud Run 函数:在位置中列出的区域中受支持。
- Pub/Sub 消息:Pub/Sub 是一项全球服务,因此在全球皆受支持。
- 具有 Pub/Sub 目标的 Cloud Scheduler 作业:在任何 Google Cloud 位置皆受支持。
为什么不用 HTTP 取代 Pub/Sub?
您可能希望使用 Cloud Run 函数 HTTP 触发器代替 Pub/Sub 触发器来简化此架构。
本教程使用 Pub/Sub 作为 Cloud Run 函数触发器,因为此方法以前比使用 HTTP 更安全。不过,HTTP 也是一个可行的选择,现在可以通过要求进行身份验证来实现安全。
如需了解如何确保 Cloud Run functions 的安全,请参阅 Cloud Run functions 安全概览。如需了解 HTTP 和 Pub/Sub 触发器之间的比较,请参阅 Cloud Run functions 触发器文档。
设置 Compute Engine 实例
控制台
- 前往 Google Cloud 控制台中的虚拟机实例页面。
转到“虚拟机实例”页面。 - 点击创建实例。
- 将名称设置为
dev-instance
。 - 在标签下,点击添加标签。
- 点击添加标签。
- 为 Key 输入
env
,为 Value 输入dev
。 - 对于区域,选择 us-west1。
- 对于地区,选择 us-west1-b。
- 点击保存。
- 点击该页面底部的创建。
gcloud
gcloud compute instances create dev-instance \ --network default \ --zone us-west1-b \ --labels=env=dev
通过 Cloud Run 函数部署由 Pub/Sub 触发的函数
创建和部署函数
Console
创建启动函数。
- 前往 Google Cloud 控制台中的 Cloud Run functions 页面。
前往 Cloud Run functions 页面。 - 点击创建函数。
- 在环境部分,选择第 1 代。
- 将函数名称设置为
startInstancePubSub
。 - 保留区域的默认值。
- 对于触发器类型,选择 Cloud Pub/Sub。
- 在选择 Cloud Pub/Sub 主题部分,点击创建主题。
- 系统随即会显示创建主题对话框。
- 在主题 ID 下,输入
start-instance-event
。 - 点击创建以完成对话框。
- 在主题 ID 下,输入
- 点击触发器框底部的保存。
- 点击页面底部的下一步。
- 对于运行时,请选择 Node.js 16 或更高版本。
- 对于入口点,请输入
startInstancePubSub
。 - 在代码编辑器的左侧,选择 index.js。
使用以下代码替换入门代码:
在代码编辑器的左侧,选择 package.json。
使用以下代码替换入门代码:
点击页面底部的部署 (Deploy)。
创建停止函数。
- 您应该位于 Google Cloud 控制台中的 Cloud Run 函数页面。
- 点击创建函数。
- 在环境部分,选择第 1 代。
- 将函数名称设置为
stopInstancePubSub
。 - 保留区域的默认值。
- 对于触发器类型,选择 Cloud Pub/Sub。
- 在选择 Cloud Pub/Sub 主题部分,点击创建主题。
- 系统随即会显示创建主题对话框。
- 在主题 ID 下,输入
stop-instance-event
。 - 点击创建以完成对话框。
- 在主题 ID 下,输入
- 点击触发器框底部的保存。
- 点击页面底部的下一步。
- 对于运行时,请选择 Node.js 16 或更高版本。
- 对于入口点,请输入
stopInstancePubSub
。 - 在代码编辑器的左侧,选择 index.js。
使用以下代码替换入门代码:
在代码编辑器的左侧,选择 package.json。
使用以下代码替换入门代码:
点击页面底部的部署 (Deploy)。
gcloud
创建 Pub/Sub 主题。
gcloud pubsub topics create start-instance-event
gcloud pubsub topics create stop-instance-event
获取代码
下载代码。
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
或者,您也可以下载该示例的 zip 文件并将其解压缩。
转到正确的目录。
cd nodejs-docs-samples/functions/scheduleinstance/
创建启动和停止函数。
您应该已位于 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
(可选)验证函数能否正常运行
Console
停止实例
- 前往 Google Cloud 控制台中的 Cloud Run functions 页面。
前往 Cloud Run functions 页面。 - 点击名为
stopInstancePubSub
的函数。 - 您应该会看到许多标签页:常规、触发器、源、权限和测试。点击测试标签页。
对于触发事件,输入以下内容:
{"data":"eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo="}
这只是
{"zone":"us-west1-b", "label":"env=dev"}
的 base64 编码的字符串如果您想要编码生成自己的字符串,则可以随意使用任何在线 base64 编码工具。
点击测试函数按钮。
当函数完成运行时,您应该会看到输出下面显示了
Successfully stopped instance dev-instance
。完成运行可能最多需要 60 秒。如果您看到的是
error: 'Error: function failed to load.'
,只需等待 10 秒左右以便函数完成部署,然后重试。如果您看到的是
error: 'Error: function execution attempt timed out.'
,直接继续下一步,以确定实例是否只是需要较长时间完成关闭。如果函数完成了运行,但没有显示任何内容,则可能也只是超时。直接继续下一步,以确定实例是否只是需要较长时间完成关闭。
前往 Google Cloud 控制台中的虚拟机实例页面。
转到“虚拟机实例”页面。验证名为
dev-instance
的实例的名称旁边是否有灰色方块,该方块表示实例已停止。完成关闭可能最多需要 30 秒。- 如果似乎未完成关闭,尝试点击页面顶部的刷新。
启动实例
- 前往 Google Cloud 控制台中的 Cloud Run functions 页面。
前往 Cloud Run functions 页面。 - 点击名为
startInstancePubSub
的函数。 - 您应该会看到许多标签页:常规、触发器、源、权限和测试。点击测试标签页。
对于触发事件,输入以下内容:
{"data":"eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo="}
- 同样,这只是
{"zone":"us-west1-b", "label":"env=dev"}
的 base64 编码的字符串
- 同样,这只是
点击测试函数按钮。
当函数完成运行时,您应该会看到输出下面显示了
Successfully started instance dev-instance
。前往 Google Cloud 控制台中的虚拟机实例页面。
转到“虚拟机实例”页面。验证名为
dev-instance
的实例的名称旁边是否有绿色对勾标记,该标记表示实例正在运行。完成启动可能最多需要 30 秒。
gcloud
停止实例
调用以下函数来停止实例。
gcloud functions call stopInstancePubSub \ --data '{"data":"eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo="}'
这只是
{"zone":"us-west1-b", "label":"env=dev"}
的 base64 编码的字符串如果您想编码生成自己的字符串,可以使用任何工具。 以下示例中使用了
base64
命令行工具:echo '{"zone":"us-west1-b", "label":"env=dev"}' | base64
eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo=
函数完成后,您将看到以下内容:
result: Successfully stopped instance dev-instance
完成运行可能最多需要 60 秒。
如果您看到以下错误:
error: 'Error: function failed to load.`
只需等待 10 秒左右以便函数完成部署,然后重试。
如果您看到以下错误:
error: `Error: function execution attempt timed out.`
直接继续下一步,以确定实例是否只是需要较长时间完成关闭。
如果您未看到任何结果,该函数可能只是超时。 直接继续下一步,以确定实例是否只是需要较长时间完成关闭。
检查实例的状态是否为
TERMINATED
。完成关闭可能最多需要 30 秒。gcloud compute instances describe dev-instance \ --zone us-west1-b \ | grep status
status: TERMINATED
启动实例
调用以下函数来启动实例。
gcloud functions call startInstancePubSub \ --data '{"data":"eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo="}'
- 同样,这只是
{"zone":"us-west1-b", "label":"env=dev"}
的 base64 编码的字符串
函数完成后,您将看到以下内容:
result: Successfully started instance dev-instance
- 同样,这只是
检查实例的状态是否为
RUNNING
。完成启动可能最多需要 30 秒。gcloud compute instances describe dev-instance \ --zone us-west1-b \ | grep status
status: RUNNING
设置 Cloud Scheduler 作业以调用 Pub/Sub
创建作业
Console
创建启动作业。
- 在 Google Cloud 控制台中,前往 Cloud Scheduler 页面。
转到 Cloud Scheduler 页面。 - 点击创建作业。
- 保留默认区域。
- 将名称设置为
startup-dev-instances
。 - 对于频率,输入
0 9 * * 1-5
。- 此操作会在周一至周五的上午 9 点执行。
- 对于时区,请选择相应的国家/地区和时区。此示例将使用
United States
和Los Angeles
。 - 点击继续。
- 对于目标类型,请选择
Pub/Sub
。 - 从主题下拉菜单中选择
start-instance-event
。 - 对于消息,输入以下内容:
{"zone":"us-west1-b","label":"env=dev"}
- 点击创建。
创建停止作业。
- 您应该会看到 Google Cloud 控制台中的 Cloud Scheduler 页面。
- 点击创建作业。
- 保留默认区域,然后点击页面底部的下一步。
- 将名称设置为
shutdown-dev-instances
。 - 对于频率,输入
0 17 * * 1-5
。- 此操作会在周一至周五的 17:00 执行。
- 对于时区,请选择相应的国家/地区和时区。此示例将使用
United States
和Los Angeles
。 - 点击继续。
- 对于目标类型,请选择
Pub/Sub
。 - 从主题下拉菜单中选择
stop-instance-event
。 - 对于消息,输入以下内容:
{"zone":"us-west1-b","label":"env=dev"}
- 点击创建。
gcloud
创建启动作业。
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
创建停止作业。
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
(可选)验证作业能否正常运行
Console
停止实例
- 在 Google Cloud 控制台中,前往 Cloud Scheduler 页面。
转到 Cloud Scheduler 页面。 - 对于名为
shutdown-dev-instances
的作业,点击页面最右侧的立即运行按钮。 - 前往 Google Cloud 控制台中的虚拟机实例页面。
转到“虚拟机实例”页面。 - 验证名为
dev-instance
的实例的名称旁边是否有灰色方块,该方块表示实例已停止。完成关闭可能最多需要 30 秒。
启动实例
- 在 Google Cloud 控制台中,前往 Cloud Scheduler 页面。
转到 Cloud Scheduler 页面。 - 对于名为
startup-dev-instances
的作业,点击页面最右侧的立即运行按钮。 - 前往 Google Cloud 控制台中的虚拟机实例页面。
转到“虚拟机实例”页面。 - 验证名为
dev-instance
的实例的名称旁边是否有绿色对勾标记,该标记表示实例正在运行。完成启动可能最多需要 30 秒。
gcloud
停止实例
运行调度程序作业以停止实例。
gcloud beta scheduler jobs run shutdown-dev-instances
检查实例的状态是否为
TERMINATED
。完成关闭可能最多需要 30 秒。gcloud compute instances describe dev-instance \ --zone us-west1-b \ | grep status
status: TERMINATED
启动实例
运行调度程序作业以启动实例。
gcloud beta scheduler jobs run startup-dev-instances
检查实例的状态是否为
RUNNING
。完成启动可能最多需要 30 秒。gcloud compute instances describe dev-instance \ --zone us-west1-b \ | grep status
status: RUNNING
清除数据
完成本教程后,您可以清理您创建的资源,让它们停止使用配额,以免产生费用。以下部分介绍如何删除或关闭这些资源。
删除 Cloud Scheduler 作业
在 Google Cloud 控制台中,转到 Cloud Scheduler 页面。
点击作业旁边的复选框。
点击页面顶部的删除按钮并确认删除操作。
删除 Pub/Sub 主题
前往 Google Cloud 控制台中的 Pub/Sub 页面。
点击主题旁边的复选框。
在页面顶部,点击删除并确认删除操作。
删除通过 Cloud Run functions 部署的函数
前往 Google Cloud 控制台中的 Cloud Run functions 概览页面:
点击函数旁边的复选框。
点击页面顶部的删除按钮并确认删除操作。
删除 Compute Engine 实例
要删除 Compute Engine 实例,请运行以下命令:
- In the Google Cloud console, go to the VM instances page.
- Select the checkbox for the instance that you want to delete.
- To delete the instance, click More actions, click Delete, and then follow the instructions.
删除项目
为了避免产生费用,最简单的方法是删除您为本教程创建的项目。
如需删除项目,请执行以下操作:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
后续步骤
- 探索有关 Google Cloud 的参考架构、图表和最佳做法。查看我们的 Cloud 架构中心。