Mi equipo tiene una función lambda que está programada para ejecutarse cada hora. Tiene éxito el 90 % de las veces, pero falla el 10 % de las veces debido a un error de red. Cuando falla, lo hace en silencio. Y tenemos que revisar regularmente sus registros y compensar manualmente lo que falta. Esto es bastante inconveniente. Queremos una mejor manera de hacer esto. Queremos que la lambda vuelva a intentarlo automáticamente varias veces después de que falle. Y si sigue fallando después de todos los intentos, queremos recibir una notificación por correo electrónico. Y lo logramos usando la función de pasos de AWS. Nos ahorró toneladas de tiempo y nos gusta cómo simplifica la lógica y reduce la cantidad de código (y errores) que de otro modo tendríamos que escribir. Esta publicación le mostrará cómo hacerlo. Primero veremos cómo crear una función de paso en la consola de AWS y luego cómo hacerlo a través de una herramienta de infraestructura como código como Serverless. Crear una función de paso en la consola de AWS 1. Agregue la lambda Vaya a la > > haga clic en . consola de AWS Funciones de pasos Crear máquina de estado Seleccione , elija el Tipo y presione . Diseñe su flujo de trabajo visualmente estándar Siguiente En Workflow Studio, arrastre un bloque al primer estado. Lambda: Invoke En > > , elija la lambda de destino en el menú desplegable. Configuración Parámetros de API Nombre de la función En , elija . Configuración > Configuración adicional > Estado siguiente Ir al final 2. Agregar un recuperador Un define un conjunto de reglas de reintento, como el máximo de reintentos y el intervalo de reintento. Un reintentador vuelve a ejecutar la lambda después de que falla con cierto error. reintentador Step Function le permite agregar varios reintentadores para manejar diferentes errores. Para mantenerlo simple, agregaremos un reintentador que se ejecuta en todos los errores. En > , haga clic en . Manejo de errores Reintentar en caso de errores Agregar nuevo reintentador En > , seleccione . Esto significa que este reintentador se aplicará a todos los errores. Recuperador n.° 1 Errores Estados.TODOS Establezca el en 5 segundos, en 2 y la de retroceso en 1. intervalo Max intenta tasa Los intentos de intervalo y máximo son fáciles de entender, la tasa de retroceso determina cómo aumenta el intervalo de reintento. Por ejemplo, si el intervalo es de 5 segundos y la tasa de retroceso es de 2, la lambda esperará 5 segundos antes de volver a intentarlo después del primer error, 10 segundos después del segundo error, 20 segundos después del tercero, y así sucesivamente. 3. Agrega un receptor Un define un conjunto de reglas de manejo de errores si la lambda falla después de todos los reintentos. receptor Quiero enviar un correo electrónico con AWS Simple Notification Service si todos los reintentos fallaron. En > , haga clic en . Manejo de errores Capturar errores Agregar un nuevo receptor En > , seleccione . Esto significa que el receptor puede activarse por todos los errores. Catcher #1 Errors States.ALL En > , haga clic en . Esto creará una nueva rama de manejo de errores en el flujo de trabajo. Catcher #1 Estado alternativo Agregar nuevo estado Busque SNS en la barra de búsqueda de la izquierda y arrastre un bloque de al estado alternativo. publicación de Amazon SNS A continuación, haga clic en el bloque para editarlo. SNS: Publicar En > > , seleccione un tema. Por ejemplo, el tema HelloFuncFailed aquí me enviará un correo electrónico. Consulte sobre cómo configurar SNS para enviar correos electrónicos. Configuración Parámetros de API Tema esta documentación Ahora que agregamos Lambda, definimos las reglas de reintento y captura en la función de paso, puede hacer clic en Siguiente para revisar la definición y luego crear la máquina de estado. Implementar la función de pasos con Serverless Para que sea más fácil compartir y mantener la configuración de la función de paso, también puede implementar la misma función de paso con una herramienta de infraestructura como código. A continuación se muestra la definición para la función de paso que creamos anteriormente. sin servidor # serverless.yml service: myService provider: name: aws runtime: nodejs12.x functions: hello: handler: hello.handler # required, handler set in AWS Lambda name: hello-function stepFunctions: stateMachines: helloStepFunc: name: helloStepFunc definition: StartAt: HelloLambda States: HelloLambda: Type: Task Resource: Fn::GetAtt: [hello, Arn] End: true Retry: - ErrorEquals: - States.ALL IntervalSeconds: 5 # 5 seconds MaxAttempts: 3 BackoffRate: 1 Catch: - ErrorEquals: - States.ALL Next: SNSNotifcation SNSNotifcation: Type: Task Resource: arn:aws:states:::sns:publish Parameters: Subject: Hello Lambda failed after retries Message.$: $ TopicArn: xxx:HelloFuncFailed # your topic arn here End: true plugins: - serverless-step-functions # need to run $npm install --save-dev serverless-step-functions La plantilla anterior asume que el código lambda está definido en un archivo en el mismo directorio. También puede hacer referencia a un Lambda existente por su nombre de recurso de Amazon (Arn). Consulte la para obtener más detalles. hello.js documentación sin servidor Conclusión Así es como se usa AWS Step Function para agregar reintentos de errores y lógicas de notificación a una función lambda. Puede crear una función de paso a través de una consola de AWS o crear una mediante una herramienta de infraestructura como código, como Serverless. Step Function le ha ahorrado mucho tiempo a mi equipo. Simplifica nuestra lógica de manejo de errores y nos permite implementar un conjunto de reglas bastante complejas con unas pocas líneas de código. Con suerte, hay algo que puede llevar y aplicar a su proyecto. Y por favor, hágamelo saber si tiene alguna pregunta. 🙂