Как получить название проекта / идентификатор из корзины облачного хранилища Google?

#google-cloud-platform

#google-облачная платформа

Вопрос:

Мне предоставляется адрес корзины облачного хранилища Google ( gs://some_bucket_name ), к которому мне уже предоставлен доступ на чтение. Корзина принадлежит другому проекту. Есть ли какой-либо способ узнать, к какому имени проекта или идентификатору относится корзина?

Комментарии:

1. какой тип доступа у вас есть (учетная запись службы, IAM, общедоступное чтение)?

Ответ №1:

Вы можете получить номер проекта в корзине, используя Storage JSON API. Более конкретно, вы можете запросить GET https://storage.googleapis.com/storage/v1/b/<BUCKET_NAME> . Для получения более подробной информации и проверки этого запроса ознакомьтесь с этим документом: https://cloud.google.com/storage/docs/json_api/v1/buckets/get

Как только вы получите номер проекта, вы можете получить project_id и / или имя, используя либо gcloud , либо API-интерфейс resource manager

Вот полный пример получения project_id и имени корзины:

 authorization flow
# the user <ACCOUNT> must have these permission 
# storage.buckets.get
# resourcemanager.projects.get on the bucket project 
gcloud auth login <ACCOUNT>

BUCKET_NAME=<BUCKET_NAME>

ACCESS_TOKEN=$(gcloud auth print-access-token)

PROJECT_NUMBER=$(curl -s -H "Authorization: Bearer ${ACCESS_TOKEN}" https://storage.googleapis.com/storage/v1/b/${BUCKET_NAME} | jq -r .projectNumber)

gcloud projects list --filter="PROJECT_NUMBER=${PROJECT_NUMBER}" --format="value(PROJECT_ID, NAME)"

  

Комментарии:

1. Этот ответ работает только для устаревшего API, а не для групп с единообразным доступом к объектам, который сейчас используется по умолчанию.

Ответ №2:

Хороший вопрос.

Корзины не имеют очевидной области видимости для проектов, и их глобально уникальные имена не представлены как часть иерархии, которая включает идентификаторы проектов.

Однако… acl могут быть хорошим выбором… Я не уверен, что это окончательно, пожалуйста, проверьте:

 gsutil acl get gs://[[BUCKET-NAME]]
  

Что приводит к projectNumber :

 [
  {
    "entity": "project-owners-123456789012",
    "projectTeam": {
      "projectNumber": "123456789012",
      "team": "owners"
    },
    "role": "OWNER"
  },
  {
    "entity": "project-editors-123456789012",
    "projectTeam": {
      "projectNumber": "123456789012",
      "team": "editors"
    },
    "role": "OWNER"
  },
  {
    "entity": "project-viewers-123456789012",
    "projectTeam": {
      "projectNumber": "123456789012",
      "team": "viewers"
    },
    "role": "READER"
  }
]
  

Комментарии:

1. gsutil ls -L -b gs://[[BUCKET-NAME]] и вы также можете использовать APIs Explorer: developers.google.com/apis-explorer/#search/storage.buckets.get / … `

2. Это хороший ответ при условии, что был предоставлен примитив READER . Однако роли IAM role/viewer , roles/storage.legacyObjectReader и roles/storage.objectViewer не предоставляют доступ к спискам управления доступом. Ответ зависит от точных разрешений, которые предоставлены пользователю.

3. Этот ответ работает только для устаревшего API, а не для групп с единообразным доступом к объектам, который сейчас используется по умолчанию.

Ответ №3:

Я сделал это сегодня с помощью комбинации двух команд, выполняемых из gcloud в вашем терминале или из облачной оболочки

  1. gcloud storage buckets describe gs://<your-bucket> | grep projectNumber — это возвращает номер проекта
  2. gcloud projects describe <projectNumber> — это возвращает информацию о проекте, которая включает в себя как название проекта, так и идентификатор.

Ответ №4:

поиск активов gcloud по всем ресурсам работает лучше всего для меня.

Важно определить область поиска, в противном случае выполняется поиск только по активному проекту.

gcloud asset search-all-resources --scope folders/<number> --asset-types=storage.googleapis.com/bucket --filter='name:some_bucket_name'