2012-09-15 14 views
13

Come caricare i dati su Google BigQuery con gsutil, utilizzando un account di servizio creato nella console delle API di Google?Come utilizzare gli account di servizio con gsutil, per il caricamento su CS + BigQuery

Per prima cosa sto tentando di caricare i dati su Cloud Storage utilizzando gsutil, poiché sembra essere il modello consigliato. Tutto funziona correttamente con l'approvazione dell'utente di Gmail, ma non mi consente di utilizzare un account di servizio.

Sembra che posso utilizzare l'API di Python per ottenere un token di accesso utilizzando signed JWT credentials, ma preferirei utilizzando uno strumento da riga di comando come gsutil con il supporto per il caricamento ripristinabili ecc

EDIT: Vorrei utilizzare gsutil in un cron per caricare i file su Cloud Storage ogni sera e quindi importarli in BigQuery.

Qualsiasi aiuto o indicazioni stradali per andare sarebbe apprezzato.

+1

A partire dal 25 marzo 2013, gsutil supporta gli account di servizio. Vedere la risposta di Mike Schwartz qui sotto: http://stackoverflow.com/a/15646928/92445 –

risposta

15

Google Cloud Storage ha appena rilasciato una nuova versione (3.26) di gsutil che supporta gli account di servizio (oltre a una serie di altre funzionalità e correzioni di bug). Se hai già installato gsutil è possibile ottenere questa versione eseguendo:

gsutil aggiornare

In breve, è possibile configurare un account di servizio eseguendo:

gsutil config -e

Vedere " gsutil help config "per maggiori dettagli sull'uso del comando config. Vedi "gsutil help creds" per informazioni sui diversi tipi di credenziali (e diversi casi d'uso) supportati da gsutil.

Mike Schwartz, Google Cloud Storage Team

4

Gli account di servizio vengono generalmente utilizzati per identificare le applicazioni ma quando si utilizza gsutil si è un utente interattivo ed è più naturale utilizzare il proprio account personale. Puoi sempre associare le tue risorse di Google Cloud Storage con il tuo account personale e/o con un account di servizio (tramite gli elenchi di controllo degli accessi o la scheda Team della console degli sviluppatori) quindi il mio consiglio sarebbe di utilizzare il tuo account personale con gsutil e quindi utilizzare un account di servizio per la tua applicazione.

+0

Se lo uso in un cron job in un ambiente di produzione, cosa succederà quando lascerò la società? Il cron job fallirà? – jonathan

+0

Jonathan - sì, fallirà se il tuo account utente non esiste più. Dovremmo supportare gli account di servizio con gsutil, ma non ancora. Potresti: 1) aggiungere rapidamente la funzione a gsutil/oauth2_plugin/oauth2_helper.py utilizzando l'implementazione client oauth client di Python esistente o 2) recuperare il token di accesso esternamente e memorizzarlo nella posizione di cache specificata in ~/.boto o 3) creare un account di ruolo (tramite gmail.com o google apps) e concedere l'autorizzazione a tale account e utilizzarlo per il flusso di oauth. –

+0

@RyanBoyd: Grazie! Potresti postare il tuo commento come risposta, quindi posso accettarlo? – jonathan

3

Prima di tutto, si dovrebbe usare lo strumento da riga di comando bq per interagire con BigQuery dalla riga di comando. (Leggi su di esso here e scaricalo su here).

Sono d'accordo con Marc che è una buona idea quella di utilizzare le credenziali personali sia con gsutil e bq, lo strumento da riga di comando bq supporta l'uso di account di servizio. Il comando per utilizzare l'autenticazione dell'account di servizio potrebbe essere simile a questo.

bq --service_account [email protected] --service_account_credential_store keep_me_safe --service_account_private_key_file myfile.key query 'select count(*) from publicdata:samples.shakespeare' 

Tipo bq --help per ulteriori informazioni.

È anche piuttosto semplice utilizzare gli account di servizio nel codice tramite Python o Java. Ecco un rapido esempio utilizzando un codice dallo BigQuery Authorization guide.

import httplib2 

from apiclient.discovery import build 
from oauth2client.client import SignedJwtAssertionCredentials 

# REPLACE WITH YOUR Project ID 
PROJECT_NUMBER = 'XXXXXXXXXXX' 
# REPLACE WITH THE SERVICE ACCOUNT EMAIL FROM GOOGLE DEV CONSOLE 
SERVICE_ACCOUNT_EMAIL = '[email protected]' 

f = file('key.p12', 'rb') 
key = f.read() 
f.close() 

credentials = SignedJwtAssertionCredentials(
    SERVICE_ACCOUNT_EMAIL, 
    key, 
    scope='https://www.googleapis.com/auth/bigquery') 

http = httplib2.Http() 
http = credentials.authorize(http) 

service = build('bigquery', 'v2') 
datasets = service.datasets() 
response = datasets.list(projectId=PROJECT_NUMBER).execute(http) 

print('Dataset list:\n') 
for dataset in response['datasets']: 
    print("%s\n" % dataset['id']) 
+0

Grazie per il vostro aiuto. Ma capisco che gsutil è la strada da percorrere per caricamenti ripristinabili e affidabili. Vorrei usare questo in un cron e non dipendere dal mio account personale (cosa succede quando esco dalla mia azienda?). Il cron deve continuare a lavorare. – jonathan

+0

Sì, gsutil interagisce con Cloud Storage e bq ti consente di caricare i dati che vivono in Cloud Storage in BigQuery. Sia gsutil che bq memorizzeranno le tue credenziali OAuth2 che permetteranno agli script di funzionare senza che tu debba effettuare il login ogni volta, e sì, puoi eseguire un cron job senza l'input dell'utente ogni volta. Se si decide di utilizzare gli account di servizio nello script, quindi: (1) Impostare le autorizzazioni del proprio bucket di archiviazione per includere l'indirizzo dell'account di servizio e il proprio (2) Utilizzare questo account di servizio con bq come descritto sopra. –

+0

Aggiornato la mia risposta con un altro codice (sopra) –

2

distacco come una risposta, invece di un commento, in base alla richiesta di Jonathan

Sì, una sovvenzione di OAuth fatta da un singolo utente non sarà più valida se l'utente non esiste più. Pertanto, se si utilizza il flusso basato sull'utente con il proprio account personale, i processi automatizzati non funzioneranno se si lascia l'azienda.

Dovremmo supportare gli account di servizio con gsutil, ma non ancora.

Si potrebbe fare uno di:

  1. Probabilmente aggiungere la funzionalità rapidamente a gsutil/oauth2_plugin/oauth2_helper.py usando il pitone OAuth implementazione client esistente del servizio di account
  2. Recuperare l'token di accesso dall'esterno tramite il flusso dell'account di servizio e memorizzarlo nella posizione cache specificata in ~ /.boto (leggermente hacky)
  3. Crea tu stesso un account di ruolo (tramite gmail.com o google apps) e concedi l'autorizzazione per quell'account e utilizzalo per il flusso OAuth.

Abbiamo archiviato la richiesta di funzionalità per supportare gli account di servizio per gsutil e avere un feedback iniziale positivo dal team. (anche se non è possibile fornire un ETA)

+1

Questa risposta è obsoleta, vedere la risposta di Mike per informazioni più aggiornate. – Benson