Wie melde ich mich über eine Python-Funktion bei Google Cloud Storage an?
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
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.
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 :-)
(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)