Introduzione a Google Cloud Storage con Java

1. Panoramica

Google Cloud Storage offre spazio di archiviazione online su misura per le esigenze di una singola applicazione in base alla posizione, alla frequenza di accesso e al costo. A differenza di Amazon Web Services, Google Cloud Storage utilizza un'unica API per l'accesso ad alta, media e bassa frequenza.

Come la maggior parte delle piattaforme cloud, Google offre un livello di accesso gratuito; i dettagli sui prezzi sono qui.

In questo tutorial, ci collegheremo all'archiviazione, creeremo un bucket, scriveremo, leggeremo e aggiorneremo i dati. Durante l'utilizzo dell'API per leggere e scrivere dati, utilizzeremo anche l' utilità di archiviazione cloud gsutil .

2. Configurazione di Google Cloud Storage

2.1. Dipendenza da Maven

Dobbiamo aggiungere una singola dipendenza al nostro pom.xml :

 com.google.cloud google-cloud-storage 1.17.0 

Maven Central ha l'ultima versione della libreria.

2.2. Crea chiave di autenticazione

Prima di poterci connettere a Google Cloud, dobbiamo configurare l'autenticazione. Le applicazioni Google Cloud Platform (GCP) caricano una chiave privata e le informazioni di configurazione da un file di configurazione JSON. Generiamo questo file tramite la console GCP. L'accesso alla console richiede un account Google Cloud Platform valido.

Creiamo la nostra configurazione:

  1. Andando alla console di Google Cloud Platform
  2. Se non abbiamo ancora definito un progetto GCP, facciamo clic sul pulsante Crea e immettiamo un nome di progetto, ad esempio " baeldung-cloud-tutorial "
  3. Seleziona " nuovo account di servizio " dall'elenco a discesa
  4. Aggiungi un nome come " baeldung-cloud-storage " nel campo del nome dell'account.
  5. In " ruolo " seleziona Progetto, quindi Proprietario nel sottomenu.
  6. Seleziona crea e la console scarica un file di chiave privata.

Il ruolo nel passaggio 6 autorizza l'account ad accedere alle risorse del progetto. Per semplicità, abbiamo concesso a questo account l'accesso completo a tutte le risorse del progetto.

Per un ambiente di produzione, definiremmo un ruolo che corrisponde all'accesso richiesto dall'applicazione.

2.3. Installa la chiave di autenticazione

Successivamente, copiamo il file scaricato dalla console GCP in una posizione comoda e puntiamo la variabile di ambiente GOOGLE_APPLICATION_CREDENTIALS su di esso. Questo è il modo più semplice per caricare le credenziali, anche se esamineremo un'altra possibilità di seguito.

Per Linux o Mac:

export GOOGLE_APPLICATION_CREDENTIALS="/path/to/file"

Per Windows:

set GOOGLE_APPLICATION_CREDENTIALS="C:\path\to\file"

2.4. Installa Cloud Tools

Google fornisce diversi strumenti per la gestione della propria piattaforma cloud. Useremo gsutil durante questo tutorial per leggere e scrivere dati insieme all'API.

Possiamo farlo in due semplici passaggi:

  1. Installa il Cloud SDK dalle istruzioni qui per la nostra piattaforma.
  2. Segui la guida rapida per la nostra piattaforma qui. Nel passaggio 4 di Inizializzazione dell'SDK , selezioniamo il nome del progetto nel passaggio 4 della sezione 2.2 sopra (" baeldung-cloud-storage " o il nome utilizzato).

gsutil è ora installato e configurato per leggere i dati dal nostro progetto cloud.

3. Connessione allo storage e creazione di un bucket

3.1. Connetti allo spazio di archiviazione

Prima di poter utilizzare lo spazio di archiviazione di Google Cloud, dobbiamo creare un oggetto di servizio. Se abbiamo già impostato la variabile d'ambiente GOOGLE_APPLICATION_CREDENTIALS , possiamo utilizzare l'istanza predefinita:

Storage storage = StorageOptions.getDefaultInstance().getService(); 

Se non vogliamo utilizzare la variabile d'ambiente, dobbiamo creare un'istanza di Credentials e passarla a Storage con il nome del progetto:

Credentials credentials = GoogleCredentials .fromStream(new FileInputStream("path/to/file")); Storage storage = StorageOptions.newBuilder().setCredentials(credentials) .setProjectId("baeldung-cloud-tutorial").build().getService(); 

3.2. Creazione di un secchio

Ora che siamo connessi e autenticati, possiamo creare un bucket. I secchi sono contenitori che contengono oggetti. Possono essere utilizzati per organizzare e controllare l'accesso ai dati.

Non c'è limite al numero di oggetti in un bucket. GCP limita il numero di operazioni sui bucket e incoraggia i progettisti di applicazioni a enfatizzare le operazioni sugli oggetti piuttosto che sui bucket.

La creazione di un bucket richiede un BucketInfo:

Bucket bucket = storage.create(BucketInfo.of("baeldung-bucket")); 

Per questo semplice esempio, diamo un nome al bucket e accettiamo le proprietà predefinite. I nomi dei bucket devono essere univoci a livello globale. Se scegliamo un nome già utilizzato, create () fallirà.

3.3. Esaminare un secchio con gsutil

Dato che ora abbiamo un secchio, possiamo esaminarlo con gsutil.

Apriamo un prompt dei comandi e diamo un'occhiata:

$ gsutil ls -L -b gs://baeldung-1-bucket/ gs://baeldung-1-bucket/ : Storage class: STANDARD Location constraint: US Versioning enabled: None Logging configuration: None Website configuration: None CORS configuration: None Lifecycle configuration: None Requester Pays enabled: None Labels: None Time created: Sun, 11 Feb 2018 21:09:15 GMT Time updated: Sun, 11 Feb 2018 21:09:15 GMT Metageneration: 1 ACL: [ { "entity": "project-owners-385323156907", "projectTeam": { "projectNumber": "385323156907", "team": "owners" }, "role": "OWNER" }, ... ] Default ACL: [ { "entity": "project-owners-385323156907", "projectTeam": { "projectNumber": "385323156907", "team": "owners" }, "role": "OWNER" }, ... ]

gsutil assomiglia molto ai comandi della shell e chiunque abbia familiarità con la riga di comando di Unix dovrebbe sentirsi a proprio agio qui. Notare che abbiamo passato il percorso al nostro bucket come URL: gs: // baeldung-1-bucket / , insieme ad alcune altre opzioni.

The ls option produces a listing or objects or buckets, and the -L option indicated that we want a detailed listing – so we received details about the bucket including the creation times and access controls.

Let's add some data to our bucket!

4. Reading, Writing and Updating Data

In Google Cloud Storage, objects are stored in Blobs; Blob names can contain any Unicode character, limited to 1024 characters.

4.1. Writing Data

Let's save a String to our bucket:

String value = "Hello, World!"; byte[] bytes = value.getBytes(UTF_8); Blob blob = bucket.create("my-first-blob", bytes); 

As you can see, objects are simply arrays of bytes in the bucket, so we store a String by simply operating with its raw bytes.

4.2. Reading Data with gsutil

Now that we have a bucket with an object in it, let's take a look at gsutil.

Let's start by listing the contents of our bucket:

$ gsutil ls gs://baeldung-1-bucket/ gs://baeldung-1-bucket/my-first-blob

We passed gsutil the ls option again but omitted -b and -L, so we asked for a brief listing of objects. We receive a list of URIs for each object, which is one in our case.

Let's examine the object:

$ gsutil cat gs://baeldung-1-bucket/my-first-blob Hello World!

Cat concatenates the contents of the object to standard output. We see the String we wrote to the Blob.

4.3. Reading Data

Blobs are assigned a BlobId upon creation.

The easiest way to retrieve a Blob is with the BlobId:

Blob blob = storage.get(blobId); String value = new String(blob.getContent()); 

We pass the id to Storage and get the Blob in return, and getContent() returns the bytes.

If we don't have the BlobId, we can search the Bucket by name:

Page blobs = bucket.list(); for (Blob blob: blobs.getValues()) { if (name.equals(blob.getName())) { return new String(blob.getContent()); } }

4.4. Updating Data

We can update a Blob by retrieving it and then accessing its WriteableByteChannel:

String newString = "Bye now!"; Blob blob = storage.get(blobId); WritableByteChannel channel = blob.writer(); channel.write(ByteBuffer.wrap(newString.getBytes(UTF_8))); channel.close();

Let's examine the updated object:

$ gsutil cat gs://baeldung-1-bucket/my-first-blob Bye now!

4.5. Save an Object to File, Then Delete

Let's save the updated the object to a file:

$ gsutil copy gs://baeldung-1-bucket/my-first-blob my-first-blob Copying gs://baeldung-1-bucket/my-first-blob... / [1 files][ 9.0 B/ 9.0 B] Operation completed over 1 objects/9.0 B. Grovers-Mill:~ egoebelbecker$ cat my-first-blob Bye now!

As expected, the copy option copies the object to the filename specified on the command line.

gsutil can copy any object from Google Cloud Storage to the local file system, assuming there is enough space to store it.

We'll finish by cleaning up:

$ gsutil rm gs://baeldung-1-bucket/my-first-blob Removing gs://baeldung-1-bucket/my-first-blob... / [1 objects] Operation completed over 1 objects. $ gsutil ls gs://baeldung-1-bucket/ $

rm (anche del funziona) cancella l'oggetto specificato

5. conclusione

In questo breve tutorial, abbiamo creato le credenziali per Google Cloud Storage e connesso all'infrastruttura. Abbiamo creato un bucket, scritto i dati, quindi lo abbiamo letto e modificato. Dato che stiamo lavorando con l'API, abbiamo anche utilizzato gsutil per esaminare l'archiviazione nel cloud durante la creazione e la lettura dei dati.

Abbiamo anche discusso su come utilizzare i bucket e scrivere e modificare i dati in modo efficiente.

Esempi di codice, come sempre, possono essere trovati su GitHub.