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 Más información sobre las actividades de Step Functions en Aprenda sobre las máquinas de estado en Step Functions.
Necesitará lo siguiente para completar este tutorial:
-
El SDK para Java
. La actividad que se utiliza como ejemplo en este tutorial es una aplicación de Java que utiliza AWS SDK para Java para comunicarse con AWS. -
Las credenciales de AWS del entorno o del archivo de configuración estándar de AWS. Para obtener más información, consulte Set Up Your AWS Credentials en la Guía para desarrolladores de AWS SDK para Java.
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 actividad está en la misma cuenta de AWS que la máquina de estado.
-
En la consola de Step Functions
, en el panel de navegación de la izquierda, elija Actividades. -
Seleccione Crear actividad.
-
Escriba un Nombre de la actividad, por ejemplo,
y, a continuación, elija Crear actividad.get-greeting -
Cuando se crea la tarea de actividad, tome nota de su ARN, como se muestra en el siguiente ejemplo.
arn:aws:states:region: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.
-
En la consola de Step Functions
, en el panel de navegación de la izquierda, elija Máquinas de estado. -
En la página Máquinas de estado, elija Crear máquina de estado.
-
Elija Crear desde cero.
-
Asigne un nombre a la máquina de estado y, a continuación, elija Continuar para editarla en Workflow Studio.
-
Para este tutorial, escribirá la definición de Amazon States Language (ASL) de su máquina de estado en el editor de código. Para ello, elija Código.
-
Elimine el código reutilizable existente y pegue el siguiente código. Recuerde reemplazar el ARN de ejemplo en el campo
Resourcecon el ARN de la actividad que creó anteriormente en Paso 1: Crear una actividad.{ "Comment": "An example using a Task state.", "StartAt": "getGreeting", "Version": "1.0", "TimeoutSeconds": 300, "States": { "getGreeting": { "Type": "Task", "Resource": "arn:aws:states:", "End": true } } }region:123456789012:activity:get-greetingEsta es una descripción de la máquina de estado realizada mediante el Amazon States Language (ASL). Define un único estado
TaskllamadogetGreeting. Para obtener más información, consulte Estructura de las máquinas de estado. -
En el 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.
-
Especifique un nombre para la máquina de estado. Para ello, elija el icono de edición situado junto al nombre predeterminado de máquina de estado de 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. -
(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.
-
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,SendTaskFailureySendTaskHeartbeat.
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
-
Cree un archivo denominado
GreeterActivities.java. -
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
EnvironmentVariableCredentialsProviderde este ejemplo presupone que se han establecido las variables de entornoAWS_ACCESS_KEY_ID(oAWS_ACCESS_KEY) yAWS_SECRET_KEY(oAWS_SECRET_ACCESS_KEY). Si necesita más información sobre cómo proporcionar las credenciales necesarias al generador, consulte AWSCredentialsProvider en la Referencia de la API AWS SDK para Java y Configuración de credenciales y regiones de AWS para desarrollo en la Guía de desarrollo de AWS SDK para Java.De forma predeterminada, el SDK de AWS esperará hasta 50 segundos a recibir datos del servidor para cualquier operación. La operación
GetActivityTaskes una operación de sondeo largo que esperará hasta 60 segundos a la siguiente tarea disponible. Para evitar que se reciba un errorSocketTimeoutException, establezca SocketTimeout en 70 segundos. -
En la lista de parámetros del constructor
GetActivityTaskRequest().withActivityArn(), sustituya el valorACTIVITY_ARNpor el ARN de la tarea de actividad que creó anteriormente en Paso 1: Crear una actividad.
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.
-
En la página
ActivityStateMachine, seleccione Iniciar ejecución.Aparece el cuadro de diálogo Iniciar ejecución.
-
En el cuadro de diálogo Iniciar ejecución, haga lo siguiente:
-
(Opcional) Introduzca un nombre de ejecución personalizado para anular el valor predeterminado generado.
Nombres y registros con caracteres no ASCII
Step Functions acepta nombres para máquinas de estado, ejecuciones, actividades y etiquetas que contengan caracteres no ASCII. Dado que estos caracteres impedirán que Amazon CloudWatch registre datos, le recomendamos que utilice únicamente caracteres ASCII para poder realizar un seguimiento de las métricas en Step Functions.
-
En el cuadro Entrada, introduzca la siguiente entrada de JSON para ejecutar el flujo de trabajo.
{ "who": "AWS Step Functions" } -
Seleccione Iniciar ejecución.
-
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 Información general sobre los detalles de ejecución.
-
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.
-
En la línea de comandos, vaya al directorio en el que creó
GreeterActivities.java. -
Si desea utilizar el SDK de AWS, agregue la ruta completa de los directorios
libythird-partya las dependencias del archivo de compilación y aCLASSPATHde Java. Para obtener más información, consulte Descargue y extraiga el SDK (no se recomienda) en la Guía para desarrolladores de AWS SDK para Java. -
Compile el archivo.
$ javac GreeterActivities.java -
Ejecute el archivo.
$ java GreeterActivities -
En la consola de Step Functions
, vaya a la página Detalles de ejecución. -
Cuando se complete la ejecución, examine los resultados.
-
Detenga el proceso de trabajo.