Diese Website nutzt Cookies, um bestmögliche Funktionalität bieten zu können. Weitere Informationen siehe Datenschutzerklärung.

AWS Lambda mit Java

AWS Lambda mit Java

Mit AWS-Lambda können Sie schnell und unkompliziert kleinere Services in die AWS-Cloud bringen, ohne sich um eine Server-Installation kümmern zu müssen. Bezahlen müssen Sie nur für die Nutzung – und die erste Million Requests ist sogar umsonst!

Bausteine

Auch die Entwicklung ist denkbar unkompliziert und überdies noch mit mehreren Sprachen möglich, darunter eben auch Java. Im folgenden wollen wir kurz skizzieren, welche Bausteine notwendig sind, um mit Java einen Lambda-Service zu entwickeln.

  • Baustein 1: Maven
  • Baustein 2: Das Maven-Shade-Plugin
  • Baustein 3: Die Amazon-Lambda-Bibliotheken

Maven-Shade-Plugin

Werfen wir zunächst einen Blick auf den zweiten Baustein, das Maven-Shade-Plugin. Mittlerweile ist man es ja aus der Microservice-Welt gewohnt, daß Anwendungen in hochkonzentrierter Form in einer einzigen Datei ausgeliefert werden, so wie etwa bei SpringBoot oder Wildfly Thorntail. Gerade im Container-Umfeld liegt der Vorteil auf der Hand: Es muß nicht mehr eine komplexe Laufzeitumgebung mit gegebenfalls tausenden von Einzeldateien ausgepackt werden und Konfigurationsdateien modifiziert werden, sondern lediglich das lauffähige Jar gestartet werden. Eventuelle notwendige Anpassungen für die jeweilige Umgebung können beispielsweise über Kommandozeilenparameter oder Environment-Variablen vorgenommen werden.

Doch zurück zum Maven-Shade-Plugin: dieses bastelt uns aus den Projekt-Abhängigkeiten eine ausführbare Jar-Datei. In der Regel ist keine weitere Konfiguration des Plugins notwendig, es wird einfach in den Build-Prozess eingehängt:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.3</version>
            <configuration>
                <createDependencyReducedPom>false</createDependencyReducedPom>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Amazon-Lambda-Bibliotheken

Der dritte Baustein wird über ein Maven-Repository bereitgestellt und besteht in der einfachsten Version aus einer einzigen Dependency:

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-lambda-java-core</artifactId>
    <version>1.2.0</version>
</dependency>

Möchte man innerhalb seines Lambda-Services auf andere AWS-Services zugreifen, dann können natürlich noch weitere Dependencies dazukommen.

Implementierung

Und wie sieht jetzt die Implementierung eines Lambda-Services aus? Denkbar einfach:

package de.softceed;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

public class HelloWorldLambda implements RequestHandler<Object, String> {

    @Override
    public String handleRequest(Object input, Context context) {
        context.getLogger().log("Inputobjekt: " + input);

        return "Mein erster Lambda-Service";
    }
}

Diese Methode stellt den Einsprungpunkt in unseren Lambda-Service dar. Über das Context-Objekt, das uns die Lambda-Runtime bereitstellt, kann man auf einen einfachen Logger zugreifen und den Inhalt des Input-Objekts rausschreiben.

Deployment

Baut man das Projekt, so erhält man mit ca. 11 KB ein kleines, kompaktes Jar-File, das wir jetzt über die AWS-Webkonsole hochladen wollen. Dazu legt man einen neuen Lambda-Service an – das geht über den Button “Funktion erstellen”. Der anzugebende Funktionsname ist beliebig, als Laufzeit wählen wir hingegen “Java 8”. Zudem wählen wir, daß AWS eine Ausführungsrolle erstellen soll. Falls unser Lambda-Service später einmal von anderen Services Gebrauch machen soll, dann benötigen wir hier natürlich eine entsprechend konfigurierte Ausführungsrolle.

Jetzt sind wir fast fertig:

  • über den Button “Funktionspaket hochladen” können wir unser mit Maven gebautes Jar-File hochladen
  • im Eingabefeld “Handler” geben wir noch den Einsprungpunkt für unseren Lambda-Service an, nämlich de.softceed.HelloWorldLambda::handleRequest

Schon ist der erste Lambda-Service fertig!

Test

Über den Button “Test” kann man – nach Definition eines Testereignisses (das kann ein beliebiger JSON-String sein) – den Lambda-Service aufrufen.

Hat man alles richtig konfiguriert, dann sieht man oben auf der Seite den Ergebnisstring “Mein erster Lambda-Service”. Über die verlinkte CloudWatch-Log-Gruppe kann man sich auch die Logger-Ausgabe sowie Informationen zum Speicherverbrauch und zur berechneten Serverzeit anzeigen lassen.

Fazit

Mit diesem kleinen Projekt sind die Voraussetzungen geschaffen, um den Lambda-Service gezielt über andere Events (z. B. das Hochladen einer Datei in einen S3-Bucket) aufrufen zu lassen. Auch andere AWS-Services lassen sich jederzeit in den Lambda-Service integrieren, wobei natürlich sichergestellt werden muß, daß der Service über die notwendigen Berechtigungen zum Zugriff auf andere Services verfügt.

Damit sind wir am Ende unserer kleinen Lambda-Einführung angelangt. Nähere Details zum Preismodell von AWS-Lambda finden sich unter https://aws.amazon.com/de/lambda/pricing/.

Links

Projektsourcen auf GitHub – Softceed GmbH


Autor

Ähnliche Beiträge