Es war eine AWS-Architektenausbildung für 3 Tage ab Montag. Ich war überrascht, als ich zum ersten Mal mit Lambda in Kontakt kam. Es ist meine eigene Zusammenfassung (für diejenigen, die es wissen, predige ich Shaka).
Ich schäme mich zu sagen, dass mir das Wort "serverlos" nicht in den Sinn gekommen ist, als ich es hörte. Aber das ist buchstäblich richtig. Es spielt keine Rolle, in welcher Umgebung das Programm ausgeführt wird. Es spielt keine Rolle, was das Betriebssystem ist, was die Middleware ist, wie viel Speicher, wie viel CPU, was NW ist, wie die Topologie ist usw. (Tatsächlich können Sie die Speichergröße angeben und entsprechend reagieren. CPU-Kapazität wird zugewiesen).
Auf jeden Fall bewegt sich der Code (Programm) mit dem "Trigger" namens "Trigger" als Trigger. Mit Java
startet die JVM und das hochgeladene jar
wird ausgeführt. "Trigger" sind beispielsweise stark in AWS-Services integriert
Ist es eine TDB (Trigger Driven Bean), die keine MDB ist? Es muss keine Bean sein, daher ist es möglicherweise besser, sie als TDC (Trigger Driven Code) zu bezeichnen.
Während des Trainings hatte ich viel Zeit für das praktische Training, also schrieb ich einen einfachen Code in Eclipse, der sich im Trainingsterminal befand, und versuchte es. Tests können über die AWS-Konsole gestartet werden, sodass Sie sie problemlos ausprobieren können, ohne einen "Auslöser" definieren zu müssen.
Grundsätzlich funktioniert jedes Java-Programm, wenn Sie die erforderlichen Bibliotheken einschließen, aber die aufzurufende Methode scheint vielversprechend zu sein. Es ist ein Argument. Holen Sie sich "Objekt" als erstes Argument und "Kontext" als zweites Argument. Der Methodenname kann beliebig sein. Es kann von einem beliebigen Typ sein (obwohl sowohl das erste Argument als auch der Rückgabetyp "Seriarizable" sein müssen, sind primitive Typen in Ordnung).
Insbesondere werden die Informationen aus dem "Trigger" in das erste Argument eingegeben. Wenn der Auslöser darin besteht, dass die Nachricht in die Warteschlange gestellt wird, können Sie die Nachricht selbst übergeben. Wenn der Rückgabewert ein synchroner Aufruf ist, sollte er fast gleich sein. Alles, was Sie tun müssen, ist "Serialisieren" und es gemäß Ihren Schnittstellenanforderungen zurückgeben.
Das zweite Argument ist "Kontext", dh "com.amazonaws.services.lambda.runtime.Context", nicht "javax.naming.Context". Daher müssen Sie die von AWS bereitgestellte JAR-Datei (https://mvnrepository.com/artifact/com.amazonaws/aws-lambda-java-core/1.1.0) zu Ihrem Erstellungspfad hinzufügen. [^ 1] [^ 1]: Eclipse hat AWS Toolkit Plugin Da dies der Fall ist, ist es möglich, diese Umgebung einfach einzurichten.
Ich habe noch nicht die Fähigkeiten oder Ideen, um aussagekräftigen Code zu schreiben, und habe mich daher entschlossen zu prüfen, welche Art von Umgebung (Systemeigenschaften, Umgebungsvariablen, übergebene "Kontext" -Objekte) wie ein Infrastruktur-Shop funktioniert.
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();
//Header hinzufügen
sb.append("name,value\n");
//Systemeigenschaften abrufen
Properties prop = System.getProperties();
for(Object key : prop.keySet()) {
String name = (String) key;
String value = prop.getProperty(name);
sb.append(name + "," + value + "\n");
}
//Umgebungsvariablen abrufen
Map<String, String> env = System.getenv();
for(String key : env.keySet()) {
String value = env.get(key);
sb.append(key + "," + value + "\n");
}
//Kontextinformationen abrufen
sb.append("context" + "," + context.toString());
return sb.toString();
}
public static void main(String[] args) {
System.out.println(printSystemInfo(1, null));
}
}
main
dient zum Testen. Das erste Argument soll wichtig sein, aber dieses Mal werde ich nichts tun.
Öffnen Sie die AWS-Konsole und erstellen Sie eine Lambda-Funktion (sie funktioniert in Einheiten, die als Funktionen bezeichnet werden. Es scheint einen Dienst zu geben, der mehrere Funktionen koordiniert (Details noch nicht untersucht)).
Wählen Sie einen geeigneten Namen und eine geeignete Laufzeit (diesmal Java8) und klicken Sie auf "Funktion erstellen".
Da die Standardausgabe in CloudWatch-Protokolle fließt, erstellen Sie vorab eine Rolle mit Schreibberechtigung für CloudWatch-Protokolle und fügen Sie sie bei Bedarf hier hinzu.
Normalerweise würden Sie hier einen Auslöser auswählen, aber ich möchte ihn nur testen, also werde ich nur die Bedingungen dafür eingeben.
Laden Sie im Funktionscode die JAR-Datei von "Upload" hoch. Wichtig ist, dass Sie die hier auszuführende Methode im "Handler" eingeben. Das Format ist fest und es ist der Methodenname mit "." Notation und "::
" nach dem vollständigen Pfad der Klasse.
Diesmal ist es " net.mognet.aws.lambda.SystemInfo :: printSystemInfo
". Ich habe auch Umgebungsvariablen hinzugefügt. Sobald Sie "speichern", wird die Datei tatsächlich hochgeladen.
Als nächstes folgt die Vorbereitung für den Test. Dies ist ein Testfall (Eingabeeinstellung = erste Argumenteinstellung). Wählen Sie oben auf dem Bildschirm "Testereigniseinstellungen".
Da das erste Argument der auszuführenden Methode "public static String printSystemInfo" "int" ist, schreiben Sie zum Abschluss nur 1. Drücken Sie unten auf "Speichern". Jetzt können Sie testen.
Drücken Sie selbstverständlich "Test". Es funktionierte. Da diesmal keine Protokollausgabe (Standardausgabe) vorhanden ist, wurde das Protokoll nicht angezeigt, aber die Start- und Endmeldungen wurden angezeigt. Da die Methode vom Typ "String" ausgeführt wurde, wird die Zeichenfolge "return" unverändert auf dem Bildschirm angezeigt (ich wollte, dass der Zeilenvorschubcode unterbrochen wird, aber dies ist der richtige Weg für die Anzeigekonsole für das Ausführungsergebnis).
Das Ausführungsergebnis ist im Anhang aufgeführt.
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 |
Informationen wie der Zugriffsschlüssel waren ebenfalls in den Umgebungsvariablen enthalten, daher habe ich sie maskiert. Es kann notwendig sein zu verstehen, dass es sich um eine solche Spezifikation handelt. Ist es möglich, die AWS-API mit den hier angegebenen Schlüsseln aufzurufen? Außerdem werden (richtig) auch die richtig eingestellten Umgebungsvariablen angezeigt. Es sieht so aus, als ob es unter OpenJDK unter Amazon Linux läuft. Ich weiß nicht, was passieren wird, wenn dies tatsächlich in Produktion geht. Es ist nur so, dass dies der Fall war, als dieser Test ausgeführt wurde. Schließlich ist es serverlos, sodass die Ausführungsumgebung (HW, OS, MW usw.) keine Rolle spielt. Vielmehr wurde mir klar, dass Lambda-ähnliche Verwendung darin besteht, den Code unter der Annahme zu schreiben, dass es keine Rolle spielt.
Lambda-Funktionshandler (Java) --AWS Lambda
Recommended Posts