python - 如何通过Python API使用启动脚本启动GCP计算引擎VM?

标签 python google-cloud-platform virtual-machine google-compute-engine infrastructure-as-code

GCP 已发布可用的 create_instance() 代码段 here ,我在几个地方看到过e.g. here 。然而,正如您在第一个链接中看到的那样,它是 2015 年的(“版权所有 2015 Google Inc”),并且 Google 此后发布了另一个用于启动 2022 年 GCE 实例的代码示例。它可以在 github here 上找到。 ,这个较新的 create_instance 函数是 GCP 的 python API 文档 here 中的特色功能。 .

但是,我无法弄清楚如何使用现代 python 函数通过元数据传递启动脚本以在虚拟机启动时运行。我尝试添加

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

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

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

从 python 进程中使用启动脚本启动 GCE 虚拟机的最佳实践是发送发布请求还是仅包装 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 函数,我假设根据需要使用/修改这将是 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 来调用功能,那么通常总是更好,而不是使用子进程来调用二进制文件。正如评论中提到的,主要原因是特定于语言的调用可以让您键入(更多地使用类型化语言)、受控执行(例如 try)和错误处理。当您调用子进程时,其基于字符串的流会一直向下。

我同意使用类的计算引擎 Python 库感觉很麻烦,但是,当您编写脚本时,重点可能是更明确定义的长期好处,而不是表达能力的短期痛苦。如果您只想插入虚拟机,请务必使用gcloudcomputeinstancecreate(我全部时间 在 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 ;-)

关于python - 如何通过Python API使用启动脚本启动GCP计算引擎VM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72483491/

相关文章:

macos - Vagrant 1.7 OSX 上的 SSH 身份验证失败 – 私钥未复制到虚拟机

python - 当相关列不存在时 SQLAlchemy 忽略过滤器

Python:根据另一个列值从DataFrame中删除重复项

java - 是否可以从 Google 搜索中隐藏 Google App Engine 应用程序?

python - 使用 Python 的 Firebase 云功能?

grails - 在加载虚拟机时访问grails应用

c# - 在锁定的 Windows 10 机器上的后台进程中将文本放入剪贴板

python - 如何将字符串更改为 QuickFix 消息?

hadoop - 如何将 hdfs 文件读入 apache beam?

java - vagrant 对 java/javaee 开发人员有用吗?