如何通过 Python API 使用启动脚本启动 GCP Compute Engine VM?

How to launch GCP Compute Engine VM with Startup Script via Python API?

GCP 已发布 create_instance() 可用代码段 here, which I've seen on SO in a couple places . However, as you can see in the first link, it's from 2015 ("Copyright 2015 Google Inc"), and Google has since published another code sample for launching a GCE instance dated 2022. It's available on github here, and this newer create_instance function is what's featured in GCP's python API documentation here

但是,我不知道如何在 VM 启动时使用现代 python 函数通过元数据将启动脚本传递给 运行。我尝试添加

    instance_client.metadata.items = {'key': 'startup-script',
                                      'value': job_script}

create.py 函数(同样,可用 here 以及它调用的支持实用程序函数)但是它抛出了一个错误,即 instance_client 没有那个属性。

GCP 使用启动脚本启动 GCE VM 的文档页面是 here,与大多数其他类似页面不同,它仅包含 consolegcloud 和 (休息)API;不是 SDK 代码片段,例如Python 和 Ruby 可能会显示如何修改上面的 python create_instance 函数。

从 python 进程启动带有启动脚本的 GCE VM 的最佳实践是真的发送 post 请求还是只是包装 gcloud 命令

gcloud compute instances create VM_NAME \
  --image-project=debian-cloud \
  --image-family=debian-10 \
  --metadata-from-file=startup-script=FILE_PATH

...在 subprocess.run() 中?老实说,我不介意那样做,因为代码非常紧凑(至少是 gcloud 命令,而不是 POST 请求方式),但是由于 GCP 提供了 create_instance python 功能我假设 using/modifying-as-necessary 这将是 python...

中的最佳实践

谢谢!

因此,使用 Python 库创建等同于 --metadata-from-file=startup-scripts=${FILE_PATH} 的最简单(!)方法可能是:

from google.cloud import compute_v1

instance = compute_v1.Instance()

metadata = compute_v1.Metadata()
metadata.items = [
    {
        "key":"startup-script",
        "value":'#!/usr/bin/env bash\necho "Hello Freddie"'
    }
]

instance.metadata = metadata

另一种方式是:

metadata = compute_v1.Metadata()

items = compute_v1.types.Items()
items.key = "startup-script"
items.value = """
#!/usr/bin/env bash

echo "Hello Freddie"
"""

metadata.items = [items]

NOTE In the examples, I'm embedding the content of the FILE_PATH in the script for convenience but you could, of course, use Python's open to achieve a more comparable result.

通常 总是 使用库|SDK 如果你有一个库来调用功能而不是使用 subprocess 来调用二进制文件。如评论中所述,主要原因是 language-specific 调用为您提供了输入(更多的是类型化语言)、受控执行(例如 try)和错误处理。当您调用 subprocess 时,它的 string-based 流一直向下。

我同意使用 类 的计算引擎的 Python 库感觉很麻烦,但是当您编写脚本时,重点可能是 long-term 更多的好处明确的定义与 short-term 表现力的痛苦。如果你只是想插入一个虚拟机,一定要使用 gcloud compute instances create(我这样做 all the time in Bash) 但是,如果你想使用像 Python 这样更优雅的语言,那么我鼓励你完全使用 Python。

CURIOSITY gcloud is written in Python. If you use Python subprocess to invoke gcloud commands, you're using Python to invoke a shell that runs Python to make a REST call ;-)