AWS S3 mit Java

1. Einleitung

In diesem Tutorial erfahren Sie, wie Sie programmgesteuert von Java aus mit dem Speichersystem Amazon S3 (Simple Storage Service) interagieren.

Denken Sie daran, dass S3 eine sehr einfache Struktur hat - jeder Bucket kann eine beliebige Anzahl von Objekten speichern, auf die entweder über eine SOAP-Schnittstelle oder eine API im REST-Stil zugegriffen werden kann.

In Zukunft verwenden wir das AWS SDK für Java, um S3-Buckets zu erstellen, aufzulisten und zu löschen. Wir werden auch Objekte in diesen Buckets hochladen, auflisten, herunterladen, kopieren, verschieben, umbenennen und löschen.

2. Maven-Abhängigkeiten

Bevor wir beginnen, müssen wir die AWS SDK-Abhängigkeit in unserem Projekt deklarieren:

 com.amazonaws aws-java-sdk 1.11.163 

Überprüfen Sie Maven Central, um die neueste Version anzuzeigen.

3. Voraussetzungen

Um AWS SDK verwenden zu können, benötigen wir einige Dinge:

  1. AWS-Konto: Wir benötigen ein Amazon Web Services-Konto. Wenn Sie noch keine haben, erstellen Sie ein Konto
  2. AWS-Sicherheitsanmeldeinformationen: Dies sind unsere Zugriffsschlüssel, mit denen wir programmgesteuert AWS-API-Aktionen aufrufen können. Wir können diese Anmeldeinformationen auf zwei Arten abrufen, entweder mithilfe der Anmeldeinformationen des AWS-Stammkontos im Abschnitt "Zugriffsschlüssel" auf der Seite "Sicherheitsanmeldeinformationen" oder mithilfe der IAM-Benutzeranmeldeinformationen über die IAM-Konsole
  3. Auswählen der AWS-Region: Wir müssen eine oder mehrere AWS-Regionen auswählen, in denen unsere Amazon S3-Daten gespeichert werden sollen. Beachten Sie, dass die S3-Speicherpreise je nach Region variieren. Weitere Informationen finden Sie in der offiziellen Dokumentation. Für dieses Tutorial verwenden wir US East (Ohio) (Region us-east-2 ).

4. Client-Verbindung erstellen

Zunächst müssen wir eine Clientverbindung herstellen, um auf den Amazon S3-Webdienst zugreifen zu können. Wir werden die AmazonS3- Schnittstelle für diesen Zweck verwenden:

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

Und dann konfigurieren Sie den Client:

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

5. Amazon S3 Bucket-Vorgänge

5.1. Einen Eimer erstellen

Es ist wichtig zu beachten, dass der Bucket-Namespace von allen Benutzern des Systems gemeinsam genutzt wird. Daher muss unser Bucket-Name für alle in Amazon S3 vorhandenen Bucket-Namen eindeutig sein (wir werden gleich herausfinden, wie Sie dies überprüfen können).

Darüber hinaus müssen die Bucket-Namen, wie in der offiziellen Dokumentation angegeben, den folgenden Anforderungen entsprechen:

  • Namen sollten keine Unterstriche enthalten
  • Namen sollten zwischen 3 und 63 Zeichen lang sein
  • Namen sollten nicht mit einem Bindestrich enden
  • Namen dürfen keine benachbarten Punkte enthalten
  • Namen dürfen keine Bindestriche neben Punkten enthalten (z. B. "my-.bucket.com" und "my.-Bucket" sind ungültig).
  • Namen dürfen keine Großbuchstaben enthalten

Lassen Sie uns einen Eimer erstellen:

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);

Hier verwenden wir s3client , den wir im vorherigen Schritt erstellt haben. Bevor wir einen Bucket erstellen, überprüfen wir mithilfe der Methode doesBucketExist () , ob unser Bucket-Name verfügbar ist oder nicht . Wenn dieser Name verfügbar ist, verwenden wir die Methode createBucket () .

5.2. Listing Buckets

Nachdem wir einige Buckets erstellt haben, drucken wir jetzt eine Liste aller in unserer S3-Umgebung verfügbaren Buckets mit der Methode listBuckets () . Diese Methode gibt eine Liste aller Buckets zurück:

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

Dadurch werden alle Buckets aufgelistet, die in unserer S3-Umgebung vorhanden sind:

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

5.3. Einen Bucket löschen

Es ist wichtig sicherzustellen, dass unser Eimer leer ist, bevor wir ihn löschen können. Andernfalls wird eine Ausnahme ausgelöst. Beachten Sie außerdem, dass nur der Eigentümer eines Buckets ihn unabhängig von seinen Berechtigungen löschen kann (Zugriffssteuerungsrichtlinien):

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

6. Amazon S3-Objektoperationen

Eine Datei oder eine Sammlung von Daten im Amazon S3-Bucket wird als Objekt bezeichnet. Wir können verschiedene Vorgänge für Objekte ausführen, z. B. Hochladen, Auflisten, Herunterladen, Kopieren, Verschieben, Umbenennen und Löschen.

6.1. Objekte hochladen

Das Hochladen eines Objekts ist ein ziemlich unkomplizierter Vorgang. Wir werden eine putObject () -Methode verwenden, die drei Parameter akzeptiert:

  1. BucketName : Der Bucket-Name, in den das Objekt hochgeladen werden soll
  2. Schlüssel : Dies ist der vollständige Pfad zur Datei
  3. file: The actual file containing the data to be uploaded
s3client.putObject( bucketName, "Document/hello.txt", new File("/Users/user/Document/hello.txt") );

6.2. Listing Objects

We'll use listObjects() method to list all the available objects in our S3 bucket:

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

Calling listObjects() method of the s3client object will yield the ObjectListing object, which can be used to get a list of all the object summaries in the specified bucket. We're just printing the key here, but there are also a couple of other options available, like size, owner, last modified, storage class, etc…

This will now print a list of all the objects inside our bucket:

Document/hello.txt

6.3. Downloading an Object

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.

Sobald wir dieses DeleteObjectsRequest- Objekt haben, können wir es als Argument an die deleteObjects () -Methode unseres s3client übergeben . Wenn dies erfolgreich ist, werden alle von uns angegebenen Objekte gelöscht:

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

7. Fazit

In diesem Artikel haben wir uns auf die Grundlagen der Interaktion mit dem Amazon S3-Webdienst konzentriert - sowohl auf Bucket- als auch auf Objektebene.

Wie immer finden Sie die vollständige Implementierung dieses Tutorials auf Github.