Java Spring Cloud Functions mit AWS Lambda
Zusammenfassung
Bedarfbasierte Anwendungen können effizient unter einer serverless Architektur aufgesetzt werden. Unter AWS lässt sich diese Form des Webhostings mit AWS Lambda umsetzten. Lambda führt den typischerweise in einer Skriptsprache geschriebenen Code aus und übernimmt die gesamte Verwaltung aller serverseitigen Aufgaben und stellt Ressourcen effizient nur dann zur Verfügung, wenn sie durch eine Anfrage an Lambda wirklich benötigt werden. Neben Python und Node.js lassen sich aber auch Java-Laufzeiten bis einschließlich Version 11 konfigurieren.
Im konkreten Anwendungsfall wurde ein Lambda für die monatliche Sprintauswertung durch die Jira-Moco-Report-API erstellt, um die ständig laufende Version der App abzulösen. Hierzu wurde eine durch Lambda aufrufbare Funktion in Spring Cloud umgesetzt.
Benötigt
Um die Spring Boot App im AWS Lambda aufzurufen, die folgenden Dependencys benötigt.
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.2.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-function-adapter-aws</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-events</artifactId>
<version>${3.1.0}</version>
</dependency>
</dependencies>
Sowie das folgende maven Plugin, um eine shaded .jar zu erstellen und die Auto-Configuration von Spring-Boot zu erhalten.
Maven Plugin inklusive Spring Boot Auto-Konfiguration
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<configuration>
<source>11</source>
<target>11</target>
</configuration>
<dependencies>
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm</artifactId>
<version>6.2</version> <!-- Use newer version of ASM -->
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
</configuration>
<dependencies>
<dependency>
<groupId>org.springframework.boot.experimental</groupId>
<artifactId>spring-boot-thin-layout</artifactId>
<version>${wrapper.version}</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.7.1</version>
</dependency>
</dependencies>
<executions>
<execution>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
<shadedArtifactAttached>true</shadedArtifactAttached>
<shadedClassifierName>aws</shadedClassifierName>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.handlers</resource>
</transformer>
<transformer implementation="org.springframework.boot.maven.PropertiesMergingResourceTransformer">
<resource>META-INF/spring.factories</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.schemas</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.components</resource>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
Beispiel
Spring Cloud Function implementieren
Um eine Spring Cloud Function zu erstellen, muss die Spring Boot App lediglich mithilfe einer Klasse das Java Function Interface implementieren und die Methode apply bereitstellen.
public class InputFunction implements Function<String, String> {
@Override
public String apply(String s) {
return "Your Input was: " + s;
}
}
.jar Erzeugen
Die .jar wird durch ausführen des Befehls mvn clean package shade:shade
erzeugt.
AWS Lambda Function erstellen
Unter link lässt sich eine AWS Lambda Funktion mit Java Version 11 erstellen.
Anschließend kann die shaded .jar über den Button Upload hochgeladen werden.
Nun muss nur noch die Runtime settings angepasst werden. Dazu wird folgendes als Handler definiert:
org.springframework.cloud.function.adapter.aws.FunctionInvoker::handleRequest
AWS Lambda Function testen
Über den Tab Test kann durch anlegen eines Testanfrage die Function getestet werden:
Ausführen des Tests liefert die Response:
Standort Hannover
newcubator GmbH
Bödekerstraße 22
30161 Hannover
Standort Dortmund
newcubator GmbH
Westenhellweg 85-89
44137 Dortmund