Nous présenterons un exemple étape par étape d'écriture d'une fonction AWS Lambda dans Java8, de sa téléchargement en tant que fonction Lambda sur AWS et de son appel à partir d'un client Java.
TL; DR J'écrirai dans la première partie et la deuxième partie
――C'est un service formidable qui peut traiter diverses demandes (événements) simplement en donnant le code à AWS Lambda sans avoir à créer et gérer le serveur par vous-même.
http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/welcome.html https://aws.amazon.com/jp/lambda/faqs/
--Il est possible d'écrire le traitement AWS Lambda (fonction Lambda) en Java --Il est également possible d'appeler des fonctions Lambda directement depuis un client Java
Nous réaliserons les étapes suivantes une par une.
aws-lambda-java-core Ajoutez la bibliothèque. Lorsque vous utilisez maven, ajoutez la description suivante
maven
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-core</artifactId>
<version>1.1.0</version>
</dependency>
Ici, nous allons créer une fonction Lambda de type demande de réponse (Request Response) qui renvoie un résultat lorsque la fonction est appelée.
Cette fois aws-lambda-java-core ** RequestHandler ** interface fournie par la bibliothèque Pour implémenter une fonction Lambda qui peut entrer et sortir POJO.
Vous trouverez ci-dessous un exemple de fonction Lambda qui imprime le nom complet lorsque vous entrez le nom et le prénom.
MyLambda.java
package lambda.cloud;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import lambda.cloud.MyLambda.Input;
import lambda.cloud.MyLambda.Output;
public class MyLambda implements RequestHandler<Input, Output> {
@Override
public Output handleRequest(Input in, Context context) {
final Output out = new Output();
out.in = in;
out.fullName = in.firstName + "_" + in.lastName;
return out;
}
public static class Input {
public String firstName;
public String lastName;
}
public static class Output {
public Input in;
public String fullName;
}
}
Implémentez simplement la méthode ** handleRequest ** comme indiqué ci-dessous. L'argument ** Input ** est la requête et la valeur de retour ** Output ** est la réponse.
public Output handleRequest(Input in, Context context) {
Ensuite, pour pouvoir l'utiliser avec AWS Lambda en tant que fonction Lambda, vous devez regrouper le code dans un fichier jar (ou zip) et le télécharger sur AWS Lambda.
En plus du code que vous venez de créer, ce fichier jar doit intégrer les bibliothèques dépendantes et ainsi de suite.
Ajoutez ** maven-shadow-plugin ** sous les plugins dans maven pom.xml pour créer un fichier jar unifié (c'est-à-dire, fat jar).
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
pom.xml
L'ensemble du pom.xml ressemble à ceci
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>lambda.cloud</groupId>
<artifactId>mylambda</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<name>AWS lambda example</name>
<description>example of AWS lambda
</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-core</artifactId>
<version>1.1.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Le code source complet de l'exemple ci-dessus est ci-dessous https://github.com/riversun/aws_lambda_example_basic_client.git
** Lors du clonage avec Eclipse **
Maintenant que vous avez un ** projet Maven ** sur Eclipse, il sera plus facile à gérer.
Exécutez la commande suivante dans le répertoire contenant pom.xml
mvn packgage
Étape 1. Sélectionnez ** Exécuter en tant que> Maven build ** dans le menu contextuel
Étape 2. Dans la boîte de dialogue ** Modifier les configurations **, entrez ** package teinte: ombre ** dans ** Objectifs ** et ** Exécuter **
Dans les deux cas (1) (2), ** mylambda-1.0.0.jar ** contenant toutes les bibliothèques de code dépendantes sera généré sous ** / target **.
Ce sera le fichier jar pour votre téléchargement AWS Lambda.
Jetons un coup d'œil aux étapes pour enregistrer une fonction Lambda à partir de la console AWS
** (1) Ouvrez AWS Lambda ** Ouvrez le service Lambda.
** (2) Créer une nouvelle fonction Lambda ** Si vous n'avez pas encore créé la fonction Lambda, l'écran ressemblera à celui ci-dessous.
Cliquez sur ** Créer une fonction **.
** (3) [Créer à partir de zéro] Fonction Lambda **
L'écran de sélection dans la liste d'impression bleue apparaîtra comme indiqué ci-dessous. Sélectionnez ** Auteur à partir de zéro **.
** (4) Définissez le nom et le rôle sur l'écran d'informations de base **
Ici, nous allons créer une fonction Lambda nommée ** myFunction **.
--Le nom est "** maFonction **"
Cliquez sur ** Créer une fonction ** lorsque vous avez terminé
** (5) Téléchargez le fichier jar **
STEP 1 Tout d'abord, vérifiez l'ARN en haut de l'écran Notez la partie ** arn: aws: lambda: ap-northeast-1: 000000000000: function: myFunction ** affichée à l'écran.
Comme vous le savez, * ARN (Amazon Resource Name) sert à identifier de manière unique les ressources AWS et est utilisé pour les identifier lors de l'exécution des fonctions Lambda. *
STEP 2 Sélectionnez ** Java 8 ** à partir de l'exécution
STEP 3 Entrez ** lambda.cloud.MyLambda ** dans le gestionnaire Décrivez le nom du gestionnaire au format ** nom du package.nom de la classe :: nom de la méthode **. Selon le code créé précédemment, le nom du package est ** lambda.cloud **, le nom de la classe est ** MyLambda ** et ** lambda.cloud.MyLambda ** est entré. Dans cet exemple, le nom de la méthode peut être omis.
STEP 4 Cliquez sur ** upload ** pour télécharger le ** mylambda-1.0.0.jar ** que vous venez de créer.
Oui, jusqu'à présent, la fonction Lambda que vous avez créée précédemment a été enregistrée dans AWS Lambda.
Après le téléchargement, essayez de tester depuis la console.
** (1) Préparation à l'événement test **
Il y a une idée que la fonction Lambda est ** déclenchée par un événement. Par exemple, vous pouvez l'utiliser pour déclencher la fonction Lambda déclenchée par l'événement ** Un objet est créé dans le compartiment S3 **.
Par conséquent, l'entrée permettant d'exécuter la fonction Lambda est appelée ** événement **.
Ici, déclenchez ** événement ** depuis la console et vérifiez le fonctionnement de la fonction Lambda.
Sélectionnez ** Configurer les événements de test ** en haut de l'écran.
Ensuite, l'écran ** Configurer les événements de test ** s'ouvrira comme indiqué ci-dessous. Créez un événement de test ici.
Soit ** Nom de l'événement ** ** MyEvent **, et la zone d'édition en dessous est le corps lors de la demande de la fonction Lambda.
Dans la fonction Lambda qui est entrée / sortie avec le POJO créé précédemment, le POJO est automatiquement mappé à JSON dans l'appel réel, et l'entrée / sortie est effectuée dans JSON.
Par conséquent, entrez le corps de l'événement au format JSON comme indiqué ci-dessous.
{
"firstName": "john",
"lastName": "doe"
}
Après avoir entré, appuyez sur ** Créer ** au bas de l'écran.
** (2) Exécution de l'événement de test **
Exécutez immédiatement le ** MyEvent ** que vous venez de créer. Appuyez sur ** Test ** en haut à droite de l'écran.
À propos, ** "La fonction Lambda" myFunction "ne peut pas être modifiée en ligne car le nom de fichier spécifié dans le gestionnaire ne correspond pas au nom de fichier du package de déploiement. Ne vous inquiétez pas si le message «**» s'affiche, c'est OK. La console Lambda ne fournit pas d'éditeurs en ligne pour les langages précompilés tels que Java et C #.
** (3) Vérifiez le résultat de l'exécution **
Après avoir appuyé sur ** Test ** pendant un moment, l'écran de résultat s'affiche.
En cas de succès, ** Résultat de l'exécution: réussi ** s'affiche. Vous pouvez voir les détails du résultat en appuyant sur ** ▼ Détails ** en dessous pour le développer.
La sortie de la fonction Lambda est également convertie de la classe POJO ** Output ** au JSON suivant.
POJO pour entrée / sortie
public static class Input {
public String firstName;
public String lastName;
}
public static class Output {
public Input in;
public String fullName;
}
Résultat d'exécution
{
"in": {
"firstName": "john",
"lastName": "doe"
},
"fullName": "john_doe"
}
Appelez la fonction Lambda ** myFunction ** créée précédemment à partir d'un programme Java.
Si vous souhaitez accéder à la fonction AWS Lambda à partir de Java, ajoutez la bibliothèque aws-java-sdk-lambda. Si vous utilisez maven, ajoutez ce qui suit
maven
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-lambda</artifactId>
<version>1.11.210</version>
</dependency>
Le code ressemble à ceci: (Diverses valeurs de réglage sont factices)
Client Java
public class ExampleLambdaClient {
public static void main(String[] args) {
ExampleLambdaClient client = new ExampleLambdaClient();
client.invokeLambdaFunction();
}
private void invokeLambdaFunction() {
final String AWS_ACCESS_KEY_ID = "ANMNRR35KPTR7PLB3C7D";
final String AWS_SECRET_ACCESS_KEY = "UKA6EsKY25LJQBEpUvXyYkj8aWKEDnynEZigVPhz";
AWSCredentials credentials = new BasicAWSCredentials(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY);
// ARN
String functionName = "arn:aws:lambda:ap-northeast-1:000000000000:function:myFunction";
String inputJSON = "{\"firstName\":\"john\",\"lastName\": \"doe\"}";
InvokeRequest lmbRequest = new InvokeRequest()
.withFunctionName(functionName)
.withPayload(inputJSON);
lmbRequest.setInvocationType(InvocationType.RequestResponse);
AWSLambda lambda = AWSLambdaClientBuilder.standard()
.withRegion(Regions.AP_NORTHEAST_1)
.withCredentials(new AWSStaticCredentialsProvider(credentials)).build();
InvokeResult lmbResult = lambda.invoke(lmbRequest);
String resultJSON = new String(lmbResult.getPayload().array(), Charset.forName("UTF-8"));
System.out.println(resultJSON);
}
}
AWSCredentials credentials = new BasicAWSCredentials(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY);
--Créez les informations d'identification à l'aide de l'ID de clé d'accès (AWS_ACCESS_KEY_ID) et de la clé d'accès secrète (AWS_SECRET_ACCESS_KEY).
InvokeRequest lmbRequest = new InvokeRequest()
.withFunctionName(functionName)
.withPayload(inputJSON);
-Spécifiez le corps (JSON) de la requête avec ** # withPayload **. Ici, la chaîne de caractères JSON ** "{" firstName \ ": " john \ ", " lastName \ ": " doe \ "}"; ** est spécifiée.
lmbRequest.setInvocationType(InvocationType.RequestResponse);
InvokeResult lmbResult = lambda.invoke(lmbRequest);
String resultJSON = new String(lmbResult.getPayload().array(), Charset.forName("UTF-8"));
Le code source complet côté client est ci-dessous https://github.com/riversun/aws_lambda_example_basic_client.git
L'exemple a été créé avec Eclipse (Oxygen), mais aucun plug-in spécial n'est requis. (Vous n'avez même pas besoin du plug-in AWS SDK pour Eclipse, ce qui facilite les choses)
――C'était vers 2009, mais j'ai été choqué lorsque le service d'origine "** Google App Engine (GAE) **", qui dit ** Je n'écris que le code et je le laisse à moi, et ne paie que ce que j'utilise **, apparaît. Bien qu'il y ait eu de nombreuses restrictions particulières, cela a été très utile.
«Cette fois, ** l'ancêtre !? ** a introduit ** Google Cloud Functions **. À l'heure actuelle, je pense que β est l'avenir, mais il semble que ce sera une option dans le futur.
Recommended Posts