In Teil 1 haben wir hauptsächlich Folgendes getan.
--Erstellen Sie die Lambda-Funktion (SAM)
Dieses Mal werde ich von der Fortsetzung ausgehen. Wenn Sie von hier aus beginnen, https://github.com/hito-psv/sam-demo-004 Es ist in Ordnung, den Code von "git clone" zu haben, oder Sie können ihn in Part1 ausprobieren.
Ich würde gerne zielen. Für den Lambda-Teil möchte ich mit der in Teil 1 erstellten Funktion "Hallo Welt" herumspielen und verschiedene Dinge ausprobieren.
Grundsätzlich ist es immer noch Hello World, aber um den Inhalt des Arguments zu überprüfen, fügen wir nur die Beschreibung hinzu, die den Inhalt des Arguments an CloudWatch ausgibt.
hello_world / app.py
ist immer noch die Standardeinstellung, die aus der Vorlage erstellt wurde. Versuchen Sie also Folgendes, einschließlich Refactoring.
hello_world/app.py
import json
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def lambda_handler(event, context):
logger.info(event)
return {
"statusCode": 200,
"body": json.dumps({
"message": "hello world",
})
}
Führen Sie in diesem Zustand "sam build" und "sam deploy --guided" aus, um die Lambda-Funktion bereitzustellen.
Erstens ist es ein fester Parameter, aber Sie müssen die Zustandsmaschinendefinition ändern. Die Änderung besteht darin, "Parameter" hinzuzufügen.
step_functions/state_machine.json
{
"StartAt": "hello world",
"States": {
"hello world": {
"Type": "Task",
"Resource": "${HelloWorldFunction}",
"Parameters": {
"p1": 100,
"p2": "0123",
"p3": {
"p3-1": 20,
"p3-2": "xyz"
}
},
"End": true
}
}
}
Lassen Sie uns die Zustandsmaschine von der Verwaltungskonsole aus ausführen. Dieses Mal sind die Parameter, die an die Zustandsmaschinendefinition übergeben werden sollen, fest eingestellt, sodass die Eingabe in Ordnung ist.
Sie können von der Zustandsmaschine zu CloudWatch-Protokollen der ausgeführten Lambda-Funktion wechseln. Überprüfen Sie daher von dort aus den Inhalt des Protokolls.
Sie können sehen, dass die in der Zustandsmaschinendefinition festgelegten Parameter an das erste Argument "Ereignisse" der Lambda-Funktion übergeben wurden.
Ändern Sie dann die Definition der Zustandsmaschine, um den Eingabewert für den Parameter in die Zustandsmaschine zu verwenden. Der Punkt ist
ist. Lassen Sie es uns nun unter Berücksichtigung dieser Probleme beheben.
step_functions/state_machine.json
{
"StartAt": "hello world",
"States": {
"hello world": {
"Type": "Task",
"Resource": "${HelloWorldFunction}",
"Parameters": {
"p1.$": $.p1,
"p2.$": "$.p2",
"p3": {
"p3-1": 20,
"p3-2": "xyz"
},
"all.$": "$"
},
"End": true
}
}
}
Lassen Sie uns die Zustandsmaschine von der Verwaltungskonsole aus ausführen. Dieses Mal werden wir p1 und p2 verwenden, also geben Sie die Eingabe-Orchidee wie folgt an.
Schauen wir uns nun die CloudWatch-Protokolle für die Lambda-Funktion an.
Sie können sehen, dass eingestellt ist. Die Reihenfolge wurde geändert, aber es gibt kein Problem mit der Referenz als Json-Daten.
Beim Ausführen der Zustandsmaschine
{
"Comment": "Insert your JSON here"
}
Was passiert, wenn in der Definition der Zustandsmaschine kein "p1" oder "p2" erforderlich ist, die Ausführung der Zustandsmaschine jedoch fehlschlägt? In diesem Fall schlägt die Zustandsmaschine fehl, bevor die Lambda-Funktion aufgerufen wird.
{
"error": "States.Runtime",
"cause": "An error occurred while executing the state 'hello world' (entered at the event id #2). The JSONPath '$.p1' specified for the field 'p1.$' could not be found in the input '{\n \"Comment\": \"Insert your JSON here\"\n}'"
}
Ändern Sie die Zustandsmaschine auf die gleiche Weise, aber was ist vorher ein Kontextobjekt? Es gibt eine Frage. Ein Kontextobjekt ist eine Information über eine Zustandsmaschine und deren Ausführung. Insbesondere Rolleninformationen, Ausführungszeit, Aufgabenname usw. Übergeben eines Kontextobjekts an eine Lambda-Funktion
ist. Lassen Sie es uns nun unter Berücksichtigung dieser Probleme beheben.
step_functions/state_machine.json
{
"StartAt": "hello world",
"States": {
"hello world": {
"Type": "Task",
"Resource": "${HelloWorldFunction}",
"Parameters": {
"p1.$": $.p1,
"p2.$": "$.p2",
"p3": {
"p3-1": 20,
"p3-2": "xyz"
},
"all.$": "$",
"context.$": "$$"
},
"End": true
}
}
}
Lassen Sie uns die Zustandsmaschine von der Verwaltungskonsole aus ausführen. Geben Sie "p1" und "p2" an und führen Sie aus.
Schauen wir uns nun die CloudWatch-Protokolle für die Lambda-Funktion an.
Sie können sehen, dass eingestellt ist.
Endlich ist es soweit. Dieses Mal möchte ich die Lambda-Funktion von HelloWorld verwenden.
Zunächst gibt die aktuelle HelloWorld Lambda-Funktion das folgende Ergebnis aus.
{
"statusCode": 200,
"body": "{\"message\": \"hello world\"}"
}
Tatsächlich ist dies ein wenig problematisch, und das Ergebnis des "body" -Teils ist zu Zeichenkettendaten geworden. Lassen Sie uns also die Lambda-Funktion ein wenig optimieren, damit sie in ihrer Json-Struktur zurückgegeben werden kann. Entfernen Sie einfach den zusätzlichen Zeichenfolgenprozess, wenn Sie das Ergebnis zurückgeben.
hello_world/app.py
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def lambda_handler(event, context):
logger.info(event)
return {
"statusCode": 200,
"body": {
"message": "hello world",
}
}
Dieses Mal werde ich die HelloWorld Lambda-Funktion zweimal aufrufen. Die wichtigsten Änderungen sind diesmal wie folgt.
ResultPath
und OutputPath
zu Hallo Welt 1
hinzugefügtDer ResultPath
von hello_world_1
enthält das Ergebnis der Lambda-Funktion mit dem Schlüsselnamen hello_world_result
.
Verwenden Sie "Ausgabepfad", um den Inhalt des gesamten Eingabeinhalts wiederzugeben.
In hello_world_2
wird durch Angabe von" $ "in InputPath
der gesamte Eingabewert für hello world 1
einschließlich hello_world_result
an die Lambda-Funktion übergeben.
step_functions/state_machine.json
{
"StartAt": "hello world 1",
"States": {
"hello world 1": {
"Type": "Task",
"Resource": "${HelloWorldFunction}",
"Parameters": {
"p1.$": $.p1,
"p2.$": "$.p2",
"p3": {
"p3-1": 20,
"p3-2": "xyz"
},
"all.$": "$"
},
"ResultPath": "$.hello_world_result",
"OutputPath": "$",
"Next": "hello world 2"
},
"hello world 2": {
"Type": "Task",
"Resource": "${HelloWorldFunction}",
"InputPath": "$",
"End": true
}
}
}
Lassen Sie uns die Zustandsmaschine von der Verwaltungskonsole aus ausführen. Geben Sie "p1" und "p2" an und führen Sie aus.
Stellen Sie zunächst sicher, dass Sie zweimal "Hallo Welt 1" und "Hallo Welt 2" genannt werden.
Schauen wir uns nun die CloudWatch-Protokolle für die Lambda-Funktion an.
hello_world_2
(blauer Rahmen) wird zusätzlich zum Parameter von hello world 1
die Antwort von hello world 1
( hello_world_result
) hinzugefügt.Sie können sehen, dass eingestellt ist.
Dieses Mal habe ich versucht zu überprüfen, wie Parameter und Ergebnisse übergeben werden. Wenn Sie lernen, wie man "$" benutzt, wird es nicht so schwierig sein.
Das nächste Mal möchte ich die Verzweigung aufgrund des Ergebnisses untersuchen.
https://github.com/hito-psv/sam-demo-005
Recommended Posts