Как получить идентификатор проекта из GoogleCredentials? - PullRequest
1 голос
/ 03 мая 2019

Используя Python, я хотел бы получить список всех моих кластеров Dataproc в Google Cloud.

У меня есть учетные данные учетной записи службы, которые хранятся в ключевом файле JSON, местоположение которого указано в env var GOOGLE_APPLICATION_CREDENTIALS.Вот код, который у меня есть:

import os
import googleapiclient.discovery
from oauth2client.client import GoogleCredentials


def build_dataproc_service(credentials):
    return googleapiclient.discovery.build("dataproc", "v1", credentials=credentials)


def list_clusters():
    credentials = GoogleCredentials.get_application_default()
    dataproc = build_dataproc_service(credentials)
    clusters = dataproc.projects().regions().clusters().list(projectId="my-project", region="REGION").execute()
    return clusters


if __name__ == "__main__":
    list_clusters()

Как видите, я жестко закодировал идентификатор проекта ("my-project").Учитывая, что projectId существует в файле ключей JSON, я надеялся, что смогу получить его, просто запросив свойство объекта credentials, но такого свойства не существует.ProjectId существует , встроенный в строковое свойство credentials._service_account_email, но извлечение его оттуда неуклюже и кажется неправильным.

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

Обратите внимание, что изначально я намереваюсь запустить этот код в док-контейнере на экземпляре Google Compute Engine, однако однажды в будущем яВозможно, захотите запустить на GKE.Не уверен, влияет ли это на ответ или нет.

Ответы [ 2 ]

3 голосов
/ 03 мая 2019

Формальный способ думать об этом заключается в том, что, хотя projectId иногда является свойством учетной записи службы , projectId обычно не является свойством долговременного удостоверения .Например, подумайте о своих установленных в автономном режиме личных учетных данных, которые вы используете с gcloud CLI, если таковые имеются, связанные с вашей учетной записью Google / адресом электронной почты.Эта электронная почта не находится в любом облачном проекте, и все же может использоваться для получения объекта GoogleCredential.

Технически, если вы хотите сделать это "правильно", вам понадобитсяглавная учетная запись службы, которая имеет разрешения на GET описания учетной записи службы во всех проектах, в которых содержатся действительные учетные записи службы, которые вы планируете использовать, а затем вызовите projects.serviceAccounts.get API IAM для учетной записи службыадрес электронной почты, а не на «учетных» объект.Ответы там могут идентифицировать идентификатор проекта, в котором находится учетная запись службы.Это эквивалентно команде gcloud:

gcloud iam service-accounts describe my-service-account@projectid.iam.gserviceaccount.com

Однако, как говорит Даганг, в долгосрочной перспективе часто происходит обратный удар, чтобы начать работу в предположении, что учетная запись службы будет использоваться только для операций напроекты, в которых он проживает.В частности, хотя сами ресурсы service account живут внутри проектов, они часто используются в межпроектном режиме.Один общий шаблон работы - это использование одного проекта GCP для управления большим количеством учетных записей служб, которым затем предоставляется различный детальный доступ к ресурсам в других проектах GCP.

3 голосов
/ 03 мая 2019

Я не думаю, что код клиента должен извлекать идентификатор проекта из GoogleCredentials.См. Этот фрагмент кода из API doc .

from googleapiclient.discovery import build
from oauth2client.client import GoogleCredentials

credentials = GoogleCredentials.get_application_default()
service = build('compute', 'v1', credentials=credentials)

PROJECT = 'bamboo-machine-422'
ZONE = 'us-central1-a'
request = service.instances().list(project=PROJECT, zone=ZONE)
response = request.execute()

print(response)

Возможно, вы сможете вывести идентификатор проекта из credentials._service_account_email, но это ненадежно.Кроме того, учетная запись службы в проекте A не связана с проектом, она также может иметь разрешения для других проектов.

...