AWS S3 con Java

1. Introduzione

In questo tutorial impareremo come interagire con il sistema di storage Amazon S3 (Simple Storage Service) a livello di programmazione, da Java.

Ricorda che S3 ha una struttura molto semplice: ogni bucket può memorizzare un numero qualsiasi di oggetti a cui è possibile accedere utilizzando un'interfaccia SOAP o un'API in stile REST.

In futuro, utilizzeremo l'SDK AWS per Java per creare, elencare ed eliminare i bucket S3. Caricheremo, elencheremo, scaricheremo, copiare, spostare, rinominare ed eliminare anche gli oggetti all'interno di questi bucket.

2. Dipendenze di Maven

Prima di iniziare, dobbiamo dichiarare la dipendenza dell'SDK AWS nel nostro progetto:

 com.amazonaws aws-java-sdk 1.11.163 

Per visualizzare l'ultima versione, controlla Maven Central.

3. Prerequisiti

Per utilizzare AWS SDK, avremo bisogno di alcune cose:

  1. Account AWS: abbiamo bisogno di un account Amazon Web Services. Se ancora non ne hai, vai avanti e crea un account
  2. Credenziali di sicurezza AWS: queste sono le nostre chiavi di accesso che ci consentono di effettuare chiamate programmatiche alle azioni dell'API AWS. Possiamo ottenere queste credenziali in due modi, utilizzando le credenziali dell'account root AWS dalla sezione delle chiavi di accesso della pagina delle credenziali di sicurezza o utilizzando le credenziali utente IAM dalla console IAM
  3. Scelta della regione AWS: dobbiamo selezionare una o più regioni AWS in cui archiviare i dati di Amazon S3. Tieni presente che i prezzi dello storage S3 variano in base alla regione. Per maggiori dettagli, vai alla documentazione ufficiale. Per questo tutorial, utilizzeremo Stati Uniti orientali (Ohio) (regione us-east-2 )

4. Creazione della connessione client

Innanzitutto, dobbiamo creare una connessione client per accedere al servizio Web Amazon S3. Useremo AmazonS3 interfaccia per questo scopo:

AWSCredentials credentials = new BasicAWSCredentials( "", "" ); 

E quindi configurare il client:

AmazonS3 s3client = AmazonS3ClientBuilder .standard() .withCredentials(new AWSStaticCredentialsProvider(credentials)) .withRegion(Regions.US_EAST_2) .build();

5. Operazioni su bucket Amazon S3

5.1. Creazione di un secchio

È importante notare che lo spazio dei nomi del bucket è condiviso da tutti gli utenti del sistema. Quindi il nostro nome di bucket deve essere univoco in tutti i nomi di bucket esistenti in Amazon S3 (scopriremo come verificarlo tra un attimo).

Inoltre, come specificato nella documentazione ufficiale, i nomi dei Bucket devono soddisfare i seguenti requisiti:

  • i nomi non devono contenere trattini bassi
  • i nomi devono contenere da 3 a 63 caratteri
  • i nomi non devono terminare con un trattino
  • i nomi non possono contenere punti adiacenti
  • i nomi non possono contenere trattini accanto ai punti (ad esempio, "my-.bucket.com" e "my.-bucket" non sono validi)
  • i nomi non possono contenere caratteri maiuscoli

Creiamo un bucket:

String bucketName = "baeldung-bucket"; if(s3client.doesBucketExist(bucketName)) { LOG.info("Bucket name is not available." + " Try again with a different Bucket name."); return; } s3client.createBucket(bucketName);

Qui stiamo usando s3client che abbiamo creato nel passaggio precedente. Prima di creare un bucket, controlliamo se il nome del nostro bucket è disponibile o meno utilizzando il metodo doesBucketExist () . Se questo nome è disponibile, utilizzeremo il metodo createBucket () .

5.2. Bucket di quotazione

Ora che abbiamo creato alcuni bucket, stampiamo ora un elenco di tutti i bucket disponibili nel nostro ambiente S3 utilizzando il metodo listBuckets () . Questo metodo restituirà un elenco di tutti i Bucket:

List buckets = s3client.listBuckets(); for(Bucket bucket : buckets) { System.out.println(bucket.getName()); }

Questo elencherà tutti i bucket presenti nel nostro ambiente S3:

baeldung-bucket baeldung-bucket-test2 elasticbeanstalk-us-east-2

5.3. Eliminazione di un bucket

È importante assicurarsi che il nostro bucket sia vuoto prima di poterlo eliminare. In caso contrario, verrà generata un'eccezione. Inoltre, tieni presente che solo il proprietario di un bucket può eliminarlo indipendentemente dalle sue autorizzazioni (Criteri di controllo degli accessi):

try { s3client.deleteBucket("baeldung-bucket-test2"); } catch (AmazonServiceException e) { System.err.println("e.getErrorMessage()); return; }

6. Operazioni con gli oggetti Amazon S3

Un file o una raccolta di dati all'interno del bucket Amazon S3 è noto come oggetto. Possiamo eseguire diverse operazioni sugli oggetti come caricare, elencare, scaricare, copiare, spostare, rinominare ed eliminare.

6.1. Caricamento di oggetti

Il caricamento di un oggetto è un processo piuttosto semplice. Useremo un metodo putObject () che accetta tre parametri:

  1. bucketName : il nome del bucket in cui vogliamo caricare l'oggetto
  2. chiave : questo è il percorso completo del file
  3. file : il file effettivo contenente i dati da caricare
s3client.putObject( bucketName, "Document/hello.txt", new File("/Users/user/Document/hello.txt") );

6.2. Elenco di oggetti

Useremo il metodo listObjects () per elencare tutti gli oggetti disponibili nel nostro bucket S3:

ObjectListing objectListing = s3client.listObjects(bucketName); for(S3ObjectSummary os : objectListing.getObjectSummaries()) { LOG.info(os.getKey()); }

La chiamata al metodo listObjects () dell'oggetto s3client produrrà l' oggetto ObjectListing , che può essere utilizzato per ottenere un elenco di tutti i riepiloghi degli oggetti nel bucket specificato. Stiamo solo stampando la chiave qui, ma ci sono anche un paio di altre opzioni disponibili, come dimensioni, proprietario, ultima modifica, classe di archiviazione, ecc ...

Questo ora stamperà un elenco di tutti gli oggetti all'interno del nostro bucket:

Document/hello.txt

6.3. Download di un oggetto

To download an object, we'll first use the getObject() method on s3client which will return an S3Object object. Once we get this, we'll call getObjectContent() on this to get an S3ObjectInputStream object which behaves like a conventional Java InputStream.

S3Object s3object = s3client.getObject(bucketName, "picture/pic.png"); S3ObjectInputStream inputStream = s3object.getObjectContent(); FileUtils.copyInputStreamToFile(inputStream, new File("/Users/user/Desktop/hello.txt"));

Here, we are using FileUtils.copyInputStreamToFile() method by Apache Commons. You can also visit this Baeldung article to explore other ways to convert an InputStream to a File.

6.4. Copying, Renaming and Moving an Object

We can copy an object by calling copyObject() method on our s3client which accepts four parameters:

  1. source bucket name
  2. object key in source bucket
  3. destination bucket name (it can be same as source)
  4. object key in destination bucket
s3client.copyObject( "baeldung-bucket", "picture/pic.png", "baeldung-bucket2", "document/picture.png" );

Note: We can use a combination of copyObject() method deleteObject() for performing moving and renaming tasks. This will involve copying the object first and then deleting it from its old location.

6.5. Deleting an Object

To delete an Object, we'll call deleteObject() method on s3client and pass the bucket name and object key:

s3client.deleteObject("baeldung-bucket","picture/pic.png");

6.6. Deleting Multiple Objects

To delete multiple objects at once, we'll first create the DeleteObjectsRequest object and pass the bucket name to its constructor. Then we'll pass an array of all the object keys that we want to delete.

Una volta che abbiamo questo oggetto DeleteObjectsRequest , possiamo passarlo al metodo deleteObjects () del nostro s3client come argomento. In caso di successo, questo cancellerà tutti gli oggetti che abbiamo fornito:

String objkeyArr[] = { "document/hello.txt", "document/pic.png" }; DeleteObjectsRequest delObjReq = new DeleteObjectsRequest("baeldung-bucket") .withKeys(objkeyArr); s3client.deleteObjects(delObjReq);

7. Conclusione

In questo articolo, ci siamo concentrati sulle basi dell'interazione con il servizio Web Amazon S3, sia a livello di bucket che di oggetto.

Come sempre, l'implementazione completa di questo tutorial può essere trovata su Github.