21.9.2022 |

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.

image

Anschließend kann die shaded .jar über den Button Upload hochgeladen werden.

image

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:

image

Ausführen des Tests liefert die Response:

image

Philipp
Zur Übersicht

Mehr vom DevSquad...

Sven Röttering

Place Multicursor on all selected text occurences in Intellij

Jonathan Zbick

Inline Funktionen Inline Aufrufen