Estoy trabajando en las funciones de AWS Step. He leído la documentación sobre InputPath, OutputPath y ResultPath . Mi problema es que quiero combinar valores de la entrada a una tarea de Lambda con una salida parcial de la tarea.
La entrada a la tarea es similar a la siguiente. Quiero continuar pasando estos valores a tareas posteriores.
{ "previous_task_result": 100, "next_task_input": "asdf" }Lo que me gustaría es que el resultado de mi tarea Lambda se vea así:
{ "previous_task_result": 100, "next_task_input": "asdf", "current_task_result": { "val1": "ghjk", "val2": [0,2,13,100] } } El problema específico es que la salida sin procesar de Lambda Task se ve así. Solo me importa el nodo Payload . El resto de la salida es estándar. Preferiría no pasar por la función de paso.
{ "resourceType": "lambda", "resource": "invoke", "output": { "ExecutedVersion": "$LATEST", "Payload": { "val1": "ghjk", "val2": [0,2,13,100] }, "SdkHttpMetadata": { "HttpHeaders": { "Connection": "keep-alive", "Content-Length": "42", "Content-Type": "application/json", "Date": "Tue, 25 Feb 2020 14:36:29 GMT", "X-Amz-Executed-Version": "$LATEST", "x-amzn-Remapped-Content-Length": "0" }, "HttpStatusCode": 200 }, "SdkResponseMetadata": { "RequestId": "redacted" }, "StatusCode": 200 } } Entiendo cómo usar ResultPath y OutputPath para combinar la entrada con la salida, o asignar la salida a un nodo específico, pero lo que no puedo encontrar es una forma de fusionar solo el nodo Payload del resultado con la entrada existente.
Cuando se trabaja con estados de tareas de Lambda, hay 3 formas en las que puede estructurar el estado de su tarea:
1. Solicitud de respuesta:
Este método devuelve la respuesta completa de la API, incluido el campo SdkHttpMetadata. Sospecho que la razón para devolver la respuesta HTTP completa es que esta es la única forma en que puede invocar una función Lambda de forma asíncrona desde Step Function (las invocaciones de Lambda asíncronas solo devuelven un código de estado). Ejemplo:
"CallLambda": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "Parameters": { "FunctionName": "MyFunction", "InvocationType": "Event|RequestResponse|DryRun", "Payload.$": "$" }, "End": true }2. Lambda ARN como recurso:
Creo que esto es lo que estás buscando. Al especificar el ARN de la función de Lambda como recurso, Step Functions invocará su función de Lambda de forma síncrona y devolverá solo el resultado de su función de Lambda sin los metadatos de respuesta de la API. En este caso, su entrada de estado se pasará como carga útil a su función Lambda o puede usar InputPath/Parameters para filtrar/modificar los datos enviados como carga útil.
"CallLambda": { "Type": "Task", "Resource": "arn:aws:lambda:us-west-2:123456789012:function:my-function", "ResultPath": "$.current_task_result", "End": true }Usando la entrada como en su ejemplo, la Tarea anterior le dará el resultado de la siguiente manera:
{ "previous_task_result": 100, "next_task_input": "asdf", "current_task_result": { <Your Lambda Functions Result> } }3. .WaitForTaskToken:
Pasa un token a su función, detiene la ejecución hasta que se recibe una llamada a SendTaskSuccess o SendTaskFailed (este método solo devolverá el resultado/error de SendTaskSuccess o SendTaskFailed sin metadatos HTTP adicionales).
"CallLambda": { "Type": "Task", "Resource":"arn:aws:states:::lambda:invoke.waitForTaskToken", "Parameters": { "FunctionName": "MyFunction", "Payload":{ "token.$":"$$.Task.Token" } }, "End": true }Para cualquiera que encuentre esto ahora, el ResultSelector (nuevo a partir del 8/2020) realiza exactamente la función que estaba buscando cuando se publicó esto.