通过 API 创建 GCP 项目不会启用服务使用 API

GCP project creation via API doesn't enable Service Usage API

我正在尝试使用 Node.js 的官方 Google SDK 自动执行整个项目创建过程。对于项目创建,我使用资源管理器 SDK:

const resource = new Resource();
const project = resource.project(projectName);
const [, operation,] = await project.create();

我还必须启用一些服务才能在此过程中使用它们。当我 运行:

const client = new ServiceUsageClient();
const [operation] = await client.batchEnableServices({
  parent: `projects/${projectId}`,
  serviceIds: [
    "apigateway.googleapis.com",
    "servicecontrol.googleapis.com",
    "servicemanagement.googleapis.com",
  ]
});

我收到:

Service Usage API has not been used in project 1014682171642 before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/serviceusage.googleapis.com/overview?project=1014682171642 then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.

我怀疑当我通过 API 创建项目时默认情况下未启用服务使用 API。显然,如果我必须手动启用某些功能,它会利用使用 APIs 的好处。当我通过 Could Console 创建项目时,默认启用服务使用 API,因此此问题仅影响 API。也许还有其他方法可以通过编程方式启用服务使用 API。

我将不胜感激任何形式的帮助。

作为 GCP 文档中的 described

When you create a Cloud project using the Cloud Console or Cloud SDK, the following APIs and services are enabled by default...

在您的例子中,您正在创建一个带有 Client Library 的项目。该文档需要改进,因为当它提到 Cloud SDK 时,它们实际上是指 CLI 工具,而不是客户端库。

澄清一下,当前使用客户端库或 REST 创建的项目默认情况下没有启用任何 API。

您不能调用 Service Usage 来启用项目的 Service Usage,因为进行调用需要已经在资源项目上启用 Service Usage。

我的建议是遵循以下流程:

  1. 某些进程使用应用程序项目 X(启用服务使用 API)创建新项目 Y。
  2. 同样的流程,使用应用项目X,批量启用项目Y上的API服务。

或者:

在某种 bash 脚本上自动执行项目创建过程,并使用 gcloud projects create 命令创建它们。

我写了一个完整的代码块,对我有用。如果代码质量受到影响,我提前表示歉意(我可能对它进行了屠杀)- 字面上不知道任何 nodejs - 我根据您的代码和互联网上的几个示例编译了它。

const {Resource} = require('@google-cloud/resource-manager');
const {ServiceUsageClient} = require('@google-cloud/service-usage');

const projectId = '<YOUR PROJECT ID>';
const orgId = '<YOUR ORG ID>'; // I had to use org for my project

const resource = new Resource();
async function create_project() {
    await resource
      .createProject(`${projectId}`, {
        name: `${projectId}`,
        parent: { type: "organization", id: `${orgId}` }
      })
      .then(data => {
        const operation = data[1];
        return operation.promise();
      })
      .then(data => {
        console.log("Project created successfully!");
        enable_apis();
      });
}

const client = new ServiceUsageClient();
async function enable_apis() {
  const [operation] = await client.batchEnableServices({
    parent: `projects/${projectId}`,
    serviceIds: [
      "serviceusage.googleapis.com",
      "servicecontrol.googleapis.com",
      "servicemanagement.googleapis.com",
    ]
  })
}

create_project();

这成功创建了项目并启用了三个 API。在尝试启用 api 之前,我会确保项目已完全创建(这只是一个理论)。

关于link,你刚才提到的,我这里是推测一下,但我认为他们所说的Cloud SDK是指gcloud CLI工具,它是Cloud SDK的一部分。