[PYTHON] Die Geschichte, dass die asynchrone API, die API-Gateway- und Schrittfunktionen kombinierte, die stärkste war

Ist es das stärkste oder einfachste?

Häufig als serverlose Konfiguration API Gateway & Lambda

** API Gateway hat ein Limit von 29 Sekunden **, ** Lambda hat ein 15-Minuten-Limit **

Während Lambdas Leistung voll ausgeschöpft wird Um diese Lücke zu füllen ** Ich möchte eine asynchrone API mit einer möglichst einfachen Konfiguration erstellen ** Ich denke, dort ist.

Was Sie zu dieser Zeit brauchen

--API für das Treten von Lambda --API, um festzustellen, ob der getretene Lambda vollständig ist, und um eine Antwort zu erhalten

Ich denke es ist, aber die Schrittfunktionen unten haben beide **

Step Functions

In Schritt Funktionen Machen Sie den Workflow visuell und ansprechend, z. B. durch die Verknüpfung von Mikrodiensten Kann konfiguriert werden.

** Offizielles Beispiel: ** image.png

https://aws.amazon.com/jp/blogs/news/new-aws-step-functions-build-distributed-applications-using-visual-workflows/

Es ist gefährlich Ich denke ich kann alles machen

Indem Sie Lambda als Aufgabe definieren Sie können es in diesen Workflow integrieren.

Übrigens ist dies die, die ich dieses Mal machen werde (süß)

image.png

API-Gateway erstellen

image.png

Ich werde es so machen

APIfür die Startausführung, um das oben genannteLambda` zu kicken API "für die Beschreibung der Ausführung, um eine Antwort von" Lambda "zu erhalten (Der Name kann alles sein)

** Beide sind POST **

Serverless Framework

https://github.com/ChaseSan/async-api-sample

Ich werde es tatsächlich mit SLS schaffen Es ist viel einfacher als es mit CFn zu machen, Sie müssen "Serverless-Step-Funktionen" als Plug-In einbinden

serverless.yml


plugins:
  - serverless-step-functions

Die Funktion wird so erstellt ** Ramen Timer **

serverless.yml


functions:
  async-api:
    handler: app.lambda_handler
    name: async-api-${self:provider.stage}
    environment:
      TIMER: 30

app.py


import os
from time import sleep
import logging

logger = logging.getLogger()
logger.setLevel(logging.DEBUG)


def lambda_handler(event, context):
    logger.info(f"event: {event}")

    seconds = int(os.environ.get("TIMER"))
    sleep(seconds)

    return {"message": "Ramen wird gekocht. Wenn Sie es nicht schnell essen, wächst es."}

Die Definition von Schrittfunktionen sieht folgendermaßen aus Bei Verwendung des Plugins "Serverless-Step-Funktionen" Schreiben Sie auch die API-Gateway-Definition in den Block "stateMachines"

serverless.yml


stepFunctions:
  stateMachines:
    state-machine:
      name: state-machine-${self:provider.stage}
      events:
        - http:
            path: ${self:custom.basePath}/start-execution
            method: post
            action: StartExecution
            iamRole:
              Fn::GetAtt: [AsyncApiRole, Arn]
            request:
              template:
                application/json: |-
                  {
                    "stateMachineArn":"arn:aws:states:#{AWS::Region}:#{AWS::AccountId}:stateMachine:state-machine-${self:provider.stage}"
                  }
        - http:
            path: ${self:custom.basePath}/describe-execution
            method: post
            action: DescribeExecution
            iamRole:
              Fn::GetAtt: [AsyncApiRole, Arn]
            response:
              template:
                application/json: |-
                  {
                    "input": $util.parseJson($input.json('$.input')),
                    #if($input.path('$.output') != "")
                      "output": $util.parseJson($input.json('$.output')),
                    #end
                    "status": $input.json('$.status')
                  }
      definition:
        StartAt: async-api-task
        States:
          async-api-task:
            Type: Task
            Resource:
              Fn::GetAtt: [async-api, Arn]
            End: true

** Punkte **

{
    "response": $input.json('$'),
}

Auf jeden Fall wird der gesamte Inhalt von DescribeExecution zurückgegeben. Es ist besser, nur das zurückzugeben, was Sie in Bezug auf die Benutzeroberfläche benötigen (wahrscheinlich).

Bewegung

Lassen Sie uns bereitstellen und verschieben sls deploy image.png Versuchen Sie es mit dem Endpunkt, der auf der Konsole angezeigt wird

start-execution image.png Verwenden Sie den damit erhaltenen "executeArn", um die folgende API aufzurufen

describe-execution image.png

Etwas ist zurückgekehrt. status ist RUNNING. Es scheint, dass Ramen noch nicht hergestellt wurde.

Lassen Sie es uns nach einer Weile noch einmal versuchen image.png

Oh, der "Status" wurde "ERFOLGREICH" und Sie sagten mir, dass die Ramen abgeschlossen waren.

das ist alles

Nein, es ist wirklich einfach. Ohne dies müsste ich Dynamo und SQS voll ausnutzen und selbst implementieren (Hölle).

Recommended Posts

Die Geschichte, dass die asynchrone API, die API-Gateway- und Schrittfunktionen kombinierte, die stärkste war
Die Geschichte, dass XGBoost endlich installiert wurde
Eine Geschichte, die Seaborn einfach, bequem und beeindruckt war
PHP- und Python-Beispiele, die die ChatWork-API treffen
Die Geschichte, dass der Rückgabewert von tape.gradient () None war
Die Geschichte, die Japan ausgab, wurde mit Django verwechselt
Die Geschichte, dass meine Pull-Anfrage in Scipy aufgenommen wurde
Die Geschichte, dass die neue Zeichnungsbibliothek "HiPlot" ziemlich gut war
Zabbix API dies und das
Die Geschichte, dass die Version von Python 3.7.7 nicht an Heroku angepasst wurde
Die Geschichte, dass die Homebrew-Umgebung bei der Installation von Anaconda umgehauen wurde
Die Geschichte, dass der Wachmann eingesperrt war, als das Labor auf IoT umgestellt wurde