【问题标题】:Google Cloud Function; Use Google Cloud Rest APIs谷歌云功能;使用 Google Cloud Rest API
【发布时间】:2019-06-14 19:02:05
【问题描述】:

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

现在,我正在尝试使用 REST API,但无法对其进行授权。我正在使用 API 密钥,如本页 Use api keys 上所述。

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 一起使用的文档。

【问题讨论】:

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


    【解决方案1】:

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

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

    • 谷歌云自然语言 API
    • 谷歌云语音 API
    • 谷歌云翻译 API
    • 谷歌云视觉 API
    • 谷歌云端点
    • 谷歌云计费目录 API
    • 云数据丢失防护 API

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

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

    我做了一个小例子,它从实例模板创建 Compute Engine 实例,在 Node.js 8 中运行的云函数中(在 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,但在向云函数发出请求时,您可以在参数中传递实例名称,并使用它来创建实例。

    另外,请注意,通过执行const authClient = await google.auth.getClient(...) 行来进行身份验证。这将采用应用程序默认经过身份验证的帐户,即执行 Cloud Function 的服务帐户。

    此服务帐户默认具有project/editor 权限,足以创建 CE 虚拟机,但是如果您使用其他帐户执行这些功能,则必须为其提供正确的访问范围(参见参数前面提到的函数)。

    【讨论】:

    • 嘿,谢谢你的帖子。文档说列出的 API 只允许使用 API 密钥进行身份验证,英语不是我的母语,所以我可能会误解,这并不意味着这些 API 不允许其他身份验证模式,例如 OAuth、服务帐户?是的,我已经开始研究 googleapis,虽然它很大,但目前我没有看到任何其他选择。
    • 不,列出的 API 也可以使用 Oauth 或服务帐户,此外它们是唯一也支持使用 API 密钥的 API。我相信最好的选择是使用客户端库来执行此 API 调用。也可以直接对www.googleapis.com/...进行CURL调用,手动添加request body,但它可能不适用于某些API,我还没有尝试过。
    • Google API 支持 3 种不同的授权方案:API 密钥、用户帐户身份验证(OAuth2 客户端 ID)和服务帐户身份验证 (JWT/OAuth2)。大多数时候,它是后一对中的一个。 GCP API 通常是服务器到服务器的,即服务帐户,但正如这里所说,一些不多的(公共数据访问)仍然允许 API 密钥。 OTOH,那些访问用户数据的人,即驱动器文件,可以通过用户或 svc acct auth 访问(但不能访问 API 密钥)。 API 密钥很容易丢失/受损,这就是为什么大多数 Google API 都让您使用 OAuth 方案。视频和博客文章在某个时候。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    • 2017-11-14
    • 2017-08-20
    • 2019-06-07
    • 1970-01-01
    • 2019-05-14
    • 2020-09-03
    相关资源
    最近更新 更多