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: **
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üß)
Ich werde es so machen
APIfür die Startausführung, um das oben genannte
Lambda` 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).
Lassen Sie uns bereitstellen und verschieben
sls deploy
Versuchen Sie es mit dem Endpunkt, der auf der Konsole angezeigt wird
start-execution Verwenden Sie den damit erhaltenen "executeArn", um die folgende API aufzurufen
describe-execution
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
Oh, der "Status" wurde "ERFOLGREICH" und Sie sagten mir, dass die Ramen abgeschlossen waren.
Nein, es ist wirklich einfach. Ohne dies müsste ich Dynamo und SQS voll ausnutzen und selbst implementieren (Hölle).
Recommended Posts