Crear una máquina de estado de actividad con Step Functions - AWS Step Functions

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Crear una máquina de estado de actividad con Step Functions

En este tutorial, se explica cómo crear una máquina de estado basada en actividades utilizando Java y AWS Step Functions. Las actividades le permiten controlar código de proceso de trabajo que se ejecuta en otra parte de la máquina de estado. Para obtener información general, consulte Actividades en Cómo funciona Step Functions.

Necesitará lo siguiente para completar este tutorial:

  • SDK de para Java. La actividad de ejemplo de este tutorial es una aplicación Java que utiliza el AWS SDK for Java para comunicarse con AWS.

  • AWS credenciales en el entorno o en el archivo AWS de configuración estándar. Para obtener más información, consulte Configurar sus AWS credenciales en la Guía para AWS SDK for Java desarrolladores.

Paso 1: Crear una actividad

Tiene que conseguir que Step Functions reconozca la actividad cuyo proceso de trabajo (programa) desea crear. Step Functions responde con un nombre de recurso de Amazon (ARN) que establece la identidad de la actividad. Debe usar esta identidad para coordinar la información que se pasa entre la máquina de estado y el proceso de trabajo.

importante

Asegúrese de que la tarea de su actividad esté en la misma AWS cuenta que su máquina de estado.

  1. En la consola de Step Functions, en el panel de navegación de la izquierda, elija Actividades.

  2. Seleccione Crear actividad.

  3. Escriba un Nombre de la actividad, por ejemplo, get-greeting y, a continuación, elija Crear actividad.

  4. Cuando se crea la tarea de actividad, tome nota de su ARN, como se muestra en el siguiente ejemplo.

    arn:aws:states:us-east-1:123456789012:activity:get-greeting

Paso 2: Crear una máquina de estado

Cree una máquina de estado que determine cuándo se va a invocar la actividad y cuándo el proceso de trabajo debe realizar el trabajo principal, recopilar los resultados y devolverlos. Para crear la máquina de estado, utilice el Editor de código de Workflow Studio.

  1. En la consola de Step Functions, en el panel de navegación de la izquierda, elija Máquinas de estado.

  2. En la página Máquinas de estado, elija Crear máquina de estado.

  3. En el cuadro de diálogo Elegir una plantilla, seleccione En blanco.

  4. Elija Seleccionar. Se abrirá Workflow Studio en Modo Diseño.

  5. Para este tutorial, escribirá la definición de Lenguaje de estados de Amazon (ASL) de su máquina de estado en el editor de código. Para ello, elija Código.

  6. Elimine el código reutilizable existente y pegue el siguiente código. Recuerde reemplazar el ARN de ejemplo en este código por el ARN de la tarea de actividad que creó anteriormente en el campo Resource.

    { "Comment": "An example using a Task state.", "StartAt": "getGreeting", "Version": "1.0", "TimeoutSeconds": 300, "States": { "getGreeting": { "Type": "Task", "Resource": "arn:aws:states:us-east-1:123456789012:activity:get-greeting", "End": true } } }

    Esta es una descripción de la máquina de estado realizada mediante el Lenguaje de estados de Amazon (ASL). Define un único estado Task llamado getGreeting. Para obtener más información, consulte Estructura de las máquinas de estado.

  7. En el Panel de visualización de gráficos, asegúrese de que el gráfico de flujo de trabajo de la definición de ASL que ha agregado tiene un aspecto similar al siguiente gráfico.

  8. Especifique un nombre para la máquina de estado. Para ello, selecciona el icono de edición situado junto al nombre predeterminado de la máquina de estado MyStateMachine. A continuación, en Configuración de máquina de estado, especifique un nombre en el cuadro Nombre de la máquina de estado.

    En este tutorial, ingrese el nombre ActivityStateMachine.

  9. (Opcional) En Configuración de máquina de estado, especifique otros ajustes del flujo de trabajo, como el tipo de máquina de estado y su función de ejecución.

    Para este tutorial, mantenga todas las selecciones predeterminadas en Configuración de máquina de estado.

    Si ya ha creado un rol de IAM con los permisos correctos para su máquina de estado y desea utilizarlo, en Permisos, seleccione Elegir un rol existente y, a continuación, seleccione un rol de la lista. O seleccione Escribir un ARN de rol y, a continuación, proporcione un ARN para ese rol de IAM.

  10. En el cuadro de diálogo Confirmar creación de rol, elija Confirmar para continuar.

    También puede seleccionar Ver configuración de rol para volver a Configuración de máquina de estado.

    nota

    Si se elimina el rol de IAM que crea Step Functions, no se podrá volver a crear más adelante. Asimismo, si se modifica el rol (por ejemplo, eliminando Step Functions de las entidades principales de la política de IAM), Step Functions no podrá restablecer la configuración original más adelante.

Paso 3: Implementar un proceso de trabajo

Cree un proceso de trabajo. Un proceso de trabajo es un programa que se encarga de:

  • Sondear Step Functions en busca de actividades utilizando la acción de API GetActivityTask.

  • Realizar el trabajo de la actividad a través del código especificado (por ejemplo, el método getGreeting() del código siguiente).

  • Devolver los resultados a través de las acciones de la API SendTaskSuccess, SendTaskFailure y SendTaskHeartbeat.

nota

Para ver un ejemplo de un proceso de trabajo de actividad más completo, consulte Ejemplo de proceso de trabajo de actividad en Ruby. Este ejemplo proporciona una implementación basada en prácticas recomendadas que puede utilizar como referencia para crear un proceso de trabajo de actividad. El código implementa un patrón consumidor-productor con un número configurable de subprocesos para sondeadores y procesos de trabajo de actividad.

Para implementar el proceso de trabajo

  1. Cree un archivo denominado GreeterActivities.java.

  2. Agréguele el código siguiente.

    import com.amazonaws.ClientConfiguration; import com.amazonaws.auth.EnvironmentVariableCredentialsProvider; import com.amazonaws.regions.Regions; import com.amazonaws.services.stepfunctions.AWSStepFunctions; import com.amazonaws.services.stepfunctions.AWSStepFunctionsClientBuilder; import com.amazonaws.services.stepfunctions.model.GetActivityTaskRequest; import com.amazonaws.services.stepfunctions.model.GetActivityTaskResult; import com.amazonaws.services.stepfunctions.model.SendTaskFailureRequest; import com.amazonaws.services.stepfunctions.model.SendTaskSuccessRequest; import com.amazonaws.util.json.Jackson; import com.fasterxml.jackson.databind.JsonNode; import java.util.concurrent.TimeUnit; public class GreeterActivities { public String getGreeting(String who) throws Exception { return "{\"Hello\": \"" + who + "\"}"; } public static void main(final String[] args) throws Exception { GreeterActivities greeterActivities = new GreeterActivities(); ClientConfiguration clientConfiguration = new ClientConfiguration(); clientConfiguration.setSocketTimeout((int)TimeUnit.SECONDS.toMillis(70)); AWSStepFunctions client = AWSStepFunctionsClientBuilder.standard() .withRegion(Regions.US_EAST_1) .withCredentials(new EnvironmentVariableCredentialsProvider()) .withClientConfiguration(clientConfiguration) .build(); while (true) { GetActivityTaskResult getActivityTaskResult = client.getActivityTask( new GetActivityTaskRequest().withActivityArn(ACTIVITY_ARN)); if (getActivityTaskResult.getTaskToken() != null) { try { JsonNode json = Jackson.jsonNodeOf(getActivityTaskResult.getInput()); String greetingResult = greeterActivities.getGreeting(json.get("who").textValue()); client.sendTaskSuccess( new SendTaskSuccessRequest().withOutput( greetingResult).withTaskToken(getActivityTaskResult.getTaskToken())); } catch (Exception e) { client.sendTaskFailure(new SendTaskFailureRequest().withTaskToken( getActivityTaskResult.getTaskToken())); } } else { Thread.sleep(1000); } } } }
    nota

    La clase EnvironmentVariableCredentialsProvider de este ejemplo presupone que se han establecido las variables de entorno AWS_ACCESS_KEY_ID (o AWS_ACCESS_KEY) y AWS_SECRET_KEY (o AWS_SECRET_ACCESS_KEY). Para obtener más información sobre cómo proporcionar las credenciales necesarias a la fábrica, consulte AWSCredentialsProviderla referencia de la AWS SDK for Java API y la sección Configuración de AWS credenciales y región para el desarrollo de la guía para AWS SDK for Java desarrolladores.

    De forma predeterminada, el AWS SDK esperará hasta 50 segundos para recibir los datos del servidor en relación con cualquier operación. La operación GetActivityTask es una operación de sondeo largo que esperará hasta 60 segundos a la siguiente tarea disponible. Para evitar recibir un SocketTimeoutException error, SocketTimeout establézcalo en 70 segundos.

  3. En la lista de parámetros del constructor GetActivityTaskRequest().withActivityArn(), sustituya el valor ACTIVITY_ARN por el ARN de la tarea de actividad que creó anteriormente.

Paso 4: Ejecutar la máquina de estado

Cuando se inicia la ejecución de la máquina de estado, el proceso de trabajo sondea Step Functions en busca de actividades, realiza su trabajo (utilizando los datos de entrada proporcionados) y devuelve los resultados.

  1. En la ActivityStateMachinepágina, elija Iniciar ejecución.

    Aparece el cuadro de diálogo Iniciar ejecución.

  2. En el cuadro de diálogo Iniciar ejecución, haga lo siguiente:

    1. (Opcional) Para identificar la ejecución, puede especificar un nombre en el cuadro Nombre. De forma predeterminada, Step Functions genera automáticamente un nombre de ejecución único.

      nota

      Step Functions le permite crear nombres para máquinas de estados, ejecuciones y actividades, así como etiquetas que contienen caracteres no ASCII. Estos nombres que no son ASCII no funcionan con Amazon. CloudWatch Para asegurarse de que puede realizar un seguimiento de CloudWatch las métricas, elija un nombre que utilice únicamente caracteres ASCII.

    2. En el cuadro Entrada, introduzca la siguiente entrada de JSON para ejecutar el flujo de trabajo.

      { "who": "AWS Step Functions" }
    3. Seleccione Iniciar ejecución.

    4. La consola de Step Functions le dirige a una página cuyo título es su ID de ejecución. Esta página se conoce como Detalles de la ejecución. En esta página, puede revisar los resultados de la ejecución a medida que avanza la ejecución o una vez finalizada.

      Para revisar los resultados de la ejecución, elija los estados individuales en la Vista de gráfico y, a continuación, elija las pestañas individuales del panel Detalles del paso para ver los detalles de cada estado, incluidas la entrada, la salida y la definición, respectivamente. Para obtener más información sobre la ejecución que puede ver en la página Detalles de la ejecución, consulte Página de detalles de ejecución: información general de la interfaz.

Paso 5: Ejecutar y detener el proceso de trabajo

Para que el proceso de trabajo pueda sondear la máquina de estado en busca de actividades, es necesario ejecutarlo.

  1. En la línea de comandos, vaya al directorio en el que creó GreeterActivities.java.

  2. Para usar el AWS SDK, agrega la ruta completa de los third-party directorios lib y a las dependencias del archivo de compilación y a tu archivo de Java. CLASSPATH Para obtener más información, consulte Descargue y extraiga el SDK (no se recomienda) en la Guía para desarrolladores de AWS SDK for Java .

  3. Compile el archivo.

    $ javac GreeterActivities.java
  4. Ejecute el archivo .

    $ java GreeterActivities
  5. En la consola de Step Functions, vaya a la página Detalles de ejecución.

  6. Cuando se complete la ejecución, examine los resultados.

  7. Detenga el proceso de trabajo.