2016-09-26 2 views
1

Ich versuche, die Anwendung Standardanmeldeinformationen für die Container-Engine für die Python-IAM-API zu verwenden. Aber ich bekomme den folgenden Fehler, der auf unzulängliche Authentifizierungsbereiche zeigt. In meinem Projekt ist die IAM-API aktiviert und der Code funktioniert lokal. Also ich bin mir nicht sicher, was ich vermisse.Anwendung Standardanmeldeinformationen funktioniert nicht auf Google Container Engine

Meine Fehlermeldung:

22:26:16.000 
ERROR:root:<HttpError 403 when requesting https://iam.googleapis.com/v1/projects/henry-dev/serviceAccounts/[email protected]/keys?alt=json returned "Request had insufficient authentication scopes."> 
{ 
metadata: {…} 
textPayload: "ERROR:root:<HttpError 403 when requesting https://iam.googleapis.com/v1/projects/henry-dev/serviceAccounts/[email protected]/keys?alt=json returned "Request had insufficient authentication scopes."> 
" 
insertId: "116wpgtg3n4zndx" 
log: "simplekubeserver" 
} 

22:26:16.000 
HttpError: <HttpError 403 when requesting https://iam.googleapis.com/v1/projects/henry-dev/serviceAccounts/[email protected]/keys?alt=json returned "Request had insufficient authentication scopes."> 
{ 
metadata: {…} 
textPayload: "HttpError: <HttpError 403 when requesting https://iam.googleapis.com/v1/projects/henry-dev/serviceAccounts/[email protected]/keys?alt=json returned "Request had insufficient authentication scopes."> 
" 
insertId: "116wpgtg3n4znej" 
log: "simplekubeserver" 
} 

My-Code, die lokal, aber nicht auf GKE funktioniert:

from oauth2client.client import GoogleCredentials 

def _iam_service(): 
    credentials = GoogleCredentials.get_application_default() 
    return discovery.build(serviceName='iam', 
         version='v1', 
         credentials=credentials) 

def list_keys(project_id, service_account_id): 
    full_name = 'projects/{0}/serviceAccounts/{1}'.format(project_id, service_account_id) 
    keys = _iam_service().projects().serviceAccounts().keys() 
    request = keys.list(name=full_name) 
    return request.execute() 

Eine Sache, die ich zu beheben tat, um zu bekommen, welche Service-Konto verwendet wird.

print credentials.service_account_email 

Lokal zeigt dies das korrekte Dienstkonto, das ich verwende. Während auf GKE, erhalte ich keine, aber erwartet, so etwas wie [email protected]

Im source code, ich sehe:

_get_application_default_credential_GCE()   
_get_application_default_credential_GAE() 

Aber nichts explizit für GKE. Also nehme ich an, dass der für GCE verwendet wird.

This doc erwähnt, dass dies auf Container Engine funktionieren sollte.

Application Default Credentials are best suited for cases 
when the call needs to have the same identity and authorization level 
for the application independent of the user. This is the recommended 
approach to authorize calls to Google Cloud Platform APIs, particularly 
when you're building an application that is deployed to Google App 
Engine, **Google Container Engine**, or Google Compute Engine virtual 
machines. 

Antwort

1

Die IAM Service Accounts API erfordert entweder die https://www.googleapis.com/auth/iam oder https://www.googleapis.com/auth/cloud-platform Umfang. Die Bereiche auf den Knoten Ihres GKE-Clusters werden bei der Clustererstellung (oder Knotenpoolerstellung) definiert. Wenn Sie Ihren Cluster über die Cloud Console oder über gcloud erstellt haben, enthalten die Standardbereiche diese Cluster nicht.

In der Cloud Console können Sie die Wolke-Plattform Rahmen zu einem new cluster durch Klicken auf den Link „Mehr“ und Einstellung „Cloud Platform“ auf „Enabled“

hinzufügen Wenn Sie gcloud verwenden, können Sie festlegen, Bereiche, indem Sie die --scopes Flagge zu gcloud container clusters create oder gcloud container node-pools create

+0

übergeben Vielen Dank, dass für mich durch Erstellen eines neuen Clusters mit dem Cloud-Plattform-Bereich aktiviert. Es wäre toller, wenn der Bereich geändert werden könnte, ohne einen neuen Cluster erstellen zu müssen. –

+0

Sie können die Bereiche in einem ausgeführten Cluster ändern, indem Sie einen neuen Knotenpool (mit den gewünschten Bereichen) erstellen und dann den alten löschen. Aber es sieht so aus, als wärst du schon vorbei :). Froh, dass es für dich funktioniert hat. –

Verwandte Themen