Пользователь, не авторизованный для использования в качестве учетной записи службы при использовании идентификатора рабочей нагрузки

#google-kubernetes-engine #google-cloud-dataproc

#google-kubernetes-engine #google-cloud-dataproc

Вопрос:

Мы запускаем продукт с открытым исходным кодом под названием Airflow (https://airflow.apache.org /) на GKE. В этом модуле запущены процессы, которым необходимо взаимодействовать со службой обработки данных GCP для создания кластеров обработки данных. Мы используем идентификатор рабочей нагрузки для запуска наших приложений GKE.

Учетная запись службы Kubernetes (KSA) была предоставлена roles/iam.workloadIdentityUser на ресурсе учетной записи службы Google (GSA) static11-dp-airf@mygcpproject.iam.gserviceaccount.com :

 $ gcloud iam service-accounts get-iam-policy 
> static11-dp-airf@mygcpproject.iam.gserviceaccount.com 
> --format=json 
> --format="table(bindings.role, bindings.members)" 
> --flatten="bindings[].members"
ROLE                            MEMBERS
roles/iam.workloadIdentityUser  serviceAccount:mygcpproject.svc.id.goog[static11-dsp-dp-airflow/dp-airflow]
  

И GSA была предоставлена пользовательская роль, которую мы создали под названием dsp_service_account_dataproc_v1 :

 $ gcloud projects get-iam-policy mygcpproject --format=json | grep dsp_service_account_dataproc_v1 -B 8 -A 1
    {
      "members": [
        "serviceAccount:static11-dp-airf@mygcpproject.iam.gserviceaccount.com"
      ],
      "role": "projects/mygcpproject/roles/dsp_service_account_dataproc_v1"
    },
  

Эта пользовательская роль получила все разрешения, необходимые для вызова API dataproc:

 $ gcloud iam roles describe dsp_service_account_dataproc_v1 --project mygcpproject
etag: BwWuudZzoGI=
includedPermissions:
- dataproc.agents.create
- dataproc.agents.delete
- dataproc.agents.get
- dataproc.agents.list
- dataproc.agents.update
- dataproc.clusters.create
- dataproc.clusters.delete
- dataproc.clusters.get
- dataproc.clusters.list
- dataproc.clusters.update
- dataproc.clusters.use
- dataproc.jobs.cancel
- dataproc.jobs.create
- dataproc.jobs.delete
- dataproc.jobs.get
- dataproc.jobs.list
- dataproc.jobs.update
- dataproc.operations.delete
- dataproc.operations.get
- dataproc.operations.list
- dataproc.tasks.lease
- dataproc.tasks.listInvalidatedLeases
- dataproc.tasks.reportStatus
  

Тем не менее, когда я пытаюсь создать кластер обработки данных, вызвав API обработки данных из Airflow, он терпит неудачу с:

<HTTPError 400 при запросе https://dataproc.googleapis.com/v1beta2/projects/mygcpproject/regions/europe-west1/clusters?alt=json возвращено «Пользователь, не авторизованный для работы в качестве учетной записи службы ‘static11-dp-airf@mygcpproject.iam.gserviceaccount.com ‘. Чтобы действовать в качестве учетной записи службы, пользователь должен иметь одну из ролей [Владелец, редактор, участник учетной записи службы]. Смотрите https://cloud.google.com/iam/docs/understanding-service-accounts для получения дополнительной информации «.>

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

Ответ №1:

В этом случае, похоже, что с идентификацией рабочей нагрузки в вашей настройке все в порядке, но, похоже, вы также пытаетесь заставить сам кластер обработки данных запускаться от имени учетной записи службы вызывающего абонента (что эквивалентно вызову, gcloud dataproc clusters create --service-account static11-dp-airf@mygcpproject.iam.gserviceaccount.com когда сам вызывающий абонент также static11-dp-airf@mygcpproject.iam.gserviceaccount.com ).).

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

В общем случае идентификатор, вызывающий API Dataproc, должен иметь Service Account User роль либо на уровне проекта, либо непосредственно в учетной записи службы, которая будет привязана к виртуальным машинам кластера Dataproc, даже если эта учетная запись службы, которую нужно привязать, является тем же идентификатором, что и вызывающий. Это также относится к обычным виртуальным машинам GCE без dataproc — например, если вы gcloud compute instances create --impersonate-service-account static11-dp-airf@mygcpproject.iam.gserviceaccount.com --service-account static11-dp-airf@mygcpproject.iam.gserviceaccount.com my-instance также должны выполнить сбой с той же ошибкой разрешения.

Таким образом, в основном вам просто нужно предоставить эту учетную запись службы Service Account User для «себя».

Как описано на https://cloud.google.com/dataproc/docs/concepts/configuring-clusters/service-accounts эта Service Account User роль необходима в дополнение к Dataproc Editor роли.

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

1. Блестяще, спасибо @dennis-huo. Это исправлено: gcloud iam service-accounts add-iam-policy-binding $SERVICE_ACCOUNT --member=serviceAccount:$SERVICE_ACCOUNT --role=roles/iam.serviceAccountUser

2. Я также должен отметить, что статья, на которую вы ссылались ( cloud.google.com/dataproc/docs/concepts/configuring-clusters / … ) явно не содержит подробностей о Service Account User роли, однако он ссылается на эту статью: cloud.google.com/iam/docs/service-accounts-actas в котором содержится более подробная информация.

3. Есть ли кто-нибудь, кого мы можем уведомить, чтобы в сообщении об ошибке было изменено «Пользователь» вместо «Актер»?