Wolkenkuckucksheim

Nachdem ich den Titel Wolkenkuckucksheim des Beitrags niedergeschrieben hatte, musste ich doch erst einmal prüfen, ob auch alle den Begriff kennen können. Glücklicherweise ist es eine Lehnübersetzung zum altgriechischen Νεφελοκοκκυγία aus einer Komödie von Arithophanes

Dieser Beitrag soll aber nicht von alten Griechen oder Komödien handeln, sondern von einer ganz besonderen Stadt in den Wolken, der Cloud. Anbieter wie  Google, Amazon oder Microsoft stellen eine Vielzahl von Diensten bereit, von einfachen Speichern, Datenbanken, Rechnerinstanzen, bis hin zu KI Lösungen zum Machine Learning, Datenanalyse und Texterkennung. 

Die Verwendung von Cloud Diensten in eigenen Anwendungen ist sehr einfach, man benötigt nur ein Konto bei den Cloud Anbietern der Wahl. Dann kann man die ersten Schritte über die Weboberfläche der Dienste ausführen und später die Dienste produktiv über APIs bzw. Rest Schnittstellen nutzen.

Warum sollte man bestrebt sein etwas in der Cloud zu unternehmen, dass man auch mit den Füßen auf soliden Boden erreichen kann?

Zum einen ist es der sehr attraktive Preis, so sind es je nach Anbieter 2-3 Cent für einen GB Speicher in der Cloud, auf den sie jederzeit von überall Zugriff haben, ausfallsicher, mehrfach gespiegelt in unterschiedlichen  Regionen, auf Wunsch verschlüsselt oder regional begrenzt. Für Langzeitarchivierung mit seltenen Zugriffen liegen die Preise bei etwa einem Cent pro GB.  Ähnlich attraktive Preismodelle gibt es für Rechner und Datenbanken, die ähnlich wie der Speicher in der Cloud auf Wunsch beliebig herauf- und herunterskaliert werden kann. Benötigen sie einen Server nur zu den Büroöffnungszeiten? Dann nutzen sie eine Cloud-Instanz, die für 10 Stunden am Tag verfügbar ist. Warum für einen Rechner bezahlen, der den halben Tag im Leerlauf dahinvegetiert? 

Wir alle haben wohl ein externe Festplatte daheim, auf der wir alle möglichen Dinge archivieren, Fotos, Musik, eingescannte Dokumente, Liebesbriefe und was sonst so früher in der Schachtel unter Bett versteckt wurde. Seitdem wir unsere Haushalte zusammengeführt haben besitzen wir sogar zwei Festplatten. Warum nicht einmal aufräumen und die Sachen in der Cloud speichern? Der folgende Code verwendet die Amazon ASW S3 Speicherlösung und die dazugehörige Java Bibliothek. Der Code für die Google Cloud und für Microsoft Azure sieht recht ähnlich aus, da nicht nur die Speicherlösungen recht ähnlich ausschauen, sondern auch die Bezeichnungen fast identisch sind. 

 Zuerst benötigen wir ein Client, über den die Kommunikation mit der Cloud erfolgt.

public S3Client getClient(String accessKey, String secretKey) {
  StaticCredentialsProvider credentials = StaticCredentialsProvider.create(AwsBasicCredentials.create(accessKey, secretKey));
  return S3Client.builder().region(EU_CENTRAL_1).credentialsProvider(credentials).build();
}

Die beiden Parameter accesskey und secretKey sind die Anmeldedaten, mit denen auf die Cloud zugegriffen werden kann. Diese beiden sollten gut aufbewahrt werden. Was nutzten die Familienfotos im Safe, wenn man den Schlüssel weggeworfen hat? 

Als nächstes benötigen wir einen Bucket für unsere Familienfotos. Ein Bucket, oder Container bei Azure,  ist ein Ordner in dem in der Cloud Daten gespeichert werden können. Mit createBucket(“fotos-kreta-2019”) und dem folgenden Code erzeugen wir einen Bucket für die diesjährigen Urlaubsfotos. Bei den Namenskonventionen muss man ein wenig aufpassen, am besten bleibt man bei Zeichenketten aus Zahlen, Buchstaben und dem Bindestrich.  

public void createBucket(String name) {
    CreateBucketRequest createBucketRequest = CreateBucketRequest.builder()
      .bucket(name).createBucketConfiguration(
        CreateBucketConfiguration.builder().locationConstraint(EU_CENTRAL_1.id()).build()).build();
         client.createBucket(createBucketRequest);
}

Wenn man schauen möchte, ob der Bucket vielleicht schon existiert, holt man die Liste der existierenden Buckets und schaut ob der Gesuchte darunter ist.

private boolean exists(String name) {
  ListBucketsRequest listBucketsRequest = ListBucketsRequest.builder().build();
  return client.listBuckets(listBucketsRequest).buckets().stream().anyMatch(x -> x.name().equals(name));
}

Jetzt müssen wir nur noch unsere Urlaubsbilder hochladen

Files.newDirectoryStream(fotoFolder, path -> path.getFilename().toString().endsWith(".jpg"))
  .forEach(foto -> {
    client.putObject(PutObjectRequest.builder().bucket("fotos-kreta-2019").key(foto.getFileName()).build(), 
    RequestBody.fromFile(foto);
  });

Die Bilder bekommt ähnlich einfach auch wieder heraus aus der Cloud. Das jetzt zu zeigen wäre, um Aristophanes noch ein letztes Mal zu bemühen, wie Eulen nach Athen zu tragen.