[JAVA] Premier AWS Lambda (j'ai essayé de voir dans quel type d'environnement il fonctionne)

C'était une formation d'architecte AWS pendant 3 jours à partir de lundi. J'ai été surpris quand je suis entré en contact avec Lambda. C'est mon propre résumé (pour ceux qui le savent, je prêche à Shaka).

Qu'est-ce que Lambda?

J'ai honte de dire que lorsque j'ai entendu le mot «sans serveur», cela ne m'est pas venu à l'esprit. Mais c'est littéralement vrai. Peu importe l'environnement dans lequel le programme s'exécute. Peu importe quel est le système d'exploitation, quel est le middleware, combien de mémoire, combien de CPU, ce qu'est NW, quelle est la topologie, etc. (En fait, vous pouvez spécifier la taille de la mémoire et répondre en conséquence. La capacité du processeur sera allouée). Quoi qu'il en soit, le code (programme) se déplace avec le "déclencheur" appelé "déclencheur" comme déclencheur. Avec Java, la JVM démarrera et le jar téléchargé sera exécuté. Les "déclencheurs" sont fortement intégrés aux services AWS, par exemple

Est-ce un TDB (Trigger Driven Bean) qui n'est pas un MDB? Il n'est pas nécessaire que ce soit un bean, il est donc préférable de l'appeler TDC (Trigger Driven Code).

Essayez de bouger

Pendant la formation, j'avais beaucoup de temps pour la formation pratique, alors j'ai écrit un code simple dans Eclipse qui se trouvait dans le terminal de formation et l'ai essayé. Les tests peuvent être expulsés de la console AWS, il est donc facile de les essayer sans avoir à définir un "déclencheur".

Manières

Fondamentalement, tout programme Java fonctionnera si vous incluez les bibliothèques nécessaires, mais il semble y avoir une promesse dans la méthode à appeler. C'est un argument. Obtenez ʻObject comme premier argument et Context` comme deuxième argument. Le nom de la méthode peut être n'importe quoi. Il peut être de n'importe quel type (bien que le premier argument et le type de retour doivent être "Sérialisable", les types primitifs sont OK).

Plus précisément, les informations du "déclencheur" sont entrées dans le premier argument. Si le déclencheur est que le message est «mis» dans la file d'attente, vous pouvez transmettre le message lui-même. Si la valeur de retour est un appel synchrone, elle devrait être presque la même. Tout ce que vous avez à faire est de «Sérialiser» et de le renvoyer selon les exigences de votre interface.

Le deuxième argument est «Context», qui est «com.amazonaws.services.lambda.runtime.Context», et non «javax.naming.Context». Vous devez donc ajouter le fichier jar fourni par AWS (https://mvnrepository.com/artifact/com.amazonaws/aws-lambda-java-core/1.1.0) à votre chemin de compilation. [^ 1] [^ 1]: Eclipse a AWS Toolkit Plugin Puisqu'il y en a, il est possible de simplement configurer cet environnement.

créer

Je n'ai pas encore les compétences ou les idées pour écrire du code significatif, alors j'ai décidé de voir quel type d'environnement (propriétés système, variables d'environnement, objets `Contexte 'passés) il fonctionne comme un magasin d'infrastructure.

SystemInfo.class


package net.mognet.aws.lambda;

import java.util.Map;
import java.util.Properties;

import com.amazonaws.services.lambda.runtime.Context;

public class SystemInfo {

    public static String printSystemInfo(int i, Context context) {
    		StringBuilder sb = new StringBuilder();
    		//Ajouter un en-tête
    		sb.append("name,value\n");
    		
    		//Obtenir les propriétés du système
    		Properties prop = System.getProperties();
    		for(Object key : prop.keySet()) {
    			String name = (String) key;
    			String value  = prop.getProperty(name);
    			sb.append(name + "," + value + "\n");
    		}
    		//Obtenir des variables d'environnement
    		Map<String, String> env = System.getenv();
    		for(String key : env.keySet()) {
    			String value = env.get(key);
    			sb.append(key + "," + value + "\n");
    		}
    		//Obtenir des informations contextuelles
    		sb.append("context" + "," + context.toString());
    		return sb.toString();
    }
    
    public static void main(String[] args) {
    		System.out.println(printSystemInfo(1, null));
    }
}

main est pour les tests. Le premier argument est censé être important, mais cette fois je ne ferai rien.

Mettez

Ouvrez la console AWS et créez une fonction Lambda (elle fonctionne en unités appelées fonctions. Il semble y avoir un service qui orchestre plusieurs fonctions (détails non encore étudiés)). スクリーンショット 2018-01-31 21.39.16.png Sélectionnez un nom et un runtime appropriés (Java8 cette fois) et appuyez sur "Créer une fonction". Étant donné que la sortie standard circule vers CloudWatch Logs, créez un rôle avec l'autorisation d'écriture dans CloudWatch Logs à l'avance et attachez-le ici si nécessaire. スクリーンショット 2018-01-31 21.39.50.png スクリーンショット 2018-01-31 21.39.57.png Normalement, vous sélectionnez un déclencheur ici, mais je veux juste le tester, donc je vais simplement mettre les conditions autour de cela. スクリーンショット 2018-01-31 21.40.05.png Dans le code de fonction, téléchargez le fichier jar depuis" Upload ", et l'important est de saisir ici la méthode à exécuter dans le" Handler ". Le format est fixe, et c'est le nom de la méthode avec "." Notation et "::" après le chemin complet de la classe. Cette fois, ce sera " net.mognet.aws.lambda.SystemInfo :: printSystemInfo ". J'ai également ajouté des variables d'environnement. Une fois que vous "enregistrez", le fichier sera effectivement téléchargé. スクリーンショット 2018-01-31 21.41.03.png Vient ensuite la préparation du test. Ceci est un cas de test (paramètre d'entrée = paramètre du premier argument). Sélectionnez "Paramètres des événements de test" en haut de l'écran. スクリーンショット 2018-01-31 21.41.19.png Puisque le premier argument de la méthode public static String printSystemInfo à exécuter est ʻint`, écrivez seulement 1 pour terminer. Appuyez sur "Enregistrer" en bas. Vous êtes maintenant prêt à tester.

Faisons le!

Appuyez sur "Test" comme une évidence. スクリーンショット 2018-01-31 21.42.15.png Ça a marché. Puisqu'il n'y a pas de sortie de journal (sortie standard) cette fois, je n'ai pas vu le journal, mais les messages de début et de fin ont été affichés. Depuis que la méthode de type String a été exécutée, la chaîne de caractères return est affichée à l'écran telle quelle (je voulais que le code de saut de ligne soit interrompu, mais c'est la bonne manière pour la console d'affichage des résultats de l'exécution).

appendice

Le résultat de l'exécution est répertorié en annexe.

name value
java.runtime.name OpenJDK Runtime Environment
sun.boot.library.path /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-1.b16.32.amzn1.x86_64/jre/lib/amd64
java.vm.version 25.141-b16
java.vm.vendor Oracle Corporation
java.vendor.url http://java.oracle.com/
path.separator :
java.vm.name OpenJDK 64-Bit Server VM
file.encoding.pkg sun.io
user.country US
sun.java.launcher SUN_STANDARD
sun.os.patch.level unknown
java.vm.specification.name Java Virtual Machine Specification
user.dir /
java.runtime.version 1.8.0_141-b16
java.awt.graphicsenv sun.awt.X11GraphicsEnvironment
java.endorsed.dirs /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-1.b16.32.amzn1.x86_64/jre/lib/endorsed
os.arch amd64
java.io.tmpdir /tmp
line.separator
java.vm.specification.vendor Oracle Corporation
os.name Linux
sun.jnu.encoding UTF-8
java.library.path /lib64:/usr/lib64:/var/runtime:/var/runtime/lib:/var/task:/var/task/lib:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
java.specification.name Java Platform API Specification
java.class.version 52.0
sun.management.compiler HotSpot 64-Bit Tiered Compilers
os.version 4.9.77-31.58.amzn1.x86_64
user.home /home/sbx_user1066
user.timezone UTC
java.awt.printerjob sun.print.PSPrinterJob
file.encoding UTF-8
java.specification.version 1.8
java.class.path /var/runtime/lib/LambdaJavaRTEntry-1.0.jar
user.name sbx_user1066
java.vm.specification.version 1.8
sun.java.command /var/runtime/lib/LambdaJavaRTEntry-1.0.jar
java.home /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-1.b16.32.amzn1.x86_64/jre
sun.arch.data.model 64
user.language en
java.specification.vendor Oracle Corporation
awt.toolkit sun.awt.X11.XToolkit
java.vm.info mixed mode, sharing
java.version 1.8.0_141
java.ext.dirs /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-1.b16.32.amzn1.x86_64/jre/lib/ext:/usr/java/packages/lib/ext
sun.boot.class.path /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-1.b16.32.amzn1.x86_64/jre/lib/resources.jar:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-1.b16.32.amzn1.x86_64/jre/lib/rt.jar:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-1.b16.32.amzn1.x86_64/jre/lib/sunrsasign.jar:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-1.b16.32.amzn1.x86_64/jre/lib/jsse.jar:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-1.b16.32.amzn1.x86_64/jre/lib/jce.jar:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-1.b16.32.amzn1.x86_64/jre/lib/charsets.jar:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-1.b16.32.amzn1.x86_64/jre/lib/jfr.jar:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-1.b16.32.amzn1.x86_64/jre/classes
java.vendor Oracle Corporation
file.separator /
java.vendor.url.bug http://bugreport.sun.com/bugreport/
sun.io.unicode.encoding UnicodeLittle
sun.cpu.endian little
sun.cpu.isalist
PATH /usr/local/bin:/usr/bin/:/bin
_AWS_XRAY_DAEMON_ADDRESS 169.254.79.2
LAMBDA_TASK_ROOT /var/task
AWS_LAMBDA_FUNCTION_MEMORY_SIZE 128
TZ :UTC
AWS_SECRET_ACCESS_KEY secret
AWS_EXECUTION_ENV AWS_Lambda_java8
AWS_DEFAULT_REGION ap-northeast-1
AWS_LAMBDA_LOG_GROUP_NAME /aws/lambda/SystemInfo
XFILESEARCHPATH /usr/dt/app-defaults/%L/Dt
_HANDLER net.mognet.aws.lambda.SystemInfo::printSystemInfo
LANG en_US.UTF-8
LAMBDA_RUNTIME_DIR /var/runtime
AWS_SESSION_TOKEN tokenString
AWS_ACCESS_KEY_ID accessKeyId
LD_LIBRARY_PATH /lib64:/usr/lib64:/var/runtime:/var/runtime/lib:/var/task:/var/task/lib
_X_AMZN_TRACE_ID Root=1-5a71b98c-393aaa7b51f5612a348586c0;Parent=3ff8164301e3ccd4;Sampled=0
AWS_SECRET_KEY secretKey
hogehoge gehogeho
AWS_REGION ap-northeast-1
AWS_LAMBDA_LOG_STREAM_NAME 2018/01/31/[$LATEST]29640ec0ac8e426ab2b0a041b3a1b1f4
AWS_XRAY_DAEMON_ADDRESS 169.254.79.2:2000
_AWS_XRAY_DAEMON_PORT 2000
NLSPATH /usr/dt/lib/nls/msg/%L/%N.cat
AWS_XRAY_CONTEXT_MISSING LOG_ERROR
AWS_LAMBDA_FUNCTION_VERSION $LATEST
AWS_ACCESS_KEY accessKey
AWS_LAMBDA_FUNCTION_NAME SystemInfo
context lambdainternal.api.LambdaContext@604ed9f0

Des informations telles que la clé d'accès étaient également incluses dans la variable d'environnement, je les ai donc masquées. Il peut être nécessaire de comprendre qu'il s'agit d'une telle spécification. Est-il possible d'appeler l'API AWS en utilisant les clés ici? De plus, les variables d'environnement qui ont été définies correctement sont également affichées (évidemment). Il semble qu'il fonctionne sur OpenJDK sur Amazon Linux. Je ne sais pas ce qui se passera lorsque cela sera réellement mis en production. C'est juste que c'était le cas lorsque ce test a été exécuté. Après tout, il est sans serveur, donc encore une fois, l'environnement d'exécution (HW, OS, MW, etc.) n'a pas d'importance. Au contraire, j'ai réalisé que l'utilisation de type Lambda consiste à écrire le code en supposant que cela n'a pas d'importance.

référence

Gestionnaire de fonctions Lambda (Java) --AWS Lambda

Recommended Posts

Premier AWS Lambda (j'ai essayé de voir dans quel type d'environnement il fonctionne)
J'ai essayé de visualiser l'accès de Lambda → Athena avec AWS X-Ray
J'ai essayé de découvrir ce qui avait changé dans Java 9
J'ai essayé de créer un environnement de WSL2 + Docker + VSCode
J'ai créé un client RESAS-API en Java
J'ai essayé de développer la fonction de cache d'Application Container Cloud Service dans l'environnement local
J'ai essayé d'implémenter le traitement Ajax de la fonction similaire dans Rails
Examiner les informations système de l'environnement d'exploitation AWS Lambda en Java
J'ai essayé de créer un environnement de serveur UML Plant avec Docker
J'ai essayé de créer une classe parent d'objet de valeur dans Ruby
J'ai essayé d'utiliser pleinement le cœur du processeur avec Ruby
J'ai essayé de résumer les expressions Java lambda
Qu'est-ce que Docker? J'ai essayé de résumer
Ce que j'ai essayé quand je voulais obtenir tous les champs d'un haricot
Je ne savais pas quoi écrire dans la portée de Maven, alors j'ai cherché.
Récupérer le premier jour de la semaine dans les paramètres régionaux actuels (quel jour est-il aujourd'hui?)
J'ai essayé d'implémenter des relations polymorphes à Nogizaka.
C # (base de l'encapsulation)
J'ai essayé de sortir quatre-vingt-dix-neuf en Java
J'ai essayé de développer une application en 2 langues
J'ai essayé de créer une compétence Alexa avec Java
Résumé de ce que j'ai appris dans Spring Batch
Je veux ESLint dans le projet Maven. Je veux exécuter Node.js sans le mettre dans mon environnement.
J'ai essayé d'étudier le mécanisme d'Emscripten en l'utilisant avec un solveur allemand
J'ai essayé d'utiliser Docker parce que je ne veux pas polluer l'environnement local dans le développement de l'onglet Microsoft Teams de MS Learn
J'ai essayé d'expliquer ce que vous pouvez faire dans un langage populaire pour le développement Web du point de vue d'un débutant.
J'ai essayé ce que je voulais essayer avec Stream doucement.
J'ai essayé d'implémenter la notification push Firebase en Java
J'ai essayé de faire fonctionner SQS en utilisant AWS Java SDK
05. J'ai essayé de supprimer la source de Spring Boot
J'ai essayé d'intégrer le bouton AWS I oT et Slack
J'ai essayé de réduire la capacité de Spring Boot
J'ai essayé de créer une compétence Clova en Java
J'ai essayé de créer une fonction de connexion avec Java
J'ai essayé d'implémenter la méthode de division mutuelle d'Eugrid en Java
~ J'ai essayé d'apprendre la programmation fonctionnelle avec Java maintenant ~
J'ai fini de regarder les roses de Versailles, alors j'ai essayé de reproduire la chanson de fin en Java
[SwiftUI] J'ai essayé de découvrir comment cela change pour chaque emplacement spécifié de l'arrière-plan
Je veux recréer le contenu des actifs à partir de zéro dans l'environnement construit avec capistrano