成功执行代码后如何在 GCP 中关闭虚拟机?

How to shutdown a Virtual Machine in GCP after successful execution of code?

我有关注

我需要什么

我已经尝试过的:

在机器上使用 Crontab。

  1. 用过@reboot run_my_script && shutdown -h now
  2. 一旦实现,我就无法再访问 VM,因为每次启动时,VM 运行s 脚本并自行关闭。

此方法无效 例如,如果我的代码 运行 出错或我的系统需要新的依赖项怎么办

正在同步云调度程序和 Crontab

  1. 用过5 * * * * run_my_script && shutdown -h now
  2. Cloud scheduler 设置为在 hour:00:00
  3. 的每个整点启动我的虚拟机
  4. Crontab 在 hour:05:00 处启动 运行 代码并在完成后关闭(启动 vm 需要 5 分钟)

这个方法运行没问题但我需要一个更稳健的解决方案(业界接受的方式)

代码片段

虚拟机

姓名

test_vm

定时任务

5 * * * * sh /home/danish_bansal/workflow.sh

workflow.sh:

#!/bin/sh
sudo rm -r repoName/ || true
sudo git clone https://<token>@github.com/Repo/repoName.git
cd repoName
/usr/bin/python3 Script.py
sudo shutdown -h now

云调度程序

At 0 * * * * calls cloud function

云函数

from googleapiclient import discovery

def startInstance(r):
    service = discovery.build('compute', 'v1')
    print('VM Instance starting')

    # Project ID for this request.
    project = 'project-name' 

    # The name of the zone for this request.
    zone = 'us-central1-a'  

    # Name of the instance resource to start.
    instance = 'test-vm'

    request = service.instances().start(project=project, zone=zone, instance=instance)
    response = request.execute()

    print(response,'VM Instance started')

您可以使用 Compute Engine Client Library 来调用 instance_client.stop()

这比使用旧的 Google API 客户端库要好得多, 因为这由 Google 开发人员不断更新。

这是一个示例代码:

import sys
import typing

import google.cloud.compute_v1 as compute_v1

def stop_instance(project_id, zone, machine_name):
    instance_client = compute_v1.InstancesClient()
    operation_client = compute_v1.ZoneOperationsClient()

    print(f"Stopping {machine_name} from {zone}...")
    operation = instance_client.stop(
        project=project_id, zone=zone, instance=machine_name
    )
    while operation.status != compute_v1.Operation.Status.DONE:
        operation = operation_client.wait(
            operation=operation.name, zone=zone, project=project_id
        )
    if operation.error:
        print("Error during stop:", operation.error, file=sys.stderr)
    if operation.warnings:
        print("Warning during stop:", operation.warnings, file=sys.stderr)
    print(f"Instance {machine_name} stopped.")
    return

stop_instance('project-ID', 'zone', 'machine-name')'

这里也是来自Github的官方例子。

https://github.com/googleapis/python-compute/blob/main/samples/snippets/sample_start_stop.py

我尝试使用不同的方法来获得与您要求的相似的结果,使用 Cloud Build Trigger 将直接从 Github 存储库Cloud Scheduler 到 运行 它以我喜欢的频率。

我按照官方文档开始创建触发器“Building repositories from GitHub”:

如文档中所述,在创建触发器之前,您必须:

一旦您具备了先决条件,我们就可以开始第一步了,将 Cloud Build 从您的 GCP 项目 连接到您的 Github 存储库.

您可以转到 Trigger section from your Cloud Build and clicking on “connect repository”, it will open a window where you’ll have to choose between your repositories and connect them. The official documentation 并说明如何签署和授权 Google Cloud Build App 连接到 Google 没做过的云

创建GitHub触发器这次在Trigger section, instead of choosing “connect repository” you have to select “create trigger”, in this part you will be able to create and set the trigger中可以运行代码来自您的 Github 存储库。以下步骤对我有用:

  1. 添加名称、描述和标签(如您所愿)。

  2. 在事件部分我 selected “手动调用”.

  3. “来源” 我 select 从下拉列表和 ”Revision” 第一部分 selected “Branch”(对我来说,一旦我 selected 存储库,它就会自动设置)。

  4. 对于“配置”对于“类型”我使用了“云构建配置文件(yaml 或 json)” 并且对于 “位置” 我使用了 “内联” 选项,其中在显示为 editor 的按钮中,我添加了下一个代码:

            Steps:
            - id: "run"
              name: python:3-alpine
              entrypoint: python3
              args:
               - hello.py

使用此代码,我设置的是 运行 我的代码 (Python) 所需的语言以及我想要 [=164] 的代码所在的文件名=],在这种情况下,hello.py.

  1. 然后我点击“创建”

创建后,要测试它,您可以再次转到 Trigger 部分,在列表中您将能够找到触发器您刚刚创建,您可以单击 “运行” 按钮并检查它是否有效,您可以转到 Cloud Build History.

在本节中,您将找到一个包含所有创建的构建的列表,选择与我们的触发器相关的一个并打开它,您将能够看到存储库中存在的代码中命名的代码,在我的例子中 hello.py,是成功的 运行。

为什么使用 Cloud Build

之所以能够直接从 Github 存储库获取代码,部分原因在于 Cloud Build 的工作方式,它允许您不要担心必须停止代码,因为一旦代码执行,它就会自行停止。

现在我们演示了我们可以 运行 我们的代码直接从 Github 存储库 创建一个 Cloud Build 触发器,我们可以继续将其设置为能够 运行 它每小时。

为此我们可以使用计划触发器,您将能够在同一个Trigger 部分,select打开您刚刚创建的触发器并转到 “运行”[= 旁边的三点菜单103=] 按钮,在那里你会找到 “运行 按计划” 一旦你 select 它,它会打开一个 window 在那里你'必须启用 “Cloud Scheduler API”、select 一个 “服务帐户” 并输入 您将需要的“频率”

通过所有这些设置,我能够每小时将我的代码从我的存储库获取到 运行。