Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Calcolare con precisione la dimensione dei bucket Google Cloud Storage con Cloud Functions e Pub/Sub

By Dror LevyJan 24, 20185 min read

Questa pagina è disponibile anche in English, Deutsch, Español, Français, 日本語 e Português.

Un metodo economico per analizzare in pochi clic la dimensione di tutti i suoi bucket Google Cloud Storage, sfruttando Pub/Sub, Cloud Functions e BigQuery.

Se gestisce bucket con un numero enorme di oggetti e desidera conoscerne la dimensione, avrà notato che il dashboard di Stackdriver Monitoring per Cloud Storage mostra solo delle stime e non fornisce un valore preciso.

In effetti, queste stime a volte si discostano in modo sensibile dalle dimensioni reali dei bucket.

gcs-calc-image-1

La dimensione del bucket evidenziato secondo gli Access Logs e gli Storage Logs è:

"bucket","storage_byte_hours"
"******playground","1833814969766862"

1833814969766862 / 24 = 76408957073619 byte (~69 TB)

Quali alternative ha a disposizione per ottenere un quadro più accurato della dimensione dei suoi bucket?

Una possibilità è il comando gsutil du, che restituisce lo spazio totale occupato da tutti gli oggetti del bucket. Tuttavia, eseguendo gsutil du su un bucket di grandi dimensioni con centinaia di migliaia o milioni di oggetti, si accorgerà che i tempi sono molto lunghi: il comando calcola l'utilizzo dello spazio tramite richieste di listing del bucket, operazione che può risultare lenta e piuttosto costosa. L'operazione storage.objects.list è infatti una Class A Operation, ovvero la più costosa tra quelle offerte da Cloud Storage.

Un'altra strada per ottenere un report giornaliero delle statistiche del bucket sono gli Access Logs e gli Storage Logs di Cloud Storage. Cloud Storage mette a disposizione access log e storage log sotto forma di file CSV scaricabili e consultabili. Gli access log riportano informazioni su tutte le richieste effettuate su un bucket specifico e vengono generati ogni ora, mentre gli storage log giornalieri descrivono il consumo di storage del bucket nel giorno precedente.

Di solito ciò che interessa è analizzare la dimensione giornaliera dello storage dei propri bucket. Eseguire gsutil du non è praticabile e attualmente Stackdriver Monitoring può risultare poco accurato per questo scopo.

Utilizzeremo gli Storage Logs e una Cloud Function (CF) attivata da un topic Pub/Sub per caricare in automatico il log del consumo di storage in BigQuery, dove sarà possibile interrogare e visualizzare la dimensione del bucket. Gli storage log caricati verranno poi spostati in un altro bucket; quelli non caricati correttamente, così come gli altri oggetti, verranno invece spostati in un bucket di "errori".

gcs-calc-image-2

  1. Crei un bucket in cui archiviare gli Storage e Access logs degli altri bucket. Selezioni il progetto designato e crei un nuovo bucket per i log
gcloud config set project PROJECT-ID
gsutil mb gs://LOGS-BUCKET
  1. Conviene inoltre separare gli storage log dagli usage log e prevedere un bucket dedicato ai log che non sono stati caricati correttamente in BigQuery. I log verranno spostati da gs://LOGS-BUCKET al bucket appropriato dopo essere stati elaborati dalla CF.
gsutil mb gs://PROCCESSED-LOGS-BUCKET
gsutil mb gs://ERRORS-LOGS-BUCKET
gsutil mb gs://USAGE-LOGS-BUCKET

Nota: in alternativa può usare cartelle differenti all'interno di un unico bucket, ma in questo caso dovrà modificare leggermente il codice della CF.

  1. Conceda al service account di Google Cloud Storage Analytics i permessi di scrittura sul nuovo bucket:
gsutil acl ch -g [email protected]:W gs://LOGS-BUCKET
  1. Abiliti le notifiche del bucket verso Pub/Sub. Il comando seguente crea una configurazione di notifica per gs://LOGS-BUCKET: ogni volta che un oggetto viene creato, modificato, eliminato o archiviato, verrà inviato un messaggio a un topic Pub/Sub con le informazioni pertinenti. Poiché ci interessa solo la creazione di nuovi oggetti (ovvero la generazione dei log), monitoreremo unicamente l'evento OBJECT_FINALIZE.
gsutil notification create -e OBJECT_FINALIZE -f none gs://LOGS-BUCKET
  • Il flag -f specifica le informazioni di payload del messaggio. Le opzioni disponibili sono 'json' o 'none'. Nella nostra CF non utilizziamo alcun metadato del bucket, quindi abbiamo optato per 'none'.
  • Aprendo la pagina Pub/Sub nella console per sviluppatori, noterà che il comando precedente ha creato un topic denominato projects/PROJECT-ID/topics/LOGS-BUCKET. I messaggi relativi ai nuovi oggetti verranno pubblicati su questo topic.
  1. Crei un nuovo dataset e una nuova tabella BigQuery
bq mk MY_DATASET
bq mk —-schema project_id:string,bucket:string,storage_byte_hours:integer,bytes:integer,date:date,update_time:timestamp,filename:string -t MY_DATASET.MY_TABLE
  1. Crei uno staging bucket per la function che stiamo per distribuire
gsutil mb gs://CF-STAGING-BUCKET
  1. Cloni il codice della Cloud Function
git clone https://github.com/doitintl/gcs-stats.git
cd gcs-stats

Importante: apra config.js con un editor di testo a sua scelta e modifichi i valori in base ai passaggi precedenti.

  1. Dopo aver modificato il file di configurazione, distribuisca la function
gcloud beta functions deploy gcs-stats \
— project PROJECT-ID \
— entry-point gcsStatsHandler \
— stage-bucket gs://CF-STAGING-BUCKET \
— source . \
— trigger-topic LOGS-BUCKET \
— memory 128 \
— timeout 10s
  1. Infine, possiamo abilitare gli Access e Storage log su tutti i bucket che vogliamo analizzare. Il bucket di destinazione per i log è ovviamente quello creato al primo passaggio: gs://LOGS-BUCKET.

Vogliamo avere una colonna con il project ID di ciascun bucket. Poiché i log non includono questa informazione, useremo un prefisso personalizzato per il nome del file di log. Il prefisso scelto è PROJECT_[ANALYZED-PROJECT-ID]BUCKET[ANALYZED-BUCKET]

Importante: se ha già abilitato il logging sul bucket, eseguire il comando seguente interromperà la configurazione di logging esistente.

gsutil logging set on -b gs://LOGS-BUCKET -o PROJECT_[ANALYZED-PROJECT-ID]_BUCKET_[ANALYZED-BUCKET] gs://ANALYZED-BUCKET

Ad esempio, se ha un bucket chiamato gs://my-enormous-bucket nel progetto my-storage-project, il prefisso dovrà essere PROJECT_my-storage-project_BUCKET_my-enormous-bucket. Se sceglie di non utilizzare il prefisso personalizzato, gli oggetti di log avranno il prefisso predefinito e la colonna project_id nella tabella BigQuery conterrà valori null.

  1. Abiliti i log per qualsiasi altro bucket che desideri monitorare, seguendo lo stesso procedimento del passaggio precedente.

Ogni giorno, alla scrittura degli storage log, un messaggio viene pubblicato sul topic Pub/Sub. Questi messaggi attivano la Cloud Function. Se il nuovo oggetto è uno storage log, viene letto e inserito nella tabella BigQuery, per poi essere spostato nel bucket gs://PROCCESSED-LOGS-BUCKET. Se si tratta di un access log, viene spostato in gs://USAGE-LOGS-BUCKET. Qualsiasi altro oggetto resta nel bucket di origine. Se durante il caricamento del log si verifica un errore, l'oggetto viene spostato in gs://ERRORS-LOGS-BUCKET.

Può anche collegare la tabella BigQuery a Google Data Studio e costruire un dashboard per visualizzare i dati con facilità.

gcs-calc-image-3