Saltar al contenido

Cómo compartir datos en “AWS Step Functions” sin pasarlos entre los pasos

Solución:

Puedes hacer uso de InputPath y ResultPath. En initStep solo enviaría los datos necesarios a un servicio externo (probablemente junto con algún identificador único de ejecución). En el ValidaitonWaiting paso puede establecer las siguientes propiedades (en la definición de máquina de estado):

  • InputPath: ¿Qué datos se proporcionarán a GetActivityTask. Probablemente quieras configurarlo en algo como $.execution_unique_id dónde execution_unique_id Es un campo en sus datos que el servicio externo usa para identificar la ejecución (para que coincida con una solicitud específica durante initStep).
  • ResultPath: Donde la salida de la actividad de ValidationWaiting se guardará en los datos. Puedes configurarlo para $.validation_output y el resultado json del servicio externo estará presente allí.

De esta manera, puede enviar a un servicio externo solo los datos que realmente necesita y no perderá el acceso a los datos que estaban previamente (antes ValidationWaiting paso) en la entrada.

Por ejemplo, podría tener la siguiente definición de la máquina de estado:

{
  "StartAt": "initStep",
  "States": {
    "initStep": {
      "Type": "Pass",
      "Result": {
        "executionId": "some:special:id",
        "data": {},
        "someOtherData": {"value": "key"}
      },
      "Next": "ValidationWaiting"
    },
    "ValidationWaiting": {
      "Type": "Pass",
      "InputPath": "$.executionId",
      "ResultPath": "$.validationOutput",
      "Result": {
        "validationMessages": ["a", "b"]
      },
      "Next": "Complete"
    },
    "Complete": {
      "Type": "Pass",
      "End": true
    }
  }
}

he usado Pass estados para initStep y ValidationWaiting para simplificar el ejemplo (no lo he ejecutado, pero debería funcionar). Result el campo es específico para Pass tarea y es equivalente al resultado de sus funciones Lambda o Actividad.

En este escenario Complete paso obtendría la siguiente entrada:

{
  "executionId": "some:special:id",
  "data": {},
  "someOtherData": {"value": key"},
  "validationOutput": {
    "validationMessages": ["a", "b"]
  }
}

Entonces el resultado de ValidationWaiting el paso se ha guardado en validationOutput campo.

Basándome en la respuesta de Marcin Sucharski, se me ocurrió mi propia solución.

Necesitaba usar Type: Task ya que initStep es una lambda, que envía SQS.

Yo no necesitaba InputPath en ValidationWaiting, pero sólo ResultPath, que almacenan los datos recibidos en actividad.

Trabajo con el marco sin servidor, aquí está mi solución final:

StartAt: initStep
States: 
  initStep:
    Type: Task
    Resource: arn:aws:lambda:#{AWS::Region}:#{AWS::AccountId}:function:init-step
    Next: ValidationWaiting
  ValidationWaiting:
    Type: Task
    ResultPath: $.validationOutput
    Resource: arn:aws:states:#{AWS::Region}:#{AWS::AccountId}:activity:validationActivity
    Next: Complete
    Catch:
      - ErrorEquals:
        - States.ALL
      ResultPath: $.validationOutput
      Next: Complete
  Complete:
    Type: Task
    Resource: arn:aws:lambda:#{AWS::Region}:#{AWS::AccountId}:function:complete-step
    End: true
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *