Wie melde ich mich über eine Python-Funktion bei Google Cloud Storage an?

Aug 24 2020

Ich bin neu in Google Cloud Storage und versuche, eine Funktion einzurichten, die einmal am Tag einen Blob herunterlädt. Im Moment arbeite ich in meinem Jupyter-Notizbuch, aber schließlich wird der Code in einer Azure-Funktion ausgeführt. Ich habe Probleme beim Einrichten des Clients, der mich mit dem Bucket verbindet. Ich habe einen JSON-Berechtigungsnachweis für ein Dienstkonto, mit dem ich eine Verbindung zu Google herstellen kann.

Vor Ort habe ich eine Lösung gefunden:

from google.cloud import storage

client = storage.Client.from_service_account_json('<PATH_TO_SERVICE_ACCOUNT_JSON>')

Das Problem ist, dass ich keinen Pfad habe, in dem ich meinen JSON in der Cloud speichere, sondern im Schlüsseldepot. Ich habe die folgende Lösung gefunden:

from google.cloud import storage
import json
from google.oauth2 import service_account

string_key = get_key_from_key_vault()
service_account_info = json.loads(string_key)
google_credentials = service_account.Credentials.from_service_account_info(
    service_account_info
)
scoped_credentials = google_credentials.with_scopes(
    ['https://www.googleapis.com/auth/cloud-platform.read-only'])
print(type(scoped_credentials))
client = storage.Client(credentials = scoped_credentials)

Ich bin nicht ganz sicher, ob ich das scoped_credentials = ...Teil brauche, aber ich habe nur Leseberechtigungen für den Bucket. (Wenn ich das Teil überspringe, bleibt der Fehler gleich)

Wenn ich mich für diese Lösung entscheide, wird folgende Fehlermeldung angezeigt:

DefaultCredentialsError: Could not automatically determine credentials. Please set 
GOOGLE_APPLICATION_CREDENTIALS or explicitly create credentials and re-run the application. For
 more information, please see https://cloud.google.com/docs/authentication/getting-started

Ich habe keine Ahnung, was ich falsch mache, weil ich denke, dass ich die Anmeldeinformationen bereits explizit festgelegt habe.

Beste P.

Antworten

1 JanHernandez Aug 24 2020 at 20:44

Sie können die Umgebungsvariable GOOGLE_APPLICATION_CREDENTIALSmit dem Pfad der JSON-Datei festlegen und Ihre Funktion authentifizieren, indem Sie den Speicherclient ohne Parameter starten.

client = storage.Client()

* Standardmäßig verwendet der Speicherclient den Dateipfad für die UmgebungsvariableGOOGLE_APPLICATION_CREDENTIALS

Dies ist der einfachste Weg, JSON-Anmeldeinformationen zu verwenden, und es ist mit den meisten Python-Bibliotheken von Google Cloud kompatibel.

1 Pet Aug 25 2020 at 08:41

Nach einigen weiteren Tests stellte ich fest, dass ich es versäumt hatte, etwas hinzuzufügen project = None. Wenn Sie es hinzufügen und den folgenden Befehl verwenden, um den Client zu erstellen, funktioniert es:

client = storage.Client(project = None, credentials = scoped_credentials)

Danke für deine Hilfe und Denkanstöße :-)

guillaumeblaquiere Aug 24 2020 at 19:19

(Ich benutze den Antwortteil, weil die Code-Formatierung im Kommentar schrecklich ist.)

Können Sie dies versuchen und mir sagen, ob der 2-Zugriffstoken gedruckt ist?

from google.cloud import storage
import json
from google.oauth2 import service_account
from google.auth.transport import requests as grequests

string_key = get_key_from_key_vault()
service_account_info = json.loads(string_key)

google_credentials = service_account.Credentials.from_service_account_info(
    service_account_info
)
google_credentials.refresh(grequests.Request())
print(google_credentials.token)


scoped_credentials = google_credentials.with_scopes(
    ['https://www.googleapis.com/auth/cloud-platform.read-only'])
scoped_credentials.refresh(grequests.Request())
print(scoped_credentials.token)