Google Cloud功能;使用Google Cloud Rest API

时间:2019-01-21 11:34:51

标签: google-cloud-platform google-cloud-functions

这种情况是,在我的云功能中,我需要从实例模板创建VM实例。我当时使用的是@google-cloud/compute软件包,但没有提供这样做的方法。

现在,我正在尝试使用REST API,但是我无法对其进行授权。我正在按照Use api keys页上的说明使用API​​密钥。

https://www.googleapis.com/compute/v1/projects/<ID>/zones/us-central1-a/instances?key=<API_KEY>&sourceInstanceTemplate=projects/<TEMPLATE_URL>

也有一个帖子正文,但这无关紧要,因为错误与授权有关。

我遇到了login required错误。

我确实有一个服务帐户,该帐户与同一个云功能上的云存储nodejs客户端一起使用,但是我找不到有关如何将同一个服务帐户与云功能上的REST API一起使用的文档。 / p>

1 个答案:

答案 0 :(得分:2)

根据documentation you linked,API密钥的使用仅限于有限数量的API:

  

有限数量的GCP服务仅允许使用API​​密钥进行访问:

     
      
  • Google Cloud Natural Language API
  •   
  • Google Cloud Speech API
  •   
  • Google Cloud Translation API
  •   
  • Google Cloud Vision API
  •   
  • Google Cloud端点
  •   
  • Google Cloud Billing Catalog API
  •   
  • 云数据丢失防护API
  •   

因此,无法使用API​​密钥对Compute Engine资源进行REST调用。

但是,您可以选择使用Google APIs Node.js Client

我做了一个小例子,它在Node.js 8中运行的Cloud Function中从实例模板创建Compute Engine实例(在Node.js 6中,您无法选择创建异步调用,我相信,您将从此调用中受益,因为您不必等待实例的创建就可以从CF中获得响应)

index.js

const {google} = require('googleapis');
const compute = google.compute('v1');

exports.helloWorld = async data => {
  const authClient = await google.auth.getClient({
    scopes: [
      'https://www.googleapis.com/auth/cloud-platform',
      'https://www.googleapis.com/auth/compute',
    ],
  });
  const projectId = await google.auth.getProjectId();
  const result = await compute.instances.insert({
    auth: authClient,
    project: projectId,
    zone: "us-east1-c",
    sourceInstanceTemplate: "projects/YOUR_PROJECT_NAME/global/instanceTemplates/YOUR_TEMPLATE_NAME-template",
    resource: {
        name: "example-vm-from-api-call",
    },
  });
  console.log('done');
};

package.json

{
  "name": "sample-http",
  "version": "0.0.1",
  "dependencies": {
    "google-auth-library": "3.0.0",
    "googleapis-common": "0.6.0",
    "googleapis": "36.0.0"
  }
}

我已经将实例名称硬编码为始终为example-vm-from-api-call,但是在向云函数发出请求时,您可以在参数中为实例传递名称,然后使用它来创建实例。 / p>

同样,请注意,验证是通过执行行const authClient = await google.auth.getClient(...)进行的。这将使用应用程序默认的经过身份验证的帐户,该帐户是执行“云功能”的服务帐户。

此服务帐户默认具有project/editor权限,足以创建CE VM,但是,如果您曾经使用另一个帐户来执行这些功能,则必须为其提供正确的访问范围(请参见函数的参数)。