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
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
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
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.
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#
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.
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.
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#
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».
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électionnez
function.zip`.
Le gestionnaire sera not.used.in.provided.runtime
.
Ajoutez DISABLE_SIGNAL_HANDLERS
à la variable d'environnement et définissez la valeur sur true
.
Le réglage est terminé jusqu'à ce point. Testons avec le JSON suivant comme entrée.
{
"name": "Bill",
"greeting": "hello"
}
Voici le résultat de l'opération. Cela a fonctionné en toute sécurité.
Pour utiliser le kit AWS SDK, vous devez définir certains paramètres, pas simplement l'ajouter à pom.xml.
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
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>
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();
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/
La procédure de création d'un package de déploiement reste la même.
mvn clean package -Pnative
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.
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