繁体   English   中英

通过API调用从Cloud Function上的实例模板创建VM

[英]Creating VMs from Instance Template on Cloud Function via API call

我写的代码似乎是我所需要的,但是它无法正常工作,并且我收到401错误(身份验证),我已经尝试了所有方法:1.服务帐户权限2.创建秘密ID和密钥(不确定如何(虽然可以使用它们来获取访问令牌)。3.基本上,过去2天都尝试了所有方法。

import requests
from google.oauth2 import service_account


METADATA_URL = 'http://metadata.google.internal/computeMetadata/v1/'
METADATA_HEADERS = {'Metadata-Flavor': 'Google'}
SERVICE_ACCOUNT = [NAME-OF-SERVICE-ACCOUNT-USED-WITH-CLOUD-FUNCTION-WHICH-HAS-COMPUTE-ADMIN-PRIVILEGES]


def get_access_token():
    url = '{}instance/service-accounts/{}/token'.format(
        METADATA_URL, SERVICE_ACCOUNT)

    # Request an access token from the metadata server.
    r = requests.get(url, headers=METADATA_HEADERS)
    r.raise_for_status()

    # Extract the access token from the response.
    access_token = r.json()['access_token']

    return access_token

def start_vms(request):
    request_json = request.get_json(silent=True)
    request_args = request.args

    if request_json and 'number_of_instances_to_create' in request_json:
            number_of_instances_to_create = request_json['number_of_instances_to_create']
    elif request_args and 'number_of_instances_to_create' in request_args:
        number_of_instances_to_create = request_args['number_of_instances_to_create']
    else:
        number_of_instances_to_create = 0
    access_token = get_access_token()
    address = "https://www.googleapis.com/compute/v1/projects/[MY-PROJECT]/zones/europe-west2-b/instances?sourceInstanceTemplate=https://www.googleapis.com/compute/v1/projects/[MY-PROJECT]/global/instanceTemplates/[MY-INSTANCE-TEMPLATE]"
    headers = {'token': '{}'.format(access_token)}
    for i in range(1,number_of_instances_to_create):
        data = {'name': 'my-instance-{}'.format(i)}
        r = requests.post(address, data=data, headers=headers)
        r.raise_for_status()
        print("my-instance-{} created".format(i))

有什么建议/指导吗? 如果有人可以告诉我如何使用秘密ID和密钥获取访问令牌。 另外,我不太确定OAuth2.0是否能正常工作,因为我本质上是想打开这些机器,然后它们进行一些处理然后自毁。 因此,无需用户参与即可访问。 如果OAuth2.0是错误的解决方法,我还能使用什么?

我尝试使用gcloud,但不建议使用子处理gcloud命令。

尽管使用了Node 10 Firebase Functions运行时,但我还是做了类似的事情,但是应该非常相似。

我同意OAuth不是正确的解决方案,因为没有用户参与。

您需要使用的是“应用程序默认凭据”,它基于云功能的默认服务帐户的可用权限,该帐户将在此处标记为“ App Engine默认服务帐户”:
https://console.cloud.google.com/iam-admin/serviceaccounts?folder=&organizationId=&project=[YOUR_PROJECT_ID]

(对于我的项目,该服务帐户已经具有启动和停止GCE实例所需的权限,但是对于其他API,我已经为其手动授予了权限。)

ADC用于服务器到服务器的API调用。 为了使用它,我只用范围调用了google.auth.getClient(Google API身份验证库的)。 https://www.googleapis.com/auth/cloud-platform ”。

该API具有多种用途,可以返回所需的任何凭据,因此,当我在云函数上运行时,它会返回一个“计算”对象,而当我在模拟器中运行时,它会为我提供“ UserRefreshClient”对象。

然后,将我的auth对象包含在我对compute.instances.insert()和compute.instances.stop()的调用中。

这是我用来测试代码的模板...

{
  name: 'base',
  description: 'Temporary instance used for testing.',
  tags: { items: [ 'test' ] },
  machineType: `zones/${zone}/machineTypes/n1-standard-1`,
  disks: [
    {
      autoDelete: true, // you will want this!
      boot: true,
      type: 'PERSISTENT',
      initializeParams: {
        diskSizeGb: '10',
        sourceImage: "projects/ubuntu-os-cloud/global/images/ubuntu-minimal-1804-bionic-v20190628",
      }
    }
  ],
  networkInterfaces: [
    {
    network: `https://www.googleapis.com/compute/v1/projects/${projectId}/global/networks/default`,
    accessConfigs: [
        {
        name: 'External NAT',
        type: 'ONE_TO_ONE_NAT'
        }
      ]
    }
  ],
}

希望能有所帮助。

如果您收到401错误,则表示您使用的访问令牌已过期或无效。

本指南将向您展示如何请求OAuth 2.0访问令牌以及如何使用服务帐户进行API调用: https : //developers.google.com/identity/protocols/OAuth2ServiceAccount

提到的.json文件是您在IAM&Admin中在服务帐户下创建的私钥。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM