Come accedere a Google Cloud Storage da una funzione Python?

Aug 24 2020

Sono nuovo nell'archiviazione cloud di Google e provo a configurare una funzione che scarica un BLOB una volta al giorno. Al momento sto lavorando nel mio Jupyter Notebook ma alla fine il codice verrà eseguito in una funzione Azure. Sto lottando con la configurazione del client che mi collega al bucket. Ho una credenziale dell'account di servizio JSON che mi consente di connettermi a Google.

A livello locale ho trovato una soluzione:

from google.cloud import storage

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

Il problema è che non ho un percorso in cui memorizzo il mio JSON nel cloud ma lo memorizzo nell'insieme di credenziali delle chiavi. Ho trovato la seguente soluzione:

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)

Non sono del tutto sicuro di aver bisogno della scoped_credentials = ...parte, ma ho solo i permessi di lettura sul secchio. (se salto la parte l'errore rimane lo stesso)

Quando cerco questa soluzione ottengo il seguente errore:

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

Non ho la più pallida idea di cosa sto sbagliando perché penso di aver già impostato esplicitamente le credenziali.

Miglior P

Risposte

1 JanHernandez Aug 24 2020 at 20:44

è possibile impostare la variabile di ambiente GOOGLE_APPLICATION_CREDENTIALScon il percorso del file json e autenticare la funzione avviando il client di archiviazione senza parametri.

client = storage.Client()

* per impostazione predefinita, il client di archiviazione utilizza il percorso del file sulla variabile di ambienteGOOGLE_APPLICATION_CREDENTIALS

È il modo più semplice per utilizzare le credenziali JSON ed è compatibile con la maggior parte delle librerie Python di Google Cloud.

1 Pet Aug 25 2020 at 08:41

dopo qualche altro test ho scoperto che mi mancava aggiungere project = None. Se lo aggiungi e usa il seguente comando per creare il client funziona:

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

Grazie per il tuo aiuto e spunti di riflessione :-)

guillaumeblaquiere Aug 24 2020 at 19:19

(Uso la parte risposta perché la formattazione del codice nel commento è orribile)

Puoi provare questo e dirmi se vedi il 2 token di accesso stampato?

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)