Suchen

AWS-Ressourcen mit Java erstellen und verwalten, Teil 2 Zugriff auf Amazon S3 per AWS SDK for Java

| Autor / Redakteur: Dipl. -Ing. Thomas Drilling / Stephan Augsten

Amazon S3 ist der älteste und wohl populärste AWS-Dienst. Dieser lässt sich über das AWS SDK for Java auch programmatisch ansteuern. Dieser Teil unseres Workshops zeigt, wie man mit dem AWS-Java-SDK-Sample auf S3 zugreift.

Firmen zum Thema

Ein Beispielprojekt ist im Eclipse-Workspace schnell erstellt.
Ein Beispielprojekt ist im Eclipse-Workspace schnell erstellt.
(Bild: Drilling / Eclipse)

Ein Beispielprojekt ist im Eclipse-Workspace schnell erstellt.
Ein Beispielprojekt ist im Eclipse-Workspace schnell erstellt.
(Bild: Drilling / Eclipse)

Nachdem wir im ersten Teil die Eclipse-IDE unter AWS konfiguriert haben wollen wir nun AWS-Ressourcen aus Java-Code bereitstellt. Dazu erstellen wir zunächst über den Menüpunkt „File / New / AWS Java Project“ ein neues AWS-Java-Project. Optional ermöglicht die Java-AWS-SDK-Integration auch das Erstellen von „AWS Lambda Java Projects“, „AWS Serverless Java Projects“ oder „AWS Java Web Projects“.

Wir beginnen mit dem Amazon S3 Sample, das den Zugriff auf S3-Buckets und -Objekte demonstriert.
Wir beginnen mit dem Amazon S3 Sample, das den Zugriff auf S3-Buckets und -Objekte demonstriert.
(Bild: Drilling / Eclipse)

Hier vergeben wir zunächst den „Project name“; die zugehörigen Meta-Daten (Group ID, Artifact ID, Version und Package name) werden automatisch ausgefüllt. Ferner können an dieser Stelle – sofern noch nicht vorab oder im Rahmen der Eclipse-Konfiguration geschehen – noch einmal die AWS-Credentials in Form der Angabe der zu verwendenden API-Keys konfigurieren.

Anschließend setzten wie zunächst nur das Häkchen bei „Amazon S3 Sample“, damit uns Eclipse einen Beispiel-Code für die S3-API zur Verfügung stellt. Wir beginnen mit S3, weil dies der älteste und populärste AWS-Dienst ist – und um eine gewisse Vergleichbarkeit mit unserem Artikel zum AWS-Python-SDK „Boto 3“ zu gewährleisten.

Unser Beispiel-Projekt importiert die angegeben benötigten Klassen.
Unser Beispiel-Projekt importiert die angegeben benötigten Klassen.
(Bild: Drilling / Eclipse)

Nun öffnen wir im Ordner des zugehörigen Projektes den Beispiel-Quell-Code im Knoten „<Projektname> / „src/main/java“ / „com.amazonaws.samples“ / S3Sample.java“. Analog zu unserem Python-Beispiel finden können wir zunächst verfolgen, wie das S3-Client-Objekt in Java bereitgestellt wird, was voraussetzt, dass das Beispiel-Projekt die angegeben Klassen importiert, darunter auch den AmazonS3ClientBuilder.

Das Erstellen eines S3-Client kann dann z. B. allgemein so erfolgen:

AmazonS3 s3 = AmazonS3ClientBuilder.standard()
     .withCredentials(new AWSStaticCredentialsProvider(credentials))
     .withRegion("us-west-2")
     .build();

Schauen wie uns jetzt an, wie ein neues S3-Bucket erstellt wird:

System.out.println("Creating bucket " + bucketName + "\n");
     s3.createBucket(bucketName);

Der Beispiel-Code setzt den Ziel-Bucket-Namen mit folgender Variable:

String bucketName = "my-first-s3-bucket-" + UUID.randomUUID();
     String key = "MyObjectKey";

Anschließend listen wir sämtliche vorhandenen Buckets auf:

System.out.println("Creating bucket " + bucketName + "\n");
     s3.createBucket(bucketName);
     /*
     * List the buckets in your account
     */
     System.out.println("Listing buckets");
     for (Bucket bucket : s3.listBuckets()) {
          System.out.println(" - " + bucket.getName());
     }
     System.out.println();

Das Erstellen von Buckets und die bestehenden Speicherorte sind über die Java-Konsole einsehbar.
Das Erstellen von Buckets und die bestehenden Speicherorte sind über die Java-Konsole einsehbar.
(Bild: Drilling / Eclipse)

Die Ausgabe lässt sich in der Java-Console verfolgen. Lassen wir den gesamten Sample-Code durchlaufen, werden wir die erstellten Ressourcen nicht in der S3-Console sehen, da der Code das testweise bereitgestellte Bucket am Ende wieder löscht. Wer mag, kann aber Breakpoints setzten und den Code schrittweise debuggen.

Auch das Hochladen eines neuen Objektes in S3 ist nicht schwer:

System.out.println("Uploading a new object to S3 from a file\n");
     s3.putObject(new PutObjectRequest(bucketName, key, createSampleFile()));

Das Beispiel-Objekt, ein einfaches Textfile, erzeugen wir gleich an Ort und Stelle mit der Funktion „createSampleFile“.

private static File createSampleFile() throws IOException {
     File file = File.createTempFile("aws-java-sdk-", ".txt");
     file.deleteOnExit();
     Writer writer = new OutputStreamWriter(new FileOutputStream(file));
     writer.write("abcdefghijklmnopqrstuvwxyz\n");
     writer.write("01234567890112345678901234\n");
     writer.write("!@#$%^&*()-=[]{};':',.<>/?\n");
     writer.write("01234567890112345678901234\n");
     writer.write("abcdefghijklmnopqrstuvwxyz\n");
     writer.close();
     return file;
}

Im Beispiel-Code laden wir die Beispiel-Datei direkt nach dem Upload wieder herunter …

System.out.println("Downloading an object");
     S3Object object = s3.getObject(new GetObjectRequest(bucketName, key));
     System.out.println("Content-Type: " + object.getObjectMetadata().getContentType());
     displayTextInputStream(object.getObjectContent());

… und geben dann auch den Datei-Inhalt direkt nach dem Download als Input-Stream wieder aus:

private static void displayTextInputStream(InputStream input) throws IOException {
     BufferedReader reader = new BufferedReader(new InputStreamReader(input));
     while (true) {
          String line = reader.readLine();
          if (line == null) break;
          System.out.println(" " + line);
     }
     System.out.println();
}

Zum Ende des Beispielcodes wird zuerst die Beispiel-Datei mittels …

System.out.println("Deleting an object\n");
     s3.deleteObject(bucketName, key);

Am Ende unseres Beispiels wird der S3-Bucket wieder gelöscht.
Am Ende unseres Beispiels wird der S3-Bucket wieder gelöscht.
(Bild: Drilling / Eclipse)

… und danach das Test-Bucket mit …

System.out.println("Deleting bucket " + bucketName + "\n");
     s3.deleteBucket(bucketName);

wieder gelöscht.

(ID:45710720)

Über den Autor

Dipl. -Ing. Thomas Drilling

Dipl. -Ing. Thomas Drilling

IT-Consultant, Trainer, Freier Journalist