[JAVA] Créez AWS Lambda avec Quarkus

Quarkus (https://quarkus.io/) est 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.

C'est vrai. Je ne sais pas ce que vous dites, mais ça a l'air génial.

Comme il est possible de convertir des programmes Java de manière native avec la fonction de GraalVM, il peut être combiné avec le runtime personnalisé d'AWS Lambda pour résoudre le ** problème de démarrage à froid ** qui est une caractéristique des applications Java exécutées sur AWS Lambda. Vous pouvez vous y attendre.

Je l'ai essayé selon la procédure sur le site officiel, je vais donc quitter la procédure.

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

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

environnement

Procédure de déploiement de l'application modèle

Étape 1. Préférences Amazon Linux 2

Amazon Linux 2 de l'image Docker ne peut pas tar ou ʻunzip`, donc je vais mettre diverses choses. Je ne sais pas si j'ai besoin de tous, mais j'en ai mis autant.

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

Étape 2. Installez GraalVM

Téléchargez-le depuis le site officiel et développez-le.

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

Définissez JAVA_HOME sur GraalVM et utilisez GraalVM pour créer Maven.

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

Enfin, installez l 'image native requise pour la construction native. La commande est gu (Graal VM Updater).

gu install native-image

Étape 3. Installez Maven

Le Maven utilisé pour construire Quarkus nécessite une version 3.6.2 ou supérieure. La version qui peut être installée avec yum était ancienne, je l'ai donc téléchargée sur le site officiel et l'ai installée.

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

Vérifiez la version de 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# 

Vous pouvez voir qu'il s'exécute sur la JVM GraalVM.

Étape 4. Créez un projet avec Maven

Créez un projet avec la commande mvn.

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

Après un certain temps, une question vous sera posée à l'invite, alors répondez-y. La partie entre [] est l'entrée utilisateur.

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]

Un répertoire est créé avec ʻartifactId` (myArtifact) et un projet est généré.

La structure du projet immédiatement après la création ressemble à ceci.

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# 

Étape 5. Configurer le gestionnaire pour démarrer avec Lambda

Le gestionnaire appelé par Lambda est défini dans quarkus.lambda.handler de resources / application.properties.

resources/application.properties


quarkus.lambda.handler=test

Avec les paramètres ci-dessus, la classe nommée test ci-dessous sera appelée.

java:main/java/example.TestLambda.java


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

Le reste est codé comme Lambda normal. En plus de «test», «stream» est également disponible comme modèle.

Étape 6. Créez un package de déploiement

Créons un package de déploiement avec le modèle tel quel.

mvn clean package -Pnative

Ça prend beaucoup de temps. Je pense que cela prendra plus de 10 minutes.

Étape 7. Vérifiez le contenu du package de déploiement

Une fois le package de déploiement créé avec succès, target / function.zip sera généré. Quand j'ai essayé de le développer, le contenu n'était que «bootstrap».

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

Étape 8. Déployer Lambda

Un fichier appelé manage.sh est également généré dans le répertoire target, et il semble que vous puissiez le déployer sur AWS à partir d'ici. J'étais nouveau dans les environnements d'exécution personnalisés, alors je l'ai essayé depuis la console de gestion. Après avoir créé le package de déploiement, un fichier appelé target / sam.native.yaml est également généré, je me suis donc référé à cela pour le nom du gestionnaire et les variables d'environnement.

Créez une nouvelle fonction. Disons que le runtime «fournit votre propre bootstrap».

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

Après avoir créé la fonction, téléchargez le programme. Sélectionnez ʻUploader le fichier .zip dans Actiondans le code de fonction, et sélectionnezfunction.zip`.

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

Le gestionnaire sera not.used.in.provided.runtime.

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

Ajoutez DISABLE_SIGNAL_HANDLERS à la variable d'environnement et définissez la valeur sur true.

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

Le réglage est terminé jusqu'à ce point. Testons avec le JSON suivant comme entrée.

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

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

Voici le résultat de l'opération. Cela a fonctionné en toute sécurité.

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

Ajout du kit SDK AWS

Pour utiliser le kit AWS SDK, vous devez définir certains paramètres, pas simplement l'ajouter à pom.xml.

Étape 1. Activez la communication SSL

Ajoutez ce qui suit à resources / application.properties. (Bien qu'il semble que le document officiel dise qu'il est valide par défaut)

resources/application.properties


quarkus.ssl.native=true

Étape 2. Ajouter une dépendance

Tout d'abord, nous avons besoin de quarkus-jaxb, nous allons donc l'ajouter.

pom.xml


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

Ensuite, j'ajouterai la bibliothèque AWS SDK.

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).

Une fois traduit `Cependant, pour les images natives, en raison d'un problème de compilation GraalVM (actuellement), le client de connexion URL doit avoir la priorité sur le client HTTP Apache lors de l'utilisation du mode synchrone. '' C'est vrai. Par conséquent, la description est la suivante.

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>

Étape 3. Écrivez le code Java

Voici un exemple d'accès à S3. Lors de la création de S3Client, spécifiez explicitement ʻUrlConnectionHttpClient dans httpClient`.

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

Étape 4. Paramètres requis pour la communication SSL

Le package de déploiement doit inclure les éléments suivants pour la communication SSL:

Tout d'abord, créez le répertoire src / main / zip.native / et créez le bootstrap.

zip.native/bootstrap


#!/usr/bin/env bash

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

Copiez ensuite «libsunec.so» et «cacerts». Ces deux fichiers sont inclus dans GraalVM.

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

Étape 5. Créez un package de déploiement

La procédure de création d'un package de déploiement reste la même.

mvn clean package -Pnative

Étape 6. Vérifiez le contenu du package de déploiement

Si vous créez un package de déploiement avec SSL activé, le contenu de target / function.zip changera.

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

Vous pouvez voir que le bootstrap``cacerts``libsunec.so pré-préparé est inclus.

À la fin

Vérifiez ici les résultats de vérification qui démarrent à froid plus rapidement que l'environnement d'exécution Java normal.

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

Recommended Posts

Créez AWS Lambda avec Quarkus
AWS Lambda (Lambda) Partie 1 avec Java pour démarrer maintenant
Créer un environnement avec Docker sur AWS
Premiers pas avec Micronaut 2.x ~ Construction native et déploiement sur AWS Lambda ~
Comment utiliser le framework Java avec AWS Lambda! ??
Changement de fuseau horaire AWS Lambda
Quarkus enregistre Java Lambda! ??
Construire Doma1 avec Ant
Construisez Growai avec Centos7
Construire Java avec Wercker
Construisez bazel avec alpin
Comment déployer Java sur AWS Lambda avec Serverless Framework
Utiliser des couches Lambda avec Java
Notifier quotidiennement Slack des factures AWS avec Lambda pour Ruby
Construire GitLab / Mattermost avec DockerForWindows
Créez un VPN softether avec Centos7.
Publiez régulièrement des images de tweets sur Twitter avec AWS Lambda + Java
Créer un SlackBot avec AWS lambda et API Gateway en Java
Créer un environnement Docker avec WSL
[Introduction] Construire MVC avec Scala
Construire DynamoDB local avec Docker
Avec [AWS] CodeStar, vous pouvez créer un projet Spring (Java) s'exécutant sur Lambda en seulement 3 minutes! !!
Essayez d'exécuter SlackBot réalisé avec Ruby x Sinatra sur AWS Lambda
Créer un programme périodique avec Ruby x AWS Lambda x CloudWatch Events
Jusqu'à INSERT S3 objet dans EC2 DB avec Lambda @ java: AWS
Expression lambda Java apprise avec Comparator
Créer un environnement local Couchbase avec Docker
Construire un projet Java avec Gradle
Créer un environnement Node.js avec Docker
Créer un environnement Tomcat 8.5 avec Pleiades 4.8
Java sur AWS Lambda est-il lent?
Hello World avec AWS Lambda + Java
Créer une application Web avec Javalin
Construire Java avec Mac vs Code
Créer un environnement de développement Jooby avec Eclipse
Créez un environnement Docker + Laravel avec Laradock
Exécuter des binaires C sur AWS Lambda
Points à garder à l'esprit lors de l'utilisation d'Apache PDFBox® avec AWS Lambda
J'ai essayé de visualiser l'accès de Lambda → Athena avec AWS X-Ray
Créez un environnement de développement sur AWS EC2 avec CentOS7 + Nginx + pm2 + Nuxt.js