Учетная запись Google Cloud Dataflow не распространяется на работников? - PullRequest
0 голосов
/ 05 декабря 2018

У нас есть несколько заданий потока данных Google Cloud (написанных на Java / Kotlin), и их можно запускать двумя различными способами:

  1. Инициируется из учетной записи пользователя Google Cloud
  2. Инициировано из учетной записи службы (с необходимыми политиками и разрешениями)

При запуске задания Dataflow из учетной записи пользователя Dataflow предоставляет рабочему учетную запись контроллера по умолчанию .Он не предоставляет авторизованного пользователя рабочим.

При запуске задания Dataflow из учетной записи service, я предполагаю, что учетная запись service, установленная с помощью setGcpCredential , будет распространена на рабочие виртуальные машины, которыеПоток данных использует в фоновом режиме. JavaDocs не упоминает ничего из этого, но они упоминают, что учетные данные используются для аутентификации по отношению к сервисам GCP.

В большинстве случаев использования Dataflow мы запускаем Dataflowзадание в проекте A, в то время как мы читаем из BigQuery в проекте B. Следовательно, мы предоставляем пользователю доступ читателя к набору данных BigQuery в проекте B, а также к учетной записи службы, используемой вторым способом, как описано выше.Эта же учетная запись службы также будет иметь роли jobUser и dataViewer для BigQuery в проекте A.

Теперь проблема заключается в том, что в обоих случаях нам, по-видимому, необходимо предоставить учетную запись службы по умолчанию для контроллерас доступом к набору данных BigQuery, который используется в задании потока данных.В противном случае мы получим отказано в разрешении (403) для BigQuery, когда задание попытается получить доступ к набору данных в проекте B. Для второго описанного способа я ожидаю, что поток данных будет независимым от значения по умолчаниюКонтроллер сервиса.Я догадываюсь, что Dataflow не передает рабочую учетную запись, заданную в PipelineOptions, рабочим.

В общем, мы предоставляем проект, регион, зону, временные местоположения (gcpTempLocation, tempLocation, stagingLocation), тип бегуна(в данном случае DataflowRunner) и gcpCredential как PipelineOptions.

Итак, действительно ли Облачный поток данных Google действительно передает предоставленную учетную запись работникам?

Обновление

Сначала мы попытались добавить options.setServiceAccount, как указано Magda , без добавления разрешений IAM.Это приводит к следующей ошибке из журналов потока данных:

{
  "code" : 403,
  "errors" : [ {
    "domain" : "global",
    "message" : " Current user cannot act as service account dataflow@project.iam.gserviceaccount.com. Causes: Current user cannot act as service account dataflow@project.iam.gserviceaccount.com..",
    "reason" : "forbidden"
  } ],
  "message" : " Current user cannot act as service account dataflow@project.iam.gserviceaccount.com.. Causes: Current user cannot act as service account dataflow@project.iam.gserviceaccount.com.",
  "status" : "PERMISSION_DENIED"
}

После этого мы попытались добавить roles/iam.serviceAccountUser к этой учетной записи службы.К сожалению, это привело к той же ошибке.У этой учетной записи службы уже были роли IAM Работник потока данных и Пользователь задания BigQuery.Сервисный аккаунт контроллера вычислений по умолчанию 123456-compute@developer.gserviceaccount.com имеет только роль редактора, и мы не добавили никаких других ролей / разрешений IAM.

1 Ответ

0 голосов
/ 12 декабря 2018

Я думаю, вам нужно настроить учетную запись контроллера тоже.Вы можете использовать options.setServiceAccount("hereYourControllerServiceAccount@yourProject.iam.gserviceaccount.com") в параметрах конвейера данных.

Вам потребуется добавить некоторые дополнительные разрешения:

  • Для контроллера: Администратор потока данных и Администратор объекта хранения.

  • Для исполнителя: Пользователь учетной записи службы.

Это то, что я нашел в документации Google и сам попробовал.

Я думаю, чтоможет дать вам некоторые сведения:

Для правильной работы источника и приемника BigQuery следующие две учетные записи должны иметь доступ ко всем наборам данных BigQuery, из которых ваше задание Cloud Dataflow читает или записывает:

-Учетная запись GCP, которую вы используете для выполнения задания Cloud Dataflow

-Учетная запись службы контроллера, выполняющая задание Cloud Dataflow

Например, если ваша учетная запись GCP - abcde@gmail.comи номер проекта, в котором вы выполняете задание Cloud Dataflow, - 123456789, следующие учетные записи должны иметь доступ ко всем используемым наборам данных BigQuery: abcde@gmail.com и123456789-compute@developer.gserviceaccount.com.

Подробнее: https://cloud.google.com/dataflow/docs/concepts/security-and-permissions#controller_service_account

...