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.
Vaya a la consola de AWS > Funciones de pasos > haga clic en Crear máquina de estado .
Seleccione Diseñe su flujo de trabajo visualmente , elija el Tipo estándar y presione Siguiente .
En Workflow Studio, arrastre un bloque Lambda: Invoke al primer estado.
En Configuración > Parámetros de API > Nombre de la función , elija la lambda de destino en el menú desplegable.
En Configuración > Configuración adicional > Estado siguiente , elija Ir al final .
Un reintentador 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.
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 Manejo de errores > Reintentar en caso de errores , haga clic en Agregar nuevo reintentador .
En Recuperador n.° 1 > Errores , seleccione Estados.TODOS . Esto significa que este reintentador se aplicará a todos los errores.
Establezca el intervalo en 5 segundos, Max intenta en 2 y la tasa de retroceso en 1.
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.
Un receptor define un conjunto de reglas de manejo de errores si la lambda falla después de todos los reintentos.
Quiero enviar un correo electrónico con AWS Simple Notification Service si todos los reintentos fallaron.
En Manejo de errores > Capturar errores , haga clic en Agregar un nuevo receptor .
En Catcher #1 > Errors , seleccione States.ALL . Esto significa que el receptor puede activarse por todos los errores.
En Catcher #1 > Estado alternativo , haga clic en Agregar nuevo estado . Esto creará una nueva rama de manejo de errores en el flujo de trabajo.
Busque SNS en la barra de búsqueda de la izquierda y arrastre un bloque de publicación de Amazon SNS al estado alternativo.
A continuación, haga clic en el bloque SNS: Publicar para editarlo.
En Configuración > Parámetros de API > Tema , seleccione un tema. Por ejemplo, el tema HelloFuncFailed aquí me enviará un correo electrónico. Consulte esta documentación sobre cómo configurar SNS para enviar correos electrónicos.
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.
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 sin servidor para la función de paso que creamos anteriormente.
# 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 hello.js
en el mismo directorio. También puede hacer referencia a un Lambda existente por su nombre de recurso de Amazon (Arn). Consulte la documentación sin servidor para obtener más detalles.
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. 🙂