【问题标题】:instances.setMetadata() - nothing changesinstance.setMetadata() - 没有任何变化
【发布时间】:2020-03-16 14:31:03
【问题描述】:

我正在尝试为现有机器添加启动脚本,当我从 Google 的测试器(“尝试此 API”)执行此操作时,它可以工作,客户端似乎没有任何变化...... 这是代码(只是请求的一个例子)+我得到的响应(看起来不错)和发送请求后机器的数据。

我的要求:

from googleapiclient import discovery
from oauth2client.client import GoogleCredentials
from pprint import pprint
jsonPath = "myJSON.json"

credentials = GoogleCredentials.from_stream(jsonPath)
# Define gcp service
service = discovery.build('compute', 'v1', credentials=credentials)

#Request Body
bodyData = {"fingerprint": "***","items": [{"key": "startup-script","value": "#! /bin/bash\n\nservice start sshguard"}]}
#setMeta Data Request
instance = service.instances().setMetadata(project="<PROJECT>", zone="europe-west1-b", instance="<ID>", body=bodyData)
#Execute request
response = instance.execute()
# Get instacne details
instanceget = service.instances().get(project="<PROJECT>", zone="europe-west1-b", instance="<ID>").execute()

#Print response + New Metadata
pprint(response)
print("'New Metadata:", instanceget['metadata'])

我得到的回应

{'id': '6099825023953066427',
 'insertTime': '2020-03-16T04:47:32.880-07:00',
 'kind': 'compute#operation',
 'name': 'operation-84359252330-5a0f7626e861e-cf743913-4f05cd',
 'operationType': 'setMetadata',
 'progress': 0,
 'selfLink': 'https://www.googleapis.com/compute/v1/projects/<Project>/zones/europe-west1-b/operations/operation-1584359252330-5a0f7626e861e-cf743913-4f05cd31',
 'startTime': '2020-03-16T04:47:32.899-07:00',
 'status': 'RUNNING',
 'targetId': '<ID>',
 'targetLink': 'https://www.googleapis.com/compute/v1/projects/<Project>/zones/europe-west1-b/instances/<ID>',
 'user': 'pubsub-aws@<Project>.iam.gserviceaccount.com',
 'zone': 'https://www.googleapis.com/compute/v1/projects/<Project>/zones/europe-west1-b'}
'New Metadata:  {'fingerprint': '***', 'kind': 'compute#metadata'}

如您所见,启动脚本从未添加到元数据中...我认为它可能是 json 格式的东西?也许请求正文需要编码或什么? 将不胜感激任何帮助! 提前致谢。

【问题讨论】:

    标签: python python-3.x google-cloud-platform google-api google-api-python-client


    【解决方案1】:

    选项 1

    setMetadata 调用可能失败。查看 Cloud 控制台日志以了解操作的结果。

    选项 2

    setMetadata 不会立即应用更改,它可能需要很短的时间。因为您的代码会立即获取实例,所以 setMetadata 更改可能会在您获取之后应用。

    如果您的脚本需要检查更改是否已应用,它应该获取操作对象,直到它不再是RUNNING

    【讨论】:

    • 谢谢大卫。我查看了控制台,发现所有请求的错误代码都是 412 ......(我想我过去得到了所有状态代码,但这是我第一次得到 412)。你能解释一下我做错了什么吗?或此错误代码的可选原因?再次感谢。
    • 如果指纹设置不正确,docs 说 setMetadata 返回 412。与其自己编写元数据正文,不如阅读 service.instances().get(...) 的元数据字段,修改它以添加您的 k/v,然后使用它调用 setMetadata。此读取-修改-写入流程将正确获取指纹,并保留实例上的任何其他元数据。
    • 谢谢大卫。这是一个权限问题。 :)
    【解决方案2】:

    解决了。给它“所有者”权限,它就起作用了。 意味着我有错误的权限。 谢谢大家!

    【讨论】:

      猜你喜欢
      • 2016-09-09
      • 2020-08-03
      • 2012-09-23
      • 2015-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-11
      • 2021-08-13
      相关资源
      最近更新 更多