【问题标题】:Starting a Google Compute instance with Python使用 Python 启动 Google Compute 实例
【发布时间】:2017-12-25 16:58:58
【问题描述】:

我正在尝试使用 Google API Python 客户端库启动 Google Compute 实例。这样一来,便宜的实例(在单核上运行)可以定期启动和停止更昂贵的实例(具有许多核),以降低成本。

我已成功安装不同的组件并运行 Google 的示例脚本 create_instance.py(创建实例、运行启动脚本并删除实例)。检查 Compute Engine API 的 PyDoc 引用,并交叉引用 create_instance.py 示例中其他 instance() 函数的工作方式,我希望启动实例命令是:

python compute.instances().start(project=*, zone=*, instance=*).execute()

上面的命令给了我错误“在'('之后需要一个表达式。在 line:1 char:34” - 这是第一个括号。

一个。我做错了什么?

b.将 Google API 与 Python 结合使用是一种以编程方式从其他实例启动实例的好方法吗?

【问题讨论】:

    标签: python google-compute-engine google-api-python-client


    【解决方案1】:
    1. 通常我希望您需要使用 import 语句或运行时标志 (-m somemodule?) 导入 api 库。直接从命令行运行一行 python 通常不是最好的方法。相反,Google 提供了gcloud command line tool

    2. 通常在发送 API 实际命令之前调用身份验证/登录函数。在 Google VM 上,如果 VM 被特别授权调用 API 或充当特定帐户,则这可以是 id/私钥或空白 id/key。首次创建 Google VM 时,可以从计算引擎 Web 控制面板设置此授权。在外部 VM 上,它需要一个 ID/私钥来提供给 Google API。因此,python 中的单行可能无法工作,因为它缺少这一步。

    3. compute.instances().start() 函数采用 必需 参数来启动已停止的特定实例。这意味着:

      • 之前已创建虚拟机实例
      • VM 实例处于停止状态
      • 要重新启动的实例由特定项目 ID、(地理)区域和在对 start 的调用中提供的实例名称标识

    来自Google Cloud Python Documentation

    start(project=, zone=, instance=*) 停止使用 instances().stop 方法。更多 信息,请参阅重启实例。

    Args:项目:字符串,此请求的项目 ID。 (必填)
    zone:字符串,此请求的区域名称。 (必填)
    instance: string,要启动的实例资源的名称。 (必填)

    ...

    【讨论】:

    • 你是对的。 Gcloud 要容易得多。至于你的第二条评论,所有的VM都存在,它处于停止状态,我已经在启动命令中填写了*(我只是没有在这里公开它们)......
    • @fithace 我不记得要导入或调用什么来从 python 登录到 Google Compute API,但希望它与早期使用 nodejs 的体验类似。查看我对 #2 的编辑
    【解决方案2】:

    以下是启动计算引擎实例所需的代码

    from googleapiclient import discovery
    
    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 = 'zone_value'  
    
    # Name of the instance resource to start.
    instance = 'instance_name'
    
    request = service.instances().start(project=project, zone=zone, instance=instance)
    response = request.execute()
    
    print('VM Instance started')
    

    这是我用于从云函数启动我的 VM 实例的代码。

    这里需要注意的重要一点是,这只能在实例处于停止状态时启动实例,这完全符合我的要求。

    【讨论】:

    • 你能提供一个链接或参考你从哪里得到这个 API 代码?
    • 显示的代码是从 App Engine 调用的吗?这将如何在 Google Cloud Function 中发挥作用?
    • 我在云函数中使用此代码来启动计算引擎实例,而不是应用引擎。不幸的是,我没有 API 参考的链接,但我可以告诉你这对我有用
    【解决方案3】:

    我使用了@user570778 共享的代码,对我来说效果很好。

    `从 googleapiclient 导入发现

    service = discovery.build('compute', 'v1') print('VM 实例启动')

    此请求的项目 ID。

    project = 'project_name'

    此请求的区域名称。

    zone = 'zone_value'

    要启动的实例资源的名称。

    instance = 'instance_name'

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

    print('VM 实例已启动') ` 我想知道,是否可以在同一个函数中启动多个实例?

    【讨论】:

    • 请使用代码格式化来格式化代码,这样代码更容易阅读
    猜你喜欢
    • 2020-11-23
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 2021-11-01
    • 2014-11-22
    相关资源
    最近更新 更多