使用其ID获取Google Cloud Project编号

时间:2018-09-13 05:58:33

标签: java google-cloud-platform

我有Google Cloud Service帐户和projectId,并希望通过编程方式从Java获取projectNumber。

enter image description here

我如何得到它?

基本上我有服务帐户,并且想使用它为Google Cloud Storage Bucket中的帐户“ project-XXXXXXX@storage-transfer-service.iam.gserviceaccount.com”授予角色“ roles / storage.legacyBucketWriter”。

6 个答案:

答案 0 :(得分:3)

不确定他们为什么不直接公开它,但是您可以这样做(假设您当前的配置项目与所需的项目编号相对应):

PROJECT=$(gcloud config get-value project)
gcloud projects list --filter="$PROJECT" --format="value(PROJECT_NUMBER)"

答案 1 :(得分:2)

现在有一个API。

cloudresourcemanager Java库的jar版本直接支持它,如此处的示例https://cloud.google.com/resource-manager/reference/rest/v1/projects/get

有了maven依赖关系,您就可以做到

pom.xml

<!-- https://mvnrepository.com/artifact/com.google.apis/google-api-services-cloudresourcemanager -->
<dependency>
    <groupId>com.google.apis</groupId>
    <artifactId>google-api-services-cloudresourcemanager</artifactId>
    <version>v2-rev20200617-1.30.9</version>
</dependency>

<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.7</version>
</dependency>

CloudResourceManagerExample.java(由Google的示例改编)

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.cloudresourcemanager.CloudResourceManager;
import com.google.api.services.cloudresourcemanager.model.Project;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Arrays;

import org.apache.commons.io.IOUtils
import com.google.api.client.http.GenericUrl;
import java.nio.charset.StandardCharsets;

public class CloudResourceManagerExample {
  public static void main(String args[]) throws IOException, GeneralSecurityException {
    // The Project ID (for example, `my-project-123`).
    // Required.
    String projectId = "my-project-id"; // TODO: Update placeholder value.

    CloudResourceManager cloudResourceManagerService = createCloudResourceManagerService();

    String response = IOUtils.toString(cloudResourceManagerService.getRequestFactory().buildGetRequest(new GenericUrl("https://cloudresourcemanager.googleapis.com/v1/projects/" + projectId)).execute().getContent(), StandardCharsets.UTF_8);

    // TODO: Change code below to process the `response` object:
    System.out.println(response);
  }

  public static CloudResourceManager createCloudResourceManagerService()
      throws IOException, GeneralSecurityException {
    HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
    JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();

    GoogleCredential credential = GoogleCredential.getApplicationDefault();
    if (credential.createScopedRequired()) {
      credential =
          credential.createScoped(Arrays.asList("https://www.googleapis.com/auth/cloud-platform"));
    }

    return new CloudResourceManager.Builder(httpTransport, jsonFactory, credential)
        .setApplicationName("Google-CloudResourceManagerSample/0.1")
        .build();
  }
}

response类似于{"projectNumber": "123456", ...}

答案 2 :(得分:1)

我认为GCP没有提供将项目ID映射到项目编号的API。但是,在您获得项目列表之后,他们确实提供了project list API。您可以自己映射项目编号。

答案 3 :(得分:1)

尽管这个问题是针对Java的,但对于那些可能会发现有用的人来说,这也是一个程序,该程序也可以从Go中的ID中获取Google Project号:

package main

import (
    "context"
    "flag"
    "fmt"
    "log"

    "google.golang.org/api/cloudresourcemanager/v1"
)

var projectID string

func main() {
    flag.StringVar(&projectID, "projectID", "", "Google Cloud Project ID")
    flag.Parse()

    cloudresourcemanagerService, err := cloudresourcemanager.NewService(context.Background())
    if err != nil {
        log.Fatalf("NewService: %v", err)
    }

    project, err := cloudresourcemanagerService.Projects.Get(projectID).Do()
    if err != nil {
        log.Fatalf("Get project: %v", err)
    }

    fmt.Printf("Project number for project %s: %d\n", projectID, project.ProjectNumber)
}

您可以这样运行它:

> go run main.go --projectID="my-project"
Project number for project my-project: 123456789817

(请注意,此示例使用Google应用程序默认凭据(cf. https://godoc.org/google.golang.org/api/cloudresourcemanager/v1#hdr-Creating_a_client))。

答案 4 :(得分:0)

您可以只使用gcloud projects describe <<project_id>>documentation

$ gcloud projects describe XXX
createTime: ...
lifecycleState: ...
name: ...
parent:
  id: ...
  type: ...
projectId: XXX
projectNumber: 'YYY'

答案 5 :(得分:0)

我的答案在 Java 中没有做任何事情,但应该在许多环境中工作,即 bashzsh,使用大多数在开发过程中或在容器化环境中访问的工具。

假设您正在使用某种类型的构建过程,您可以轻松地:

  1. 将以下命令放入 docker 容器中,
  2. 在构建步骤中输出结果(项目编号),以及
  3. 将其存储在环境变量中以用于其他步骤。

使用 gcloudgrepawk

<块引用>

这假设您在 PROJECT_NAME 环境变量中设置了字符串项目名称。

这是一个使用 Google Cloud SDK 和常用 CLI 工具 grepawk 的超级简单解决方案:

gcloud projects list | grep '${PROJECT_NAME} ' | awk '{print $3}'
<块引用>

注意:我怀疑有很多项目的非常大的帐户可能不想在每次需要单个项目编号时查询整个列表。对于这些情况,@erkolson's answer 可能是最好的解决方案。