Google Cloud Java SDK z tożsamością zadań?
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:
- Plik danych logowania wskazywany przez zmienną środowiskową {@code GOOGLE_APPLICATION_CREDENTIALS}
- Dane logowania dostarczone przez polecenie {@code gcloud auth application-default login} w pakiecie Google Cloud SDK
- Dane logowania wbudowane w Google App Engine
- Wbudowane dane logowania Google Cloud Shell
- 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
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