SDK Google Cloud Java с идентификатором рабочей нагрузки?
Попытка выяснить, как пройти аутентификацию с помощью API хранилища из кластера GKE.
Код:
Storage storage = StorageOptions.newBuilder()
.setCredentials(ServiceAccountCredentials.getApplicationDefault())
.setProjectId(gcpProjectId)
.build().getService();
getApplicationDefault() документировано использование этих средств для аутентификации с помощью API:
- Файл учетных данных, на который указывает переменная среды {@code GOOGLE_APPLICATION_CREDENTIALS}
- Учетные данные, предоставленные командой Google Cloud SDK {@code gcloud auth application-default login}
- Встроенные учетные данные Google App Engine
- Встроенные учетные данные Google Cloud Shell
- Встроенные учетные данные 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."
}
Это заставляет меня думать, что идентификатор рабочей нагрузки работает неправильно. Я ожидаю получить сообщение об ошибке для моей аннотированной учетной записи службы, а не учетной записи по умолчанию.
Что еще мне следовало делать?
Ответы
Аннотация неправильная. Вместо:
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