[PYTHON] AWS Step Functions pour apprendre avec un exemple

Step Functions annoncé comme un service de workflow. D'autres services de flux de travail incluent Simple Workflow (SWF), mais pour les nouvelles applications, il est recommandé de prendre en compte les fonctions d'étape. Si vous ne répondez pas à vos besoins, vous pouvez essayer SWF.

Il existe actuellement 6 types de plans disponibles sous forme d'exemples dans les fonctions Step. En regardant simplement ce code, il semble que vous puissiez comprendre les spécifications minimales requises.

Regardez le Blueprint préparé en premier et créez une machine d'état avec toutes sortes d'états définis à la fin.

Blueprint Hello World スクリーンショット 2017-03-01 16.15.44.png

{
  "Comment": "A Hello World example of the Amazon States Language using a Pass state",
  "StartAt": "HelloWorld",
  "States": {
    "HelloWorld": {
      "Type": "Pass",
      "Result": "Hello World!",
      "End": true
    }
  }
}

Wait State スクリーンショット 2017-03-01 16.16.16.png

{
  "Comment": "An example of the Amazon States Language using wait states",
  "StartAt": "FirstState",
  "States": {
    "FirstState": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
      "Next": "wait_using_seconds"
    },
    "wait_using_seconds": {
      "Type": "Wait",
      "Seconds": 10,
      "Next": "wait_using_timestamp"
    },
    "wait_using_timestamp": {
      "Type": "Wait",
      "Timestamp": "2015-09-04T01:59:00Z",
      "Next": "wait_using_timestamp_path"
    },
    "wait_using_timestamp_path": {
      "Type": "Wait",
      "TimestampPath": "$.expirydate",
      "Next": "wait_using_seconds_path"
    },
    "wait_using_seconds_path": {
      "Type": "Wait",
      "SecondsPath": "$.expiryseconds",
      "Next": "FinalState"
    },
    "FinalState": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
      "End": true
    }
  }
}

Retry Failure スクリーンショット 2017-03-01 16.16.43.png

{
  "Comment": "A Retry example of the Amazon States Language using an AWS Lambda Function",
  "StartAt": "HelloWorld",
  "States": {
    "HelloWorld": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
      "Retry": [
        {
          "ErrorEquals": ["HandledError"],
          "IntervalSeconds": 1,
          "MaxAttempts": 2,
          "BackoffRate": 2.0
        },
        {
          "ErrorEquals": ["States.TaskFailed"],
          "IntervalSeconds": 30,
          "MaxAttempts": 2,
          "BackoffRate": 2.0
        },
        {
          "ErrorEquals": ["States.ALL"],
          "IntervalSeconds": 5,
          "MaxAttempts": 5,
          "BackoffRate": 2.0
        }
      ],
      "End": true
    }
  }
}

Parallel スクリーンショット 2017-03-01 16.17.25.png

{
  "Comment": "An example of the Amazon States Language using a parallel state to execute two branches at the same time.",
  "StartAt": "Parallel",
  "States": {
    "Parallel": {
      "Type": "Parallel",
      "Next": "Final State",
      "Branches": [
        {
          "StartAt": "Wait 20s",
          "States": {
            "Wait 20s": {
              "Type": "Wait",
              "Seconds": 20,
              "End": true
            }
          }
        },
        {
          "StartAt": "Pass",
          "States": {
            "Pass": {
              "Type": "Pass",
              "Next": "Wait 10s"
            },
            "Wait 10s": {
              "Type": "Wait",
              "Seconds": 10,
              "End": true
            }
          }
        }
      ]
    },
    "Final State": {
      "Type": "Pass",
      "End": true
    }
  }
}

Catch Failure スクリーンショット 2017-03-01 16.18.05.png

{
  "Comment": "A Catch example of the Amazon States Language using an AWS Lambda Function",
  "StartAt": "HelloWorld",
  "States": {
    "HelloWorld": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
      "Catch": [
        {
          "ErrorEquals": ["HandledError"],
          "Next": "CustomErrorFallback"
        },
        {
          "ErrorEquals": ["States.TaskFailed"],
          "Next": "ReservedTypeFallback"
        },
        {
          "ErrorEquals": ["States.ALL"],
          "Next": "CatchAllFallback"
        }
      ],
      "End": true
    },
    "CustomErrorFallback": {
      "Type": "Pass",
      "Result": "This is a fallback from a custom lambda function exception",
      "End": true
    },
    "ReservedTypeFallback": {
      "Type": "Pass",
      "Result": "This is a fallback from a reserved error code",
      "End": true
    },
    "CatchAllFallback": {
      "Type": "Pass",
      "Result": "This is a fallback from a reserved error code",
      "End": true
    }
  }
}

Choice State スクリーンショット 2017-03-01 16.18.49.png

{
  "Comment": "An example of the Amazon States Language using a choice state.",
  "StartAt": "FirstState",
  "States": {
    "FirstState": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
      "Next": "ChoiceState"
    },
    "ChoiceState": {
      "Type" : "Choice",
      "Choices": [
        {
          "Variable": "$.foo",
          "NumericEquals": 1,
          "Next": "FirstMatchState"
        },
        {
          "Variable": "$.foo",
          "NumericEquals": 2,
          "Next": "SecondMatchState"
        }
      ],
      "Default": "DefaultState"
    },

    "FirstMatchState": {
      "Type" : "Task",
      "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:OnFirstMatch",
      "Next": "NextState"
    },

    "SecondMatchState": {
      "Type" : "Task",
      "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:OnSecondMatch",
      "Next": "NextState"
    },

    "DefaultState": {
      "Type": "Fail",
      "Cause": "No Matches!"
    },

    "NextState": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
      "End": true
    }
  }
}

combiner

Les 7 types d'états suivants sont disponibles.

Créez la machine d'état suivante en utilisant les 7 types d'état.

スクリーンショット 2017-03-01 15.38.58.png

la mise en oeuvre

JSON La machine à états ci-dessus est définie dans JSON comme ci-dessous.

{
	"Comment": "Sample Step functions flow",
    "StartAt": "Process1",
    "States": {
        "Process1": {
            "Type": "Task",
            "Resource": "arn:aws:lambda:us-east-1:XXXXXXXXXXXX:function:Process1",
            "Next": "ChoiceStep"
        },
        "ChoiceStep": {
            "Type": "Choice",
            "Choices": [{
                "Variable": "$.processResult",
                "StringEquals": "Process2a",
                "Next": "SuccessProcess"
            }, {
                "Variable": "$.processResult",
                "StringEquals": "Process2b",
                "Next": "Process2b-1"
            }]
        },
        "SuccessProcess": {
            "Type": "Succeed"
        },
        "Process2b-1": {
            "Type": "Task",
            "Resource": "arn:aws:lambda:us-east-1:XXXXXXXXXXXX:function:Process2",
            "Next": "Process2b-2"
        },
        "Process2b-2": {
            "Type": "Task",
            "Resource": "arn:aws:lambda:us-east-1:XXXXXXXXXXXX:function:Process2",
          	"Catch": [{
              "ErrorEquals": [
                "HandledError"
              ],
              "Next": "FailedProcess"
            }],
            "Next": "Process3"
        },
      	"FailedProcess": {
            "Type": "Fail"      
        },
        "Process3": {
            "Type": "Wait",
            "Seconds": 30,
            "Next": "Process4"
        },
        "Process4": {
            "Type": "Parallel",
            "Next": "Process5",
            "Branches": [
                {
                    "StartAt": "Process4a",
                    "States": {
                        "Process4a": {
                            "Type": "Task",
                            "Resource": "arn:aws:lambda:us-east-1:XXXXXXXXXXXX:function:Process2",
                            "End": true
                        }
                    }
                },
                {
                    "StartAt": "Process4b-1",
                    "States": {
                         "Process4b-1": {
                            "Type": "Task",
                            "Resource": "arn:aws:lambda:us-east-1:XXXXXXXXXXXX:function:Process2",
                            "Retry": [{
                                "ErrorEquals": [
                                    "HandledError"
                                ],
                                "IntervalSeconds": 3,
                                "MaxAttempts": 5,
                                "BackoffRate": 1.5
                            }],
                            "Next": "Process4b-2"
                         },
                         "Process4b-2": {
                            "Type": "Pass",
                            "Result": {
                                "data1": 12345,
                                "data2": -12345
                            },
                            "ResultPath": "$.test-data",
                            "Next": "Process4b-3"
                         },
                         "Process4b-3": {
                            "Type": "Task",
                            "Resource": "arn:aws:lambda:us-east-1:XXXXXXXXXXXX:function:Process2",
                            "End": true
                         }
                    }
                }
            ]
        },
        "Process5": {
          	"Type": "Task",
			"Resource": "arn:aws:lambda:us-east-1:XXXXXXXXXXXX:function:Process3",
            "End": true
        }
    }
}

Fonction Lambda

Préparez les trois fonctions Labda suivantes.

def lambda_handler(event, context):
    event["step"] = 1
    event["processResult"] = "Process2b"
    return event
def lambda_handler(event, context):
    event["step"] += 1
    return event
def lambda_handler(event, context):
    print event
    return event

Procédure de création

  1. Sélectionnez [Fonctions d'étape] dans la console de gestion.

  2. Sélectionnez Commencer.

  3. Entrez ce qui suit et sélectionnez [Create State Machine]. Give a name to your state machine: SampleStateMachineWithVariableOfTypes

Entrez le JSON du précédent.

Lorsque vous appuyez sur le bouton de chargement de l'aperçu, l'état de la machine d'état est affiché.

  1. Entrez ce qui suit et sélectionnez [OK].

IAM role for your state machine executions: StatesExecutionRole-us-east-1

  1. Sélectionnez Nouvelle exécution.
  2. Donnez la valeur suivante comme entrée.
{
    "processResult": "Process2b"
}
  1. Sélectionnez Démarrer l'exécution.

production

Output

output: [{"processResult": "Process2b", "step": 4},{"test-data": {"data1": 12345, "data2": -12345}, "processResult": "Process2b", "step": 5}]

Tips -Vous pouvez vérifier l'exactitude de la syntaxe avec statelint. (J'ai l'impression qu'il y a des moments où c'est inexact.)

def lambda_handler(event, context):
    event["step"] = 1
    event["processResult"] = "Process2b"
    return event

if __name__ == "__main__":
    lambda_handler("","")

Mise en garde

――Je me fâche quand je définis une tâche supplémentaire

référence

Recommended Posts

AWS Step Functions pour apprendre avec un exemple
[AWS] Play with Step Functions (SAM + Lambda) Part.3 (Branch)
Un échantillon pour essayer rapidement les machines de factorisation avec fastFM
[AWS] Play with Step Functions (SAM + Lambda) Part.1 (Basic)
Supprimer les données DynamoDB après 5 minutes avec AWS Step Functions
[AWS] Play with Step Functions (SAM + Lambda) Part.2 (Paramètres)
Apprenez librosa avec un tutoriel 1
Un exemple de python pour apprendre XOR avec un algorithme génétique sur un réseau neuronal
La première étape de la création d'une application sans serveur avec Zappa
Les ingénieurs de données apprennent DevOps en vue de MLOps. ① Prise en main
Comment créer une API de machine learning sans serveur avec AWS Lambda
Apprenez à coloriser les images monochromes avec Chainer
Comment ajouter un package avec PyCharm
Émettre une URL signée avec AWS SQS
Je veux jouer avec aws avec python
Comment utiliser la commande CUT (avec exemple)
Connectez-vous à s3 avec AWS Lambda Python
Exemple de programme pour afficher des vidéos avec PyQt
Créer un référentiel privé avec AWS CodeArtifact
J'ai essayé de créer un service de raccourcissement d'url sans serveur avec AWS CDK
Se préparer à apprendre les indicateurs techniques avec TFlearn
Exemple de conversion en ondelettes d'images en Python
Quand j'ai essayé de créer un VPC avec AWS CDK mais que je n'ai pas pu le faire
[AWS] Comment gérer Wordpress "La réponse n'est pas la bonne réponse JSON"
J'ai essayé de créer un modèle avec l'exemple d'Amazon SageMaker Autopilot
Création d'un mécanisme pour télécharger un gros fichier zip avec une authentification de base avec aws
Comment créer des exemples de données CSV avec hypothèse
Comment lire un fichier CSV avec Python 2/3
Envoyer un message à LINE avec Python (LINE Notify)
[Computer Vision] Géométrie épipolaire apprise avec des chats
Comment envoyer un message à LINE avec curl
Un mémorandum pour faire WebDAV uniquement avec nginx
Ouvrez AI Gym pour apprendre avec le poteau de chariot contrôlé par PD
Créez un environnement WardPress sur AWS avec Pulumi
Comment dessiner un graphique à 2 axes avec pyplot
J'ai essayé d'apprendre le fonctionnement logique avec TF Learn
Essayez Tensorflow avec une instance GPU sur AWS
Apprenez à reconnaître les nombres manuscrits (MNIST) avec Caffe
Comment développer une application de panier avec Django
Créer un ensemble de données en échantillonnant au hasard les données MNIST
Essayez de dessiner une courbe de vie avec python
Comment créer un dictionnaire avec une structure hiérarchique.
Je veux faire un jeu avec Python
Essayez de créer un code de "décryptage" en Python
Serveur de jeu avec deux PC
Décidez d'une mission de laboratoire avec Python (fiction)
Connectez-vous facilement à AWS avec plusieurs comptes
Exemple de notification Slack avec python lambda
Exemple pour dessiner une horloge simple en utilisant ebiten
Étapes pour créer un bot Twitter avec Python
Essayez de créer un groupe de dièdre avec Python
Comment entraîner Kaldi avec JUST Corpus
[Dédié à Telewa! ] J'utilise un PC avec une webcam.
Je veux écrire dans un fichier avec Python
[PyTorch] Exemple ⑧ ~ Comment créer un modèle complexe ~
Zubu amateur veut démarrer Python
Comment utiliser fixture dans Django pour saisir des exemples de données associés au modèle utilisateur
Créez rapidement un tableau de bord d'analyse de données Python avec Streamlit et déployez-le sur AWS
[AWS] J'ai essayé de créer un environnement Python avec un environnement de développement eb [Elastic Beanstalk]