SDK Google Cloud Java с идентификатором рабочей нагрузки?

Oct 08 2020

Попытка выяснить, как пройти аутентификацию с помощью API хранилища из кластера GKE.

Код:

Storage storage = StorageOptions.newBuilder()
  .setCredentials(ServiceAccountCredentials.getApplicationDefault())
  .setProjectId(gcpProjectId)
  .build().getService();

getApplicationDefault() документировано использование этих средств для аутентификации с помощью API:

  1. Файл учетных данных, на который указывает переменная среды {@code GOOGLE_APPLICATION_CREDENTIALS}
  2. Учетные данные, предоставленные командой Google Cloud SDK {@code gcloud auth application-default login}
  3. Встроенные учетные данные Google App Engine
  4. Встроенные учетные данные Google Cloud Shell
  5. Встроенные учетные данные Google Compute Engine

Приложение использует функцию идентификации рабочей нагрузки GCP, поэтому учетная запись службы приложения (в кластере) аннотируется:

serviceAccount.annotations.iam.gke.io/gcp-service-account: [email protected]

Теперь вызов учетной записи хранения завершается ошибкой со следующей ошибкой:

{
  "code" : 403,
  "errors" : [ {
    "domain" : "global",
    "message" : "Primary: /namespaces/my-project.svc.id.goog with additional claims does not have storage.objects.create access to the Google Cloud Storage object.",
    "reason" : "forbidden"
  } ],
  "message" : "Primary: /namespaces/my-project.svc.id.goog with additional claims does not have storage.objects.create access to the Google Cloud Storage object."
}

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

Что еще мне следовало делать?

Ответы

MoritzSchmitzv.Hülst Oct 09 2020 at 15:47

Аннотация неправильная. Вместо:

serviceAccount.annotations.iam.gke.io/gcp-service-account: [email protected]

Это должно быть

iam.gke.io/gcp-service-account: [email protected]

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

java.io.IOException: Unexpected Error code 403 trying to get security access token from Compute Engine metadata for the default service account: Unable to generate access token; IAM returned 403 Forbidden: The caller does not have permission
This error could be caused by a missing IAM policy binding on the target IAM service account.
For more information, refer to the Workload Identity documentation:
    https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity#creating_a_relationship_between_ksas_and_gsas