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.
Lista de prácticas recomendadas
- Optimización de costos mediante Express Workflows
- Etiquetado de máquinas de estado y actividades en Step Functions
- Uso de tiempos de espera para evitar que las ejecuciones del flujo de trabajo de Step Functions se atasquen
- Uso de Amazon S3 ARNs en lugar de transferir grandes cargas en Step Functions
- Iniciar nuevas ejecuciones para evitar alcanzar la cuota de historial en Step Functions
- Gestione las excepciones transitorias del servicio Lambda
- Evitar la latencia al sondear las tareas de actividad
- CloudWatch Registra los límites de tamaño de la política de recursos
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
-
Abra la consola de Step Functions
. -
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.
-
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.
-
(Opcional) Actualice el diseño del flujo de trabajo.
-
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.
-
(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 elResource
nombre de. -
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
lee el contenido de un JSON archivo almacenado en un bucket de Amazon S3 específico.pass-large-payload
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 eventoExecutionFailed
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:
-
Utilice el estado Map en modo distribuido. En este modo, el estado
Map
ejecuta cada iteración como una ejecución de flujo de trabajo secundario, lo que permite una alta simultaneidad de hasta 10 000 ejecuciones de flujos de trabajo secundarios en paralelo. Cada ejecución de flujo de trabajo secundario tiene su propio historial de ejecución independiente del flujo de trabajo principal. -
Inicie una nueva ejecución de máquina de estado directamente desde el estado
Task
de una ejecución en curso. Para iniciar dichas ejecuciones de flujos de trabajo anidados, utilice laStartExecution
API acción de Step Functions en la máquina de estados principal junto con los parámetros necesarios. Para obtener más información sobre el uso de flujos de trabajo anidados, consulte Inicie las ejecuciones de flujos de trabajo desde un estado de tarea en Step Functions o utilice una API acción de Step Functions para continuar con una nueva ejecución en el tutorial.sugerencia
Para implementar un ejemplo de flujo de trabajo anidado en su Cuenta de AWS, consulte el Módulo 13: Flujos de trabajo rápidos anidados
. -
Implemente un patrón que utilice un AWS Lambda función que puede iniciar una nueva ejecución de su máquina de estados para dividir el trabajo en curso entre varias ejecuciones de flujo de trabajo. Para obtener más información, consulte el tutorial Uso de una función Lambda para continuar con una nueva ejecución en Step Functions.
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.
. Para reintentar la función de Lambda después de una excepción de error de servicio, puede usar el código ErrorName
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
GetActivityTask
APIEstá diseñado para que se haga taskToken
exactamente 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.