AWS S3 met Java

1. Inleiding

In deze zelfstudie leren we hoe u programmatisch kunt communiceren met het Amazon S3-opslagsysteem (Simple Storage Service) vanuit Java.

Onthoud dat S3 een zeer eenvoudige structuur heeft: elke bucket kan een willekeurig aantal objecten opslaan die toegankelijk zijn via een SOAP-interface of een API in REST-stijl.

In de toekomst gebruiken we de AWS SDK voor Java om S3-buckets te maken, weer te geven en te verwijderen. We zullen ook objecten binnen deze buckets uploaden, weergeven, downloaden, kopiëren, verplaatsen, hernoemen en verwijderen.

2. Maven afhankelijkheden

Voordat we aan de slag gaan, moeten we de AWS SDK-afhankelijkheid in ons project declareren:

 com.amazonaws aws-java-sdk 1.11.163 

Controleer Maven Central om de nieuwste versie te bekijken.

3. Vereisten

Om AWS SDK te gebruiken, hebben we een paar dingen nodig:

  1. AWS-account: we hebben een Amazon Web Services-account nodig. Als je er nog geen hebt, ga je gang en maak je een account aan
  2. AWS-beveiligingsreferenties: Dit zijn onze toegangssleutels waarmee we programmatische aanroepen van AWS API-acties kunnen maken. We kunnen deze inloggegevens op twee manieren verkrijgen, ofwel door AWS-rootaccountreferenties te gebruiken uit het gedeelte met toegangssleutels van de pagina Beveiligingsreferenties of door IAM-gebruikersreferenties te gebruiken vanuit de IAM-console
  3. AWS-regio kiezen: We moeten een AWS-regio ('s) selecteren waar we onze Amazon S3-gegevens willen opslaan. Houd er rekening mee dat S3-opslagprijzen per regio verschillen. Ga voor meer informatie naar de officiële documentatie. Voor deze tutorial gebruiken we US ​​East (Ohio) (region us-east-2)

4. Clientverbinding maken

Eerst moeten we een clientverbinding maken om toegang te krijgen tot de Amazon S3-webservice. We zullen gebruiken Amazon S3 interface voor dit doel:

AWSCredentials referenties = nieuwe BasicAWSCredentials ("", ""); 

En configureer vervolgens de client:

AmazonS3 s3client = AmazonS3ClientBuilder .standard () .withCredentials (nieuwe AWSStaticCredentialsProvider (referenties)) .withRegion (Regions.US_EAST_2) .build ();

5. Amazon S3-bucketbewerkingen

5.1. Een bucket maken

Het is belangrijk op te merken dat de naamruimte van de bucket wordt gedeeld door alle gebruikers van het systeem. Onze bucketnaam moet dus uniek zijn voor alle bestaande bucketnamen in Amazon S3 (we zullen zien hoe we dat in een ogenblik kunnen controleren).

Bovendien, zoals gespecificeerd in de officiële documentatie, moeten de bucketnamen voldoen aan de volgende vereisten:

  • namen mogen geen onderstrepingstekens bevatten
  • namen moeten tussen de 3 en 63 tekens lang zijn
  • namen mogen niet eindigen op een streepje
  • namen mogen geen aangrenzende punten bevatten
  • namen mogen geen streepjes naast punten bevatten (bijv. 'my-.bucket.com' en 'my.-bucket' zijn ongeldig)
  • namen mogen geen hoofdletters bevatten

Laten we een bucket maken:

String bucketName = "baeldung-bucket"; if (s3client.doesBucketExist (bucketName)) {LOG.info ("Bucketnaam is niet beschikbaar." + "Probeer het opnieuw met een andere bucketnaam."); terugkeren; } s3client.createBucket (bucketName);

Hier gebruiken we s3client die we in de vorige stap hebben gemaakt. Voordat we een bucket maken, controleren we met behulp van doesBucketExist () methode. Als deze naam beschikbaar is, gebruiken we de createBucket () methode.

5.2. Buckets weergeven

Nu we een paar buckets hebben gemaakt, laten we nu een lijst afdrukken van alle bucket's die beschikbaar zijn in onze S3-omgeving met behulp van de lijstBuckets () methode. Deze methode retourneert een lijst met alle buckets:

Lijst met buckets = s3client.listBuckets (); voor (Bucket bucket: buckets) {System.out.println (bucket.getName ()); }

Dit toont alle buckets die aanwezig zijn in onze S3-omgeving:

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

5.3. Een bucket verwijderen

Het is belangrijk om ervoor te zorgen dat onze bucket leeg is voordat we deze kunnen verwijderen. Anders wordt er een uitzondering gegenereerd. Houd er ook rekening mee dat alleen de eigenaar van een bucket deze kan verwijderen, ongeacht de machtigingen (toegangscontrolebeleid):

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

6. Amazon S3-objectbewerkingen

Een bestand of een verzameling gegevens in de Amazon S3-bucket staat bekend als een object. We kunnen verschillende bewerkingen uitvoeren op objecten, zoals uploaden, weergeven, downloaden, kopiëren, verplaatsen, hernoemen en verwijderen.

6.1. Objecten uploaden

Het uploaden van een object is een vrij eenvoudig proces. We gebruiken een putObject () methode die drie parameters accepteert:

  1. bucketName: De bucketnaam waarnaar we het object willen uploaden
  2. sleutel: Dit is het volledige pad naar het bestand
  3. het dossier: Het daadwerkelijke bestand met de gegevens die moeten worden geüpload
s3client.putObject (bucketName, "Document / hello.txt", nieuw bestand ("/ Users / user / Document / hello.txt"));

6.2. Objecten opsommen

We zullen gebruiken lijstObjects () methode om alle beschikbare objecten in onze S3-bucket weer te geven:

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

Roeping lijstObjects () methode van de s3client object zal de ObjectListing object, dat kan worden gebruikt om een ​​lijst op te halen van alle samenvattingen van objecten in de opgegeven bucket. We printen hier gewoon de sleutel, maar er zijn ook een aantal andere opties beschikbaar, zoals grootte, eigenaar, laatst gewijzigd, opslagklasse, enz ...

Hiermee wordt nu een lijst afgedrukt met alle objecten in onze bucket:

Document / hello.txt

6.3. Een object downloaden

Om een ​​object te downloaden, gebruiken we eerst de getObject () methode op s3client die een S3Object voorwerp. Zodra we dit hebben, bellen we getObjectContent () hierop om een S3ObjectInputStream object dat zich gedraagt ​​als een conventionele Java InputStream.

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

Hier gebruiken we FileUtils.copyInputStreamToFile () methode door Apache Commons. U kunt ook dit Baeldung-artikel bezoeken om andere manieren te ontdekken om een InputStream naar een Het dossier.

6.4. Een object kopiëren, hernoemen en verplaatsen

We kunnen een object kopiëren door te bellen copyObject () methode op onze s3client die vier parameters accepteert:

  1. naam van bronbucket
  2. objectsleutel in de bronbucket
  3. naam van bestemmingsbucket (deze kan hetzelfde zijn als de bron)
  4. objectsleutel in bestemmingsbucket
s3client.copyObject ("baeldung-bucket", "picture / pic.png", "baeldung-bucket2", "document / picture.png");

Let op: we kunnen een combinatie gebruiken van copyObject () methode deleteObject () voor het uitvoeren van verplaatsings- en hernoemtaken. Dit houdt in dat u eerst het object moet kopiëren en het vervolgens van de oude locatie moet verwijderen.

6.5. Een object verwijderen

Om een ​​object te verwijderen, bellen we deleteObject () methode op s3client en geef de bucketnaam en de objectsleutel door:

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

6.6. Meerdere objecten verwijderen

Om meerdere objecten tegelijk te verwijderen, maken we eerst de DeleteObjectsRequest object en geef de bucketnaam door aan de constructor. Vervolgens geven we een array door met alle objectsleutels die we willen verwijderen.

Zodra we dit hebben DeleteObjectsRequest object, kunnen we het doorgeven aan deleteObjects () methode van onze s3client als argument. Als dit lukt, worden alle objecten verwijderd die we hebben aangeleverd:

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

7. Conclusie

In dit artikel hebben we ons gericht op de basisprincipes van interactie met de Amazon S3-webservice - zowel op bucket- als objectniveau.

Zoals altijd is de volledige implementatie van deze tutorial te vinden op Github.