[PYTHON] [AWS] Spielen mit Schrittfunktionen (SAM + Lambda) Teil 2 (Parameter)

Überprüfung von Teil.1

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.

Diesmal das Ziel

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.

Vorbereitung

Ändern Sie die Lambda-Funktion

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",
        })
    }

Erstellen / Bereitstellen

Führen Sie in diesem Zustand "sam build" und "sam deploy --guided" aus, um die Lambda-Funktion bereitzustellen.

Versuchen Sie, Lambda ein festes Argument zu übergeben

Ändern Sie die Definition der Zustandsmaschine

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
      }
    }
  }

Versuchen Sie, die Zustandsmaschine auszuführen

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.

sf1.png

Überprüfen Sie die CloudWatch-Protokolle

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.

cw1.png

Sie können sehen, dass die in der Zustandsmaschinendefinition festgelegten Parameter an das erste Argument "Ereignisse" der Lambda-Funktion übergeben wurden.

Versuchen Sie, ein externes Argument an Lambda zu übergeben

Ändern Sie die Definition der Zustandsmaschine

Ä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
      }
    }
  }

Versuchen Sie, die Zustandsmaschine auszuführen

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.

sf2.png

Überprüfen Sie die CloudWatch-Protokolle

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.

cw2.png

Was passiert, wenn für den Eingabewert kein Parameter angegeben ist?

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}'"
}

Versuchen Sie, ein Kontextobjekt an Lambda zu übergeben

Ändern Sie die Definition der Zustandsmaschine

Ä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
      }
    }
  }

Versuchen Sie, die Zustandsmaschine auszuführen

Lassen Sie uns die Zustandsmaschine von der Verwaltungskonsole aus ausführen. Geben Sie "p1" und "p2" an und führen Sie aus.

Überprüfen Sie die CloudWatch-Protokolle

Schauen wir uns nun die CloudWatch-Protokolle für die Lambda-Funktion an.

Sie können sehen, dass eingestellt ist.

cw3.png

Versuchen Sie, den Rückgabewert von Lambda an das Argument einer anderen Aufgabe zu übergeben

Endlich ist es soweit. Dieses Mal möchte ich die Lambda-Funktion von HelloWorld verwenden.

Änderung der Lambda-Funktion

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",
        }
    }

Ändern Sie die Definition der Zustandsmaschine

Dieses Mal werde ich die HelloWorld Lambda-Funktion zweimal aufrufen. Die wichtigsten Änderungen sind diesmal wie folgt.

Der 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
    }
  }
}

Versuchen Sie, die Zustandsmaschine auszuführen

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.

sf5.png

Überprüfen Sie die CloudWatch-Protokolle

Schauen wir uns nun die CloudWatch-Protokolle für die Lambda-Funktion an.

Sie können sehen, dass eingestellt ist.

cw5.png

Zusammenfassung

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.

Beispielcode-Repository

https://github.com/hito-psv/sam-demo-005

Recommended Posts

[AWS] Spielen mit Schrittfunktionen (SAM + Lambda) Teil 2 (Parameter)
[AWS] Spielen mit Schrittfunktionen (SAM + Lambda) Teil 3 (Zweig)
[AWS] Spielen mit Schrittfunktionen (SAM + Lambda) Teil 1 (Basic)
[AWS SAM] Erstellen Sie eine API mit DynamoDB + Lambda + API Gateway
Regelmäßiges Serverless Scraping mit AWS Lambda + Scrapy Teil 1.8
Serverlose Anwendung mit AWS SAM! (APIGATEWAY + Lambda (Python))
AWS-Schrittfunktionen zum Lernen anhand eines Beispiels
Löschen Sie DynamoDB-Daten nach 5 Minuten mit den AWS-Schrittfunktionen
PyTorch mit AWS Lambda [Lambda-Import]
[AWS] Versuchen Sie, die Python-Bibliothek mit SAM + Lambda (Python) zur Ebene hinzuzufügen.
Erstellen Sie mit AWS SAM schnell eine API mit Python, Lambda und API Gateway
[AWS] API mit API Gateway + Lambda erstellen
Regelmäßiges Serverless Scraping mit AWS Lambda + Scrapy Teil 1
[AWS] Verwenden von INI-Dateien mit Lambda [Python]
Spielen Sie handschriftliche Zahlen mit Python Teil 2 (identifizieren)
Ich möchte mit aws mit Python spielen
[AWS] Verknüpfen Sie Lambda und S3 mit boto3
Stellen Sie mit AWS Lambda Python eine Verbindung zu s3 her
[AWS] Machen Sie SSI-ähnliche Dinge mit S3 / Lambda
Ich habe gerade FizzBuzz mit AWS Lambda gemacht
LINE BOT mit Python + AWS Lambda + API Gateway
Ich habe versucht, AWS Lambda mit anderen Diensten zu verbinden
Automatisierung des Infrastrukturbaus mit CloudFromation + Tropical + AWS Lambda
Ich wollte die Google-Tabelle mit AWS Lambda betreiben, also habe ich es versucht [Teil 2]