[JAVA] Erstes AWS Lambda (Ich habe versucht zu sehen, in welcher Umgebung es funktioniert)

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).

Was ist Lambda?

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.

Versuche dich zu bewegen

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.

Sitten und Bräuche

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.

erstellen

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.

Anziehen

Ö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)). スクリーンショット 2018-01-31 21.39.16.png 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. スクリーンショット 2018-01-31 21.39.50.png スクリーンショット 2018-01-31 21.39.57.png 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. スクリーンショット 2018-01-31 21.40.05.png 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. スクリーンショット 2018-01-31 21.41.03.png 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". スクリーンショット 2018-01-31 21.41.19.png 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.

Machen wir das!

Drücken Sie selbstverständlich "Test". スクリーンショット 2018-01-31 21.42.15.png 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).

Blinddarm

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.

Referenz

Lambda-Funktionshandler (Java) --AWS Lambda

Recommended Posts

Erstes AWS Lambda (Ich habe versucht zu sehen, in welcher Umgebung es funktioniert)
Ich habe versucht, den Zugriff von Lambda → Athena mit AWS X-Ray zu visualisieren
Ich habe versucht herauszufinden, was sich in Java 9 geändert hat
Ich habe versucht, eine Umgebung mit WSL2 + Docker + VSCode zu erstellen
Ich habe einen RESAS-API-Client in Java erstellt
Ich habe versucht, die Cache-Funktion von Application Container Cloud Service in der lokalen Umgebung zu entwickeln
Ich habe versucht, die Ajax-Verarbeitung der ähnlichen Funktion in Rails zu implementieren
Untersuchen Sie die Systeminformationen der AWS Lambda-Betriebsumgebung in Java
Ich habe versucht, mit Docker eine Plant UML Server-Umgebung zu erstellen
Ich habe versucht, ein übergeordnetes Wertklasseobjekt in Ruby zu erstellen
Ich habe versucht, den CPU-Kern mit Ruby voll auszunutzen
Ich habe versucht, Java-Lambda-Ausdrücke zusammenzufassen
Was ist Docker? Ich habe versucht zusammenzufassen
Was ich versucht habe, als ich alle Felder einer Bohne bekommen wollte
Ich wusste nicht, was ich in Mavens Bereich schreiben sollte, also habe ich es nachgeschlagen.
Rufen Sie den ersten Wochentag im aktuellen Gebietsschema ab (welcher Tag ist heute?)
Ich habe versucht, polymorph in Nogizaka zu implementieren.
C # (Grund der Kapselung)
Ich habe versucht, neunundneunzig in Java auszugeben
Ich habe versucht, eine Anwendung in 2 Sprachen zu entwickeln
Ich habe versucht, Alexa-Fähigkeiten mit Java zu erstellen
Zusammenfassung dessen, was ich in Spring Batch gelernt habe
Ich möchte ESLint im Maven-Projekt. Ich möchte Node.js ausführen, ohne es in meine Umgebung zu stellen.
Ich habe versucht, den Mechanismus von Emscripten mit einem deutschen Löser zu untersuchen
Ich habe versucht, Docker zu verwenden, weil ich die lokale Umgebung bei der Entwicklung der Registerkarte "Microsoft Teams" von MS Learn nicht verschmutzen möchte
Ich habe versucht zu erklären, was Sie aus Anfängersicht in einer beliebten Sprache für die Webentwicklung tun können.
Ich habe versucht, was ich mit Stream leise versuchen wollte.
Ich habe versucht, die Firebase-Push-Benachrichtigung in Java zu implementieren
Ich habe versucht, SQS mit AWS Java SDK zu betreiben
05. Ich habe versucht, die Quelle von Spring Boot zu löschen
Ich habe versucht, AWS I oT Button und Slack zu integrieren
Ich habe versucht, die Kapazität von Spring Boot zu reduzieren
Ich habe versucht, eine Clova-Fähigkeit in Java zu erstellen
Ich habe versucht, eine Anmeldefunktion mit Java zu erstellen
Ich habe versucht, die Methode der gegenseitigen Teilung von Eugrid in Java zu implementieren
~ Ich habe jetzt versucht, funktionale Programmierung mit Java zu lernen ~
Ich habe mir die Rosen von Versailles angesehen und versucht, das Schlusslied in Java zu reproduzieren
[SwiftUI] Ich habe versucht herauszufinden, wie es sich für jeden angegebenen Hintergrund ändert
Ich möchte den Inhalt von Assets in der mit capistrano erstellten Umgebung von Grund auf neu erstellen