不确定为什么他们不直接公开,但您可以这样做(假设您当前的配置项目对应所需的项目编号):
gcloud projects list \
--filter="$(gcloud config get-value project)" \
--format="value(PROJECT_NUMBER)"
gcloud projects describe $PROJECT_ID --format="value(projectNumber)"
gcloud projects add-iam-policy-binding $PROJECT_ID --member=serviceAccount:$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@@storage-transfer-service.iam.gserviceaccount.com --role=roles/storage.legacyBucketWriter
我认为GCP没有提供将项目ID映射到项目编号的API。但是,他们提供了项目列表API,在获取项目列表后,你可以自己映射项目编号。
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应用程序默认凭据(参见https://godoc.org/google.golang.org/api/cloudresourcemanager/v1#hdr-Creating_a_client)。
<!-- 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", ...}
在 Python 中,你可以这样做:
# python3 -m pip install google.auth google-api-python-client
# from https://github.com/GoogleCloudPlatform/python-docs-samples/blob/main/iam/api-client/quickstart.py
import google.auth
import googleapiclient.discovery
def initialize_service():
"""Initializes a Cloud Resource Manager service."""
credentials, _ = google.auth.default(
scopes=["https://www.googleapis.com/auth/cloud-platform"]
)
crm_service = googleapiclient.discovery.build(
"cloudresourcemanager", "v1", credentials=credentials
)
return crm_service
crm_service = initialize_service()
project = r.get(projectId=MY_PROJECT_ID).execute()
project['name']
。 - Gavin Haynes您可以直接使用 gcloud projects describe <<project_id>>
命令(文档)
$ gcloud projects describe XXX
createTime: ...
lifecycleState: ...
name: ...
parent:
id: ...
type: ...
projectId: XXX
projectNumber: 'YYY'
有一系列的API可以提供它,从命令行可以这样:
gcloud projects list --filter="$(gcloud config get-value project)" --format="value(PROJECT_NUMBER)"
可以获取项目ID:
gcloud projects list --filter="$(gcloud config get-value project)" --format="value(PROJECT_ID)"
我的答案在Java中没有任何作用,但应该适用于许多环境,例如使用大多数人在开发过程中或容器化环境中可以访问的工具,如bash
或zsh
。
假设您正在使用某种构建过程,您可以轻松地执行以下操作:
gcloud
、grep
和awk
这假定您已经在
PROJECT_NAME
环境变量中设置了字符串项目名称。
这是一个超级简单的解决方案,使用Google Cloud SDK和常用的CLI工具grep
和awk
:
gcloud projects list | grep '${PROJECT_NAME} ' | awk '{print $3}'
pip install google-cloud-resource-manager
from google.cloud import resourcemanager_v3
def get_project_number(project_id):
client = resourcemanager_v3.ProjectsClient()
project = client.get_project(name=f"projects/{project_id}").name
return project.split('/')[-1]
project_id = 'myprojectid'
project_number = get_project_number(project_id)
print(f"The project number for project {project_id} is: {project_number}")
gcloud projects describe $PROJECT_ID --format="value(projectNumber)"
。请参考文档:https://cloud.google.com/sdk/gcloud/reference/projects/describe - Cheeso