[JAVA] Erstellen Sie AWS Lambda mit Quarkus

Quarkus (https://quarkus.io/) ist "SUPER SONIC SUBATOMIC JAVA"

A Kubernetes Native Java stack tailored for OpenJDK HotSpot and GraalVM, crafted from the best of breed Java libraries and standards.

Korrekt. Ich weiß nicht, was du sagst, aber es sieht gut aus.

Da es möglich ist, Java-Programme nativ mit der Funktion von GraalVM zu konvertieren, kann es mit der benutzerdefinierten Laufzeit von AWS Lambda kombiniert werden, um das ** Kaltstartproblem ** zu lösen, das für Java-Anwendungen charakteristisch ist, die auf AWS Lambda ausgeführt werden. Sie können es erwarten.

Ich habe es gemäß dem Verfahren auf der offiziellen Website versucht, daher werde ich das Verfahren verlassen.

QUARKUS - BUILDING A NATIVE EXECUTABLE https://quarkus.io/guides/building-native-image

QUARKUS - AMAZON LAMBDA https://quarkus.io/guides/amazon-lambda

Umgebung

Vorgehensweise zum Bereitstellen der Vorlagen-App

Schritt 1. Amazon Linux 2-Einstellungen

Amazon Linux 2 von Docker Image kann nicht "tar" oder "entpacken", daher werde ich verschiedene Dinge setzen. Ich weiß nicht, ob ich alle brauche, aber ich habe so viel investiert.

yum install -y sudo shadow-utils procps tar.x86_64 gzip xz unzip witch git python3 tree

Schritt 2. Installieren Sie GraalVM

Laden Sie es von der offiziellen Website herunter und erweitern Sie es.

curl -s -L -o /tmp/graalvm-ce-java11-linux-amd64-20.1.0.tar.gz https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-20.1.0/graalvm-ce-java11-linux-amd64-20.1.0.tar.gz
tar zxf /tmp/graalvm-ce-java11-linux-amd64-20.1.0.tar.gz -C /opt/
ln -s /opt/graalvm-ce-java11-20.1.0 /opt/graalvm

Setzen Sie JAVA_HOME auf GraalVM und verwenden Sie GraalVM, um Maven zu erstellen.

export GRAALVM_HOME=/opt/graalvm
export JAVA_HOME=$GRAALVM_HOME
export PATH=$GRAALVM_HOME/bin:$PATH

Installieren Sie abschließend das für Native Build erforderliche "native-image". Der Befehl lautet gu (Graal VM Updater).

gu install native-image

Schritt 3. Installieren Sie Maven

Der Maven, mit dem Quarkus erstellt wurde, benötigt eine Version von 3.6.2 oder höher. Die Version, die mit yum installiert werden kann, war alt, also habe ich sie von der offiziellen Website heruntergeladen und installiert.

curl -s -L -o /tmp/apache-maven-3.6.3-bin.tar.gz https://downloads.apache.org/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
tar zxf /tmp/apache-maven-3.6.3-bin.tar.gz -C /opt/
ln -s /opt/apache-maven-3.6.3 /opt/apache-maven

Überprüfen Sie die Version von Maven

bash-4.2# mvn --version
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /opt/apache-maven
Java version: 11.0.7, vendor: GraalVM Community, runtime: /opt/graalvm-ce-java11-20.1.0
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "4.19.76-linuxkit", arch: "amd64", family: "unix"
bash-4.2# 

Sie können sehen, dass es auf der GraalVM-JVM ausgeführt wird.

Schritt 4. Erstellen Sie ein Projekt mit Maven

Erstellen Sie ein Projekt mit dem Befehl mvn.

mvn archetype:generate \
    -DarchetypeGroupId=io.quarkus \
    -DarchetypeArtifactId=quarkus-amazon-lambda-archetype \
    -DarchetypeVersion=1.6.0.Final

Nach einer Weile wird Ihnen an der Eingabeaufforderung eine Frage gestellt. Beantworten Sie sie daher. Der in [] eingeschlossene Teil ist die Benutzereingabe.

Define value for property 'groupId': [myGroup]
Define value for property 'artifactId': [myArtifact]
Define value for property 'version' 1.0-SNAPSHOT: : []
Define value for property 'package' myGroup: : [example]
Confirm properties configuration:
groupId: myGroup
artifactId: myArtifact
version: 1.0-SNAPSHOT
package: example
 Y: : [Y]

Ein Verzeichnis wird mit arifactId (myArtifact) erstellt und ein Projekt generiert.

Die Projektstruktur unmittelbar nach der Erstellung sieht folgendermaßen aus.

bash-4.2# tree myArtifact/
myArtifact/
├── build.gradle
├── gradle.properties
├── payload.json
├── pom.xml
├── settings.gradle
└── src
    ├── main
    │   ├── java
    │   │   └── example
    │   │       ├── InputObject.java
    │   │       ├── OutputObject.java
    │   │       ├── ProcessingService.java
    │   │       ├── StreamLambda.java
    │   │       ├── TestLambda.java
    │   │       └── UnusedLambda.java
    │   └── resources
    │       └── application.properties
    └── test
        ├── java
        │   └── example
        │       └── LambdaHandlerTest.java
        └── resources
            └── application.properties

9 directories, 14 files
bash-4.2# 

Schritt 5. Richten Sie den Handler so ein, dass er mit Lambda beginnt

Der von Lambda aufgerufene Handler wird in "quarkus.lambda.handler" von "resources / application.properties" festgelegt.

resources/application.properties


quarkus.lambda.handler=test

Mit den obigen Einstellungen wird die unten stehende Klasse "test" aufgerufen.

java:main/java/example.TestLambda.java


@Named("test")
public class TestLambda implements RequestHandler<InputObject, OutputObject> {
}

Der Rest ist wie normales Lambda codiert. Neben "test" ist "stream" auch als Vorlage verfügbar.

Schritt 6. Erstellen Sie ein Bereitstellungspaket

Erstellen wir ein Bereitstellungspaket mit der Vorlage, wie sie ist.

mvn clean package -Pnative

Es benötigt viel Zeit. Ich denke, es wird mehr als 10 Minuten dauern.

Schritt 7. Überprüfen Sie den Inhalt des Bereitstellungspakets

Sobald das Bereitstellungspaket erfolgreich erstellt wurde, wird target / function.zip generiert. Als ich versuchte, es zu erweitern, war der Inhalt nur "Bootstrap".

bash-4.2# unzip function.zip 
Archive:  function.zip
  inflating: bootstrap               
bash-4.2# 

Schritt 8. Stellen Sie Lambda bereit

Eine Datei mit dem Namen "manage.sh" wird auch im "Ziel" -Verzeichnis generiert, und Sie können sie anscheinend von hier aus auf AWS bereitstellen. Ich war neu in benutzerdefinierten Laufzeiten, also habe ich es über die Verwaltungskonsole versucht. Nach dem Erstellen des Bereitstellungspakets wird auch eine Datei mit dem Namen "target / sam.native.yaml" generiert, auf die ich für den Handlernamen und die Umgebungsvariablen verwiesen habe.

Erstellen Sie eine neue Funktion. Angenommen, die Laufzeit stellt "Ihren eigenen Bootstrap bereit".

ap-northeast-1.console.aws.amazon.com_lambda_home_region=ap-northeast-1(Laptop with MDPI screen).png

Laden Sie nach dem Erstellen der Funktion das Programm hoch. Wählen Sie im Funktionscode "ZIP-Datei hochladen" aus "Aktion" und wählen Sie "Funktion.zip".

ap-northeast-1.console.aws.amazon.com_lambda_home_region=ap-northeast-1(Laptop with MDPI screen) (1).png

Der Handler wird in der bereitgestellten Laufzeit nicht verwendet.

ap-northeast-1.console.aws.amazon.com_lambda_home_region=ap-northeast-1(Laptop with MDPI screen) (2).png

Fügen Sie der Umgebungsvariablen "DISABLE_SIGNAL_HANDLERS" hinzu und setzen Sie den Wert auf "true".

ap-northeast-1.console.aws.amazon.com_lambda_home_region=ap-northeast-1(Laptop with MDPI screen) (4).png

Die Einstellung ist bis zu diesem Punkt abgeschlossen. Lassen Sie uns den Test mit dem folgenden JSON als Eingabe testen.

ap-northeast-1.console.aws.amazon.com_lambda_home_region=ap-northeast-1(Laptop with MDPI screen) (3).png

{
  "name": "Bill",
  "greeting": "hello"
}

Hier ist das Operationsergebnis. Es hat sicher funktioniert.

ap-northeast-1.console.aws.amazon.com_lambda_home_region=ap-northeast-1(Laptop with MDPI screen) (5).png

AWS SDK hinzugefügt

Um das AWS SDK verwenden zu können, müssen Sie einige Einstellungen vornehmen und nicht nur pom.xml hinzufügen.

Schritt 1. Aktivieren Sie die SSL-Kommunikation

Fügen Sie Folgendes zu resources / application.properties hinzu. (Obwohl es scheint, dass das offizielle Dokument besagt, dass es standardmäßig gültig ist)

resources/application.properties


quarkus.ssl.native=true

Schritt 2. Abhängigkeit hinzufügen

Zuerst brauchen wir "Quarkus-Jaxb", also werden wir es hinzufügen.

pom.xml


<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-jaxb</artifactId>
</dependency>

Als Nächstes werde ich die AWS SDK-Bibliothek hinzufügen.

For native image, however the URL Connection client must be preferred over the Apache HTTP Client when using synchronous mode, due to issues in the GraalVM compilation (at present).

Wenn übersetzt `Bei nativen Images sollte der URL-Verbindungsclient jedoch aufgrund eines GrailVM-Kompilierungsproblems (derzeit) Vorrang vor dem Apache-HTTP-Client haben, wenn der synchrone Modus verwendet wird. `` Korrekt. Daher lautet die Beschreibung wie folgt.

pom.xml


<properties>
      <aws.sdk2.version>2.10.69</aws.sdk2.version>
  </properties>

  <dependencyManagement>
      <dependencies>

          <dependency>
              <groupId>software.amazon.awssdk</groupId>
              <artifactId>bom</artifactId>
              <version>${aws.sdk2.version}</version>
              <type>pom</type>
              <scope>import</scope>
          </dependency>

      </dependencies>
  </dependencyManagement>
  <dependencies>

      <dependency>
          <groupId>software.amazon.awssdk</groupId>
          <artifactId>url-connection-client</artifactId>
      </dependency>

      <dependency>
          <groupId>software.amazon.awssdk</groupId>
          <artifactId>apache-client</artifactId>
          <exclusions>
              <exclusion>
                  <groupId>commons-logging</groupId>
                  <artifactId>commons-logging</artifactId>
              </exclusion>
          </exclusions>
      </dependency>

      <dependency>
          <groupId>software.amazon.awssdk</groupId>
          <artifactId>s3</artifactId>
          <exclusions>
              <!-- exclude the apache-client and netty client -->
              <exclusion>
                  <groupId>software.amazon.awssdk</groupId>
                  <artifactId>apache-client</artifactId>
              </exclusion>
              <exclusion>
                  <groupId>software.amazon.awssdk</groupId>
                  <artifactId>netty-nio-client</artifactId>
              </exclusion>
              <exclusion>
                  <groupId>commons-logging</groupId>
                  <artifactId>commons-logging</artifactId>
              </exclusion>
          </exclusions>
      </dependency>

      <dependency>
          <groupId>org.jboss.logging</groupId>
          <artifactId>commons-logging-jboss-logging</artifactId>
          <version>1.0.0.Final</version>
      </dependency>
  </dependencies>

Schritt 3. Schreiben Sie Java-Code

Geben Sie in diesem Beispiel für den Zugriff auf S3 beim Erstellen von S3Client explizit "UrlConnectionHttpClient" in "httpClient" an.

S3Client s3 = S3Client.builder()
  .region(Region.AP_NORTHEAST_1)
 
 .httpClient(software.amazon.awssdk.http.urlconnection.UrlConnectionHttpClient.builder().build())
  .build();

Schritt 4. Für die SSL-Kommunikation erforderliche Einstellungen

Das Bereitstellungspaket muss für die SSL-Kommunikation Folgendes enthalten:

Erstellen Sie zuerst das Verzeichnis "src / main / zip.native /" und erstellen Sie den "Bootstrap".

zip.native/bootstrap


#!/usr/bin/env bash

./runner -Djava.library.path=./ -Djavax.net.ssl.trustStore=./cacerts

Dann kopiere libsunec.so und cacerts. Diese beiden Dateien sind in GraalVM enthalten.

cp $GRAALVM_HOME/lib/libsunec.so $PROJECT_DIR/src/main/zip.native/
cp $GRAALVM_HOME/lib/security/cacerts $PROJECT_DIR/src/main/zip.native/

Schritt 5. Erstellen Sie ein Bereitstellungspaket

Das Verfahren zum Erstellen eines Bereitstellungspakets bleibt unverändert.

mvn clean package -Pnative

Schritt 6. Überprüfen Sie den Inhalt des Bereitstellungspakets

Wenn Sie ein Bereitstellungspaket mit aktiviertem SSL erstellen, ändert sich der Inhalt von target / function.zip.

bash-4.2# unzip function.zip 
Archive:  function.zip
  inflating: bootstrap               
  inflating: cacerts                 
  inflating: libsunec.so             
  inflating: runner                  
bash-4.2# 

Sie können sehen, dass der vorbereitete bootstrap``cacerts``libsunec.so enthalten ist.

Am Ende

Überprüfen Sie hier, ob die Ergebnisse des Kaltstarts schneller als die normale Java-Laufzeit sind.

Quarkus rettet Java Lambda! ?? https://qiita.com/moritalous/items/4de31a66edac728ba088

Recommended Posts

Erstellen Sie AWS Lambda mit Quarkus
AWS Lambda (Lambda) Teil 1 mit Java startet jetzt
Erstellen Sie eine Umgebung mit Docker unter AWS
Erste Schritte mit Micronaut 2.x ~ Native Build und Bereitstellung für AWS Lambda ~
Verwendung des Java-Frameworks mit AWS Lambda! ??
AWS Lambda Zeitzonenänderung
Quarkus rettet Java Lambda! ??
Baue Doma1 mit Ant
Baue Growai mit Centos7
Erstellen Sie Java mit Wercker
Bazel mit Alpen bauen
So stellen Sie Java mit Serverless Framework für AWS Lambda bereit
Verwenden Sie Lambda-Ebenen mit Java
Benachrichtigen Sie Slack of AWS-Rechnungen täglich mit Lambda für Ruby
Erstellen Sie GitLab / Mattermost mit DockerForWindows
Erstellen Sie mit Centos7 ein Softether-VPN.
Veröffentlichen Sie regelmäßig Bild-Tweets auf Twitter mit AWS Lambda + Java
Erstellen Sie einen SlackBot mit AWS Lambda & API Gateway in Java
Erstellen einer Docker-Umgebung mit WSL
[Einführung] Erstellen Sie MVC mit Scala
Erstellen Sie DynamoDB local mit Docker
Mit [AWS] CodeStar können Sie ein Spring (Java) -Projekt erstellen, das auf Lambda in nur 3 Minuten ausgeführt wird! !!
Versuchen Sie, SlackBot mit Ruby x Sinatra auf AWS Lambda auszuführen
Erstellen Sie ein periodisches Programm mit Ruby x AWS Lambda x CloudWatch-Ereignissen
Bis INSERT S3 Objekt in EC2 DB mit Lambda @ java: AWS
Java-Lambda-Ausdruck, der mit Comparator gelernt wurde
Erstellen Sie mit Docker eine lokale Couchbase-Umgebung
Erstellen eines Java-Projekts mit Gradle
Erstellen Sie mit Docker eine Node.js-Umgebung
Erstellen Sie mit Pleiades 4.8 eine Tomcat 8.5-Umgebung
Ist Java unter AWS Lambda langsam?
Hallo Welt mit AWS Lambda + Java
Erstellen Sie eine Webanwendung mit Javalin
Erstellen Sie Java mit Mac vs Code
Erstellen Sie mit Eclipse eine Jooby-Entwicklungsumgebung
Erstellen Sie mit Laradock eine Docker + Laravel-Umgebung
Führen Sie C-Binärdateien auf AWS Lambda aus
Beachten Sie Folgendes, wenn Sie Apache PDFBox® mit AWS Lambda verwenden
Ich habe versucht, den Zugriff von Lambda → Athena mit AWS X-Ray zu visualisieren
Erstellen Sie mit CentOS7 + Nginx + pm2 + Nuxt.js eine Entwicklungsumgebung auf AWS EC2