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).
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).
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".
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.
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.
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)).
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.
Normalement, vous sélectionnez un déclencheur ici, mais je veux juste le tester, donc je vais simplement mettre les conditions autour de cela.
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é.
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.
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.
Appuyez sur "Test" comme une évidence.
Ç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).
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.