Prácticas recomendadas para 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.

Prácticas recomendadas para Step Functions

Los siguientes temas son prácticas recomendadas para ayudarle a gestionar y optimizar los flujos de trabajo de Step Functions.

Optimización de costos mediante Express Workflows

Step Functions determina los precios de los flujos de trabajo estándar y rápidos según el tipo de flujo de trabajo que utilice para crear sus máquinas de estados. Para optimizar el costo de sus flujos de trabajo sin servidor, puede seguir una de las siguientes recomendaciones o ambas:

Para obtener información sobre cómo afecta a la facturación la elección de un tipo de flujo de trabajo estándar o exprés, consulte AWS Step Functions Precios.

Flujos de trabajo de Nest Express dentro de los flujos de

Step Functions ejecuta flujos de trabajo que tienen una duración y un número de pasos finitos. Algunos flujos de trabajo pueden completar la ejecución en un breve periodo de tiempo. Otros pueden requerir una combinación de flujos de trabajo de larga duración y high-event-rate flujos de trabajo. Con Step Functions, puede crear flujos de trabajo grandes y complejos a partir de varios flujos de trabajo más pequeños y sencillos.

Por ejemplo, para crear un flujo de trabajo de procesamiento de pedidos, puede incluir todas las acciones no idempotentes en un flujo de trabajo estándar. Esto podría incluir acciones como la aprobación de pedidos mediante la interacción humana y el procesamiento de pagos. A continuación, puede combinar una serie de acciones idempotentes, como enviar notificaciones de pago y actualizar el inventario de productos, en un flujo de trabajo rápido. Puede agrupar este flujo de trabajo rápido en el flujo de trabajo estándar. En este ejemplo, el flujo de trabajo estándar se conoce como máquina de estado principal. El flujo de trabajo rápido anidado se conoce como máquina de estado secundaria.

Convierta los flujos de trabajo estándar en flujos de trabajo rápidos

Puede convertir sus flujos de trabajo estándar existentes en flujos de trabajo rápidos si cumplen los siguientes requisitos:

  • El flujo de trabajo debe completar su ejecución en cinco minutos.

  • El flujo de trabajo se ajusta a un modelo at-least-oncede ejecución. Esto significa que cada paso del flujo de trabajo puede ejecutarse más de una vez exactamente.

  • El flujo de trabajo no utiliza los patrones de integración de servicios .waitForTaskToken o .sync.

importante

Los flujos de trabajo exprés utilizan Amazon CloudWatch Logs para registrar los historiales de ejecución. Si utiliza CloudWatch Logs, incurrirá en costes adicionales.

Convertir un flujo de trabajo estándar en un flujo de trabajo rápido mediante la consola
  1. Abra la consola de Step Functions.

  2. En la página Máquinas de estados, seleccione una máquina de estado de tipo estándar para abrirla.

    sugerencia

    En la lista desplegable Cualquier tipo, seleccione Estándar para filtrar la lista de máquinas de estados y ver solo los flujos de trabajo estándar.

  3. Seleccione Copiar en uno nuevo.

    Workflow Studio se abre en Modo Diseño mostrando el flujo de trabajo de la máquina de estado que ha seleccionado.

  4. (Opcional) Actualice el diseño del flujo de trabajo.

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

  6. (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.

    Asegúrese de elegir Rápido en Tipo. Mantenga el resto de selecciones predeterminadas en la Configuración de máquina de estado.

    nota

    Si va a convertir un flujo de trabajo estándar previamente definido en AWS CDK o AWS SAM, debe cambiar el valor Type y el Resource nombre de.

  7. 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 eliminas el IAM rol que Step Functions crea, Step Functions no podrá volver a crearlo más adelante. Del mismo modo, si modificas el rol (por ejemplo, quitando Step Functions de los principios de la IAM política), Step Functions no podrá restaurar su configuración original más adelante.

Para obtener más información sobre las prácticas recomendadas y las directrices a la hora de gestionar la optimización de costes de sus flujos de trabajo, consulte Cómo crear una solución rentable AWS Step Functions flujos de trabajo.

Etiquetado de máquinas de estado y actividades en Step Functions

AWS Step Functions admite el etiquetado de máquinas de estados (tanto estándar como exprés) y actividades. Las etiquetas pueden ayudarlo a rastrear y administrar sus recursos y a proporcionar una mayor seguridad en sus AWS Identity and Access Management (IAM) políticas. Tras etiquetar los recursos de Step Functions, puede gestionarlos con AWS Resource Groups. Para obtener información sobre cómo hacerlo, consulte la AWS Resource Groups Guía del usuario.

En el caso de la autorización basada en etiquetas, los recursos de ejecución de máquinas de estado, como se muestra en el siguiente ejemplo, heredan las etiquetas asociadas a una máquina de estado.

arn:<partition>:states:<Region>:<account-id>:execution:<StateMachineName>:<ExecutionId>

Cuando llamas DescribeExecutiono cuando especificas el recurso de ejecuciónARN, Step Functions utiliza las etiquetas asociadas a la máquina de estados para aceptar o denegar la solicitud mientras realiza la autorización basada en etiquetas. APIs Esto ayuda a permitir o denegar el acceso a las ejecuciones de máquina de estado en el nivel de las máquinas de estado.

Para revisar las restricciones relacionadas con el etiquetado de recursos, consulte Restricciones relacionadas con el etiquetado.

Etiquetado para asignación de costos

Puede utilizar etiquetas de asignación de costes para identificar el propósito de una máquina de estados y reflejar esa organización en su AWS factura. Regístrese para obtener su AWS factura de cuenta que incluya las etiquetas, las claves y los valores. Consulte Cómo configurar un informe mensual de asignación de costos en el AWS Billing En la Guía del usuario encontrará información detallada sobre la configuración de los informes.

Por ejemplo, puede añadir etiquetas que representen su centro de costes y el propósito de sus recursos de Step Functions, de la siguiente manera.

Recurso Clave Valor
StateMachine1 Cost Center 34567
Application Image processing
StateMachine2 Cost Center 34567
Application Rekognition processing

Etiquetado de seguridad

IAMpermite controlar el acceso a los recursos en función de las etiquetas. Para controlar el acceso en función de las etiquetas, proporcione información sobre las etiquetas de los recursos en el elemento de condición de una IAM política.

Por ejemplo, puede restringir el acceso a todos los recursos de Step Functions que incluyan una etiqueta con la clave environment y el valor production.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": [ "states:TagResource", "states:DeleteActivity", "states:DeleteStateMachine", "states:StopExecution" ], "Resource": "*", "Condition": { "StringEquals": {"aws:ResourceTag/environment": "production"} } } ] }

Para obtener más información, consulte Control del acceso mediante etiquetas en la Guía del IAM usuario.

Gestión de etiquetas en la consola de Step Functions

Puede ver y gestionar las etiquetas de sus máquinas de estado en la consola de Step Functions. En la página Detalles de un equipo de estado, seleccione Etiquetas.

Gestión de etiquetas con Step Functions API Actions

Para gestionar las etiquetas mediante Step FunctionsAPI, utilice las siguientes API acciones:

Uso de tiempos de espera para evitar que las ejecuciones del flujo de trabajo de Step Functions se atasquen

De forma predeterminada, Amazon States Language no especifica tiempos de espera para las definiciones de máquina de estado. Sin un tiempo de espera explícito, Step Functions a menudo se basa únicamente en una respuesta de un proceso de trabajo empleado de actividad para saber que una tarea se ha completado. Si algo va mal y no se especifica el campo TimeoutSeconds para un estado Activity o Task, una ejecución se bloquea a la espera una respuesta que nunca llegará.

Para evitar esto, especifique un límite de tiempo de espera razonable cuando cree una Task en la máquina de estado. Por ejemplo:

"ActivityState": { "Type": "Task", "Resource": "arn:aws:states:us-east-1:123456789012:activity:HelloWorld", "TimeoutSeconds": 300, "Next": "NextState" }

Si utilizas una devolución de llamada con un token de tarea (. waitForTaskToken), te recomendamos que utilices Heartbeats y agregues el HeartbeatSeconds campo a la definición de tu Task estado. Puede configurar HeartbeatSeconds para que sea inferior al tiempo de espera de la tarea, de modo que si el flujo de trabajo falla debido a un error de latido, sabrá que se debe a un error en la tarea y no a que la tarea tarde mucho tiempo en completarse.

{ "StartAt": "Push to SQS", "States": { "Push to SQS": { "Type": "Task", "Resource": "arn:aws:states:::sqs:sendMessage.waitForTaskToken", "HeartbeatSeconds": 600, "Parameters": { "MessageBody": { "myTaskToken.$": "$$.Task.Token" }, "QueueUrl": "https://sqs.us-east-1.amazonaws.com/123456789012/push-based-queue" }, "ResultPath": "$.SQS", "End": true } } }

Para obtener más información, consulte Estado del flujo de trabajo de tareas en la documentación de Amazon States Language.

nota

Puede establecer un tiempo de espera para la máquina de estado mediante el campo TimeoutSeconds de su definición de Amazon States Language. Para obtener más información, consulte Estructura de máquinas de estados en Amazon States Language para flujos de trabajo de Step Functions.

Uso de Amazon S3 ARNs en lugar de transferir grandes cargas en Step Functions

Las ejecuciones que pasan cargas de gran tamaño entre los estados pueden terminarse. Si los datos que va a transferir entre estados pueden superar los 256 KB, utilice Amazon Simple Storage Service (Amazon S3) para almacenar los datos y analice el nombre del recurso de Amazon ARN () del depósito en el parámetro para obtener Payload el nombre del depósito y el valor clave. También puede ajustar la implementación para que se pasen cargas más pequeñas en las ejecuciones.

En el siguiente ejemplo, una máquina de estados pasa la entrada a un AWS Lambda función, que procesa un JSON archivo en un bucket de Amazon S3. Tras ejecutar esta máquina de estados, la función Lambda lee el contenido del JSON archivo y devuelve el contenido del archivo como salida.

Creación de la función de Lambda

La siguiente función de Lambda denominada pass-large-payload lee el contenido de un JSON archivo almacenado en un bucket de Amazon S3 específico.

nota

Tras crear esta función Lambda, asegúrese de proporcionar a su IAM función el permiso adecuado para leer desde un bucket de Amazon S3. Por ejemplo, asocie el ReadOnlyAccess permiso de AmazonS3 al rol de la función Lambda.

import json import boto3 import io import os s3 = boto3.client('s3') def lambda_handler(event, context): event = event['Input'] final_json = str() s3 = boto3.resource('s3') bucket = event['bucket'].split(':')[-1] filename = event['key'] directory = "/tmp/{}".format(filename) s3.Bucket(bucket).download_file(filename, directory) with open(directory, "r") as jsonfile: final_json = json.load(jsonfile) os.popen("rm -rf /tmp") return final_json
Crear la máquina de estado

La siguiente máquina de estados invoca la función de Lambda que creó anteriormente.

{ "StartAt":"Invoke Lambda function", "States":{ "Invoke Lambda function":{ "Type":"Task", "Resource":"arn:aws:states:::lambda:invoke", "Parameters":{ "FunctionName":"arn:aws:lambda:us-east-2:123456789012:function:pass-large-payload", "Payload":{ "Input.$":"$" } }, "OutputPath": "$.Payload", "End":true } } }

En lugar de pasar una gran cantidad de datos a la entrada, puede guardar esos datos en un bucket de Amazon S3 y pasar el nombre del recurso de Amazon (ARN) del bucket en el Payload parámetro para obtener el nombre del bucket y el valor clave. Luego, su función Lambda puede usarla ARN para acceder a los datos directamente. A continuación se muestra una entrada de ejemplo para la ejecución de la máquina de estado, donde los datos se almacenan en data.json en un bucket de Amazon S3 llamado amzn-s3-demo-large-payload-json.

{ "key": "data.json", "bucket": "arn:aws:s3:::amzn-s3-demo-large-payload-json" }

Iniciar nuevas ejecuciones para evitar alcanzar la cuota de historial en Step Functions

AWS Step Functions tiene una cuota fija de 25 000 entradas en el historial de eventos de ejecución. Cuando una ejecución alcanza los 24 999 eventos, espera a que se produzca el siguiente evento.

  • Si el evento número 25 000 es ExecutionSucceeded, la ejecución finaliza correctamente.

  • Si el evento número 25 000 no es ExecutionSucceeded, se registra el evento ExecutionFailed y la ejecución de la máquina de estado produce un error al alcanzar el límite del historial

Para evitar alcanzar esta cuota para las ejecuciones de larga duración, pruebe alguna de las soluciones alternativas siguientes:

Gestione las excepciones transitorias del servicio Lambda

AWS Lambda en ocasiones, pueden producirse errores de servicio transitorios. En este caso, la invocación de resultados de Lambda da como resultado un error 500, como ClientExecutionTimeoutException, ServiceException, AWSLambdaException o SdkClientException. Use la práctica recomendada de controlar estas excepciones de manera proactiva en la máquina de estado y ejecutar Retry para volver a invocar la función de Lambda o Catch para capturar el error.

Los errores de Lambda se notifican como Lambda.ErrorName. Para reintentar la función de Lambda después de una excepción de error de servicio, puede usar el código Retry siguiente:

"Retry": [ { "ErrorEquals": [ "Lambda.ClientExecutionTimeoutException", "Lambda.ServiceException", "Lambda.AWSLambdaException", "Lambda.SdkClientException"], "IntervalSeconds": 2, "MaxAttempts": 6, "BackoffRate": 2 } ]
nota

Los errores no controlados en Lambda se notifican como Lambda.Unknown en el resultado del error. Entre ellos se incluyen out-of-memory los errores y los tiempos de espera de las funciones. Puede buscar coincidencias de estos errores con Lambda.Unknown, States.ALL o States.TaskFailed para controlarlos. Cuando Lambda alcanza el número máximo de invocaciones, el error es. Lambda.TooManyRequestsException Para obtener más información sobre Lambda Handled y Unhandled los errores, consulte FunctionError en la AWS Lambda Guía para desarrolladores.

Para más información, consulte los siguientes temas:

Evitar la latencia al sondear las tareas de actividad

GetActivityTaskAPIEstá diseñado para que se haga taskTokenexactamente una vez. Si se descarta un taskToken durante la comunicación con un proceso de trabajo de actividad, se puede bloquear una serie de solicitudes GetActivityTask durante 60 segundos al esperar una respuesta hasta que se agote el tiempo de espera de GetActivityTask.

Si solo tiene un pequeño número de sondeos que esperan una respuesta, es posible que todas las solicitudes se pongan en cola detrás de la solicitud bloqueada y se detengan. Sin embargo, si tienes un gran número de sondeos pendientes para cada actividad Amazon Resource Name (ARN) y algún porcentaje de tus solicitudes se queda en espera, habrá muchas más que aún pueden obtener una taskToken y empezar a procesar el trabajo.

Para los sistemas de producción, recomendamos al menos 100 sondeos abiertos por actividad ARN en cada momento. Si se bloquea un sondeo y una parte de los sondeos se ponen en cola detrás de ella, todavía hay muchas más solicitudes que recibirán un taskToken para procesar el trabajo mientras la solicitud GetActivityTask está bloqueada.

Para evitar este tipo de problemas de latencia al sondear las tareas:

  • Implemente los sondeos como subprocesos independientes del trabajo en la implementación del proceso de trabajo de actividad.

  • Tenga al menos 100 encuestas abiertas por actividad ARN en cada momento.

    nota

    Escalar a 100 encuestas abiertas por cada una ARN puede resultar caro. Por ejemplo, 100 funciones Lambda por sondeo ARN son 100 veces más caras que tener una sola función Lambda con 100 subprocesos de sondeo. Tanto para reducir la latencia como para minimizar el costo, use un lenguaje que tenga E/S asincrónica e implemente varios subprocesos de sondeo por trabajador. Para ver un ejemplo de un proceso de actividad en el que los subprocesos de sondeo están separados de los subprocesos de trabajo, consulte Ejemplo: Activity Worker en Ruby.

Para obtener más información sobre las actividades y los procesos de trabajo de actividad, consulte Más información sobre las actividades de Step Functions.

CloudWatch Registra los límites de tamaño de la política de recursos

Cuando crea una máquina de estados con registro o actualiza una máquina de estado existente para habilitar el registro, Step Functions debe actualizar su política de recursos de CloudWatch registros con el grupo de registros que especifique. CloudWatch Las políticas de recursos de Logs están limitadas a 5.120 caracteres.

Cuando CloudWatch Logs detecta que una política se acerca al límite de tamaño, CloudWatch Logs habilita automáticamente el registro para los grupos de registros que comiencen por. /aws/vendedlogs/

Puede poner un prefijo a los nombres de los grupos de CloudWatch registros /aws/vendedlogs/ para evitar el límite de tamaño de la política de recursos de CloudWatch Logs. Si crea un grupo de registros en la consola de Step Functions, el nombre del grupo de registros sugerido ya tendrá el prefijo. /aws/vendedlogs/states

CloudWatch Logs también tiene una cuota de 10 políticas de recursos por región y por cuenta. Si intentas habilitar el registro en una máquina de estados que ya tiene 10 políticas de recursos de CloudWatch registros en una región para una cuenta, la máquina de estados no se creará ni actualizará. Para obtener más información sobre el registro de cotizaciones, consulte CloudWatch Registros de cuotas.

Si tiene problemas para enviar CloudWatch registros a Logs, consulteTroubleshooting state machine logging to CloudWatch Logs. Para obtener más información sobre el registro en general, consulte Habilitar el registro desde AWS servicios.