SDK do Google Cloud Java com identidade de carga de trabalho?
Tentando descobrir como se autenticar com a API de armazenamento de dentro de um cluster GKE.
Código:
Storage storage = StorageOptions.newBuilder()
.setCredentials(ServiceAccountCredentials.getApplicationDefault())
.setProjectId(gcpProjectId)
.build().getService();
getApplicationDefault() está documentado para usar estes meios para autenticar com a API:
- Arquivo de credenciais apontado pela variável de ambiente {@code GOOGLE_APPLICATION_CREDENTIALS}
- Credenciais fornecidas pelo comando {@code gcloud auth application-default login} do Google Cloud SDK
- Credenciais integradas do Google App Engine
- Credenciais integradas do Google Cloud Shell
- Credenciais integradas do Google Compute Engine
O aplicativo está usando o recurso de identidade de carga de trabalho do GCP, portanto, a conta de serviço do aplicativo (dentro do cluster) é anotada com:
serviceAccount.annotations.iam.gke.io/gcp-service-account: [email protected]
Agora, a chamada para a conta de armazenamento falha com o seguinte erro:
{
"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."
}
Isso me faz pensar que a identidade da carga de trabalho não está funcionando corretamente. Estou esperando receber uma mensagem de erro para minha conta de serviço anotada, e não a padrão.
Há mais alguma coisa que eu deveria estar fazendo?
Respostas
A anotação está errada. Ao invés de:
serviceAccount.annotations.iam.gke.io/gcp-service-account: [email protected]
deve ser
iam.gke.io/gcp-service-account: [email protected]
Agora, a mensagem de erro também mostra que o aplicativo está usando uma identidade de carga de trabalho:
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