Google Cloud Java SDK z tożsamością zadań?

Oct 08 2020

Próbuję dowiedzieć się, jak uwierzytelnić się za pomocą interfejsu API magazynu z poziomu klastra GKE.

Kod:

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

getApplicationDefault() jest udokumentowane, że używa następujących środków do uwierzytelniania w interfejsie API:

  1. Plik danych logowania wskazywany przez zmienną środowiskową {@code GOOGLE_APPLICATION_CREDENTIALS}
  2. Dane logowania dostarczone przez polecenie {@code gcloud auth application-default login} w pakiecie Google Cloud SDK
  3. Dane logowania wbudowane w Google App Engine
  4. Wbudowane dane logowania Google Cloud Shell
  5. Dane logowania wbudowane w Google Compute Engine

Aplikacja korzysta z funkcji tożsamości obciążenia GCP, więc konto usługi aplikacji (w klastrze) ma adnotację:

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

Teraz wywołanie konta magazynu kończy się niepowodzeniem z następującym błędem:

{
  "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."
}

To sprawia, że ​​myślę, że tożsamość obciążenia nie działa poprawnie. Oczekuję, że otrzymam komunikat o błędzie dotyczący mojego konta usługi z adnotacjami, a nie domyślnego.

Czy jest coś jeszcze, co powinienem był zrobić?

Odpowiedzi

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

Adnotacja jest nieprawidłowa. Zamiast:

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

to musi być

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

Teraz komunikat o błędzie pokazuje również, że aplikacja używa tożsamości obciążenia:

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