[PYTHON] [AWS] Spielen mit Schrittfunktionen (SAM + Lambda) Teil 1 (Basic)

Was sind Schrittfunktionen?

AWS Step Functions ist ein Service zum Konvertieren von Microservice-Komponenten in Workflows.

Status

Mit Schrittfunktionen können Sie je nach Status verschiedene Aktionen steuern. Die Zustände sind wie folgt.

Status Steuerung
Task Arbeiten Sie an der Zustandsmaschine
Choice Wählen Sie zwischen Ausführungsoptionen
Fail or Succeed Beenden Sie die Ausführung bei Fehler oder Erfolg
Pass Übergeben Sie einfach die Eingabe an die Ausgabe oder geben Sie einige feste Daten aus
Wait Feste Zeit oder festgelegte Zeit/Geben Sie eine Verzögerung bis zum Datum an
Parallel Starten Sie einen parallelen Ausführungszweig
Map Schritte dynamisch wiederholen

In Task verfügbare Dienste

Die folgenden Dienste können für Task of Step-Funktionen angegeben werden.

Diesmal das Ziel

Step Functions hat eine sehr große Bandbreite, und selbst wenn Sie Step Functions + Lambda allein betrachten, ist es ziemlich breit. Da der Inhalt des Beitrags sehr groß sein kann, werden wir den folgenden Inhalt für diesen Beitrag verwenden. Das nächste Mal möchte ich die Teile wie das Übergeben von Parametern, das Ändern von Aufgaben in Abhängigkeit von den Bedingungen und das Ausführen eines anderen Dienstes behandeln.

--Erstellen Sie die Lambda-Funktion (SAM)

Annahme

SAM Für SAM siehe unten.

Bereiten Sie die Lambda-Funktion vor

Erstellen Sie zunächst ein Hello World-Projekt mit Runtime in Python (3.8).

$ sam init --runtime=python3.8
Which template source would you like to use?
	1 - AWS Quick Start Templates
	2 - Custom Template Location
Choice: 1

Project name [sam-app]:

Cloning app templates from https://github.com/awslabs/aws-sam-cli-app-templates.git

AWS quick start application templates:
	1 - Hello World Example
	2 - EventBridge Hello World
	3 - EventBridge App from scratch (100+ Event Schemas)
	4 - Step Functions Sample App (Stock Trader)
	5 - Elastic File System Sample App
Template selection: 1

-----------------------
Generating application:
-----------------------
Name: sam-app
Runtime: python3.8
Dependency Manager: pip
Application Template: hello-world
Output Directory: .

Next steps can be found in the README file at ./sam-app/README.md

Dieses Mal benötigen wir kein API-Gateway. Bearbeiten Sie daher die Datei "template.yml" wie folgt. Sie müssen "Ereignisse" nicht in "AWS :: Serverless :: Function" definieren. Auch "Outputs" selbst sind nicht erforderlich.

template.yml


AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  sam-app

  Sample SAM Template for sam-app

# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
  Function:
    Timeout: 3

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: hello_world/
      Handler: app.lambda_handler
      Runtime: python3.8

Führen Sie nach dem Speichern "sam build" und "sam deploy --guided" aus, um sie bereitzustellen.

Konfigurieren Sie eine Zustandsmaschine mit Schrittfunktionen

Vorbereitung

Lassen Sie uns zunächst die notwendigen Vorbereitungen treffen, um die Zustandsmaschine zu konfigurieren. Es wird eine Rollendefinition hinzugefügt, damit diese über die Schrittfunktion als Einstellung für die Lambda-Funktion aufgerufen werden kann. In Hello World erstellte Vorlagen weisen der Lambda-Funktion eine Standardrolle zu, sodass Sie sie explizit erstellen und zuweisen müssen. Spielen wir jetzt mit template.yml.

template.yml


AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  sam-app

  Sample SAM Template for sam-app

# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
  Function:
    Timeout: 3

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: hello_world/
      Handler: app.lambda_handler
      Runtime: python3.8
      Role: !GetAtt HelloWorldFunctionRole.Arn
  HelloWorldFunctionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - lambda.amazonaws.com
            Action:
              - sts:AssumeRole
      Path: /
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
        - arn:aws:iam::aws:policy/AWSStepFunctionsReadOnlyAccess

Definition der Zustandsmaschine hinzufügen

Erstellen Sie als Nächstes die Zustandsmaschinendefinition im Json-Format. Erstellen Sie zunächst ein Verzeichnis, in dem die Dateien abgelegt werden, und erstellen Sie dort eine neue Datei.

$ mkdir step_functions
$ touch step_functions/state_machine.json

Definieren Sie als Nächstes die Zustandsmaschine.

step_functions/state_machine.json


{
  "StartAt": "hello world",
  "States": {
    "hello world": {
      "Type": "Task",
      "Resource": "${HelloWorldFunction}",
      "End": true
    }
  }
}

template.yml


AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  sam-app

  Sample SAM Template for sam-app

# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
  Function:
    Timeout: 3

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: hello_world/
      Handler: app.lambda_handler
      Runtime: python3.8
      Role: !GetAtt HelloWorldFunctionRole.Arn
  HelloWorldFunctionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - lambda.amazonaws.com
            Action:
              - sts:AssumeRole
      Path: /
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
        - arn:aws:iam::aws:policy/AWSStepFunctionsReadOnlyAccess
  StateMachine:
    Type: AWS::Serverless::StateMachine
    Properties:
      DefinitionUri: step_functions/state_machine.json
      DefinitionSubstitutions:
        HelloWorldFunction: !GetAtt HelloWorldFunction.Arn
      Role: !GetAtt StateMachineRole.Arn
  StateMachineRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - states.amazonaws.com
            Action:
              - sts:AssumeRole
      Path: /
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSLambdaRole
        - arn:aws:iam::aws:policy/CloudWatchLogsFullAccess

Hinzufügen einer Zustandsmaschinendefinition zu einer SAM-Vorlage Zum Schluss fügen wir template.yml eine Zustandsmaschinendefinition hinzu. Führen Sie dann "sam build" und "sam deploy --guided" aus. Lassen Sie uns zuerst den aktuellen Status überprüfen. Wählen Sie in der Verwaltungskonsole "Schrittfunktionen". Sie können sehen, dass die Zustandsmaschine bereitgestellt wird.

sfn1.png

Schauen wir uns hier den Inhalt der Zustandsmaschine an. Wenn ich mir den Inhalt der "Definition" anschaue, denke ich, dass es wie folgt aussieht.

sfn2.png

Sie können sehen, dass hello_world heißt. Sie können auch sehen, dass der "Resource" -Teil des Json-Inhalts von "Definition" durch den ARN der Lambda-Funktion ersetzt wurde.

Versuche zu rennen

Lassen Sie uns nun die Zustandsmaschine ausführen. Klicken Sie auf der Registerkarte Ausführen auf die Schaltfläche Ausführung starten, um die Zustandsmaschine auszuführen.

sfn3.png

Dieses Mal werden die Parameter usw. nicht auf der Lambda-Seite empfangen, daher ist es in Ordnung, die Eingabe so auszuführen, wie sie ist.

sfn5.png

Die Ausführung ist sofort abgeschlossen und Sie können den Ereignisverlauf überprüfen.

sfn6.png

Wenn Sie die verknüpfte Cloud Watch überprüfen, können Sie sicher sein, dass die Lambda-Funktion aufgerufen wird.

Zusammenfassung

Dieses Mal halte ich es für wichtig, diesen Punkt zuerst fest zu unterdrücken, da dies die grundlegende Operation in den Grundlagen ist. Das nächste Mal möchte ich das Einstellen von Parametern, das Aufrufen anderer als Lambda von Task und die bedingte Verzweigung diskutieren.

Beispielcode-Repository

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

Recommended Posts

[AWS] Spielen mit Schrittfunktionen (SAM + Lambda) Teil 1 (Basic)
[AWS] Spielen mit Schrittfunktionen (SAM + Lambda) Teil 2 (Parameter)
[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
[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
Spiele mit einer Schildkröte mit Schildkrötengrafiken (Teil 1)
[AWS] API mit API Gateway + Lambda erstellen
Regelmäßiges Serverless Scraping mit AWS Lambda + Scrapy Teil 1
Benachrichtigen Sie HipChat mit AWS Lambda (Python)
[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
[Piyopiyokai # 1] Spielen wir mit Lambda: Erstellen einer Lambda-Funktion
Erreichen Sie eine grundlegende Authentifizierung mit CloudFront Lambda @ Edge mit Python 3.8
LINE BOT mit Python + AWS Lambda + API Gateway
[AWS] Versuchen Sie, API Gateway + Lambda mit X-Ray zu verfolgen
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]