Crear un flujo de trabajo sin servidor
con AWS Step Functions y AWS Lambda
En este tutorial, aprenderá a utilizar AWS Step Functions para diseñar y ejecutar un flujo de trabajo sin servidor que coordine múltiples funciones de AWS Lambda. AWS Lambda es un servicio informático que le permite ejecutar código sin aprovisionar ni administrar servidores.
En el ejemplo, es un desarrollador al que se le ha pedido crear una aplicación sin servidor para automatizar el manejo de incidencias de soporte en un centro de atención telefónica. Aunque podría hacer que una función Lambda llamara a la otra, le preocupa que administrar todas esas conexiones se vuelva difícil a medida que se sofistica la aplicación del centro de atención telefónica. Además, cualquier cambio en el flujo de la aplicación implicará realizar cambios en múltiples lugares, y podría tener que ingresar el mismo código una y otra vez.
Para resolver esta situación, decide utilizar AWS Step Functions. Step Functions es un servicio de organización sin servidor que le permite coordinar fácilmente múltiples funciones Lambda en flujos de trabajo flexibles que son fáciles de depurar y de cambiar. Step Functions activará cada paso de su aplicación y le realizará un seguimiento, por lo que sus funciones de Lambda no requerirán lógicas adicionales.
En los siguientes 10 minutos, creará una máquina de estado de Step Functions para describir el proceso actual del centro de atención telefónica, creará algunas funciones Lambda simples que simulen las tareas del equipo de soporte y transmitirá los datos entre las funciones Lambda para realizar un seguimiento del progreso del caso de soporte. Luego, realizará varias pruebas de su flujo de trabajo para observar cómo responde ante diferentes entradas. Por último, eliminará los recursos de AWS que utilizó en el tutorial.
En este tutorial, utilizará AWS Step Functions y AWS Lambda. Estos servicios están incluidos en la capa gratuita de AWS.
Es necesario contar con una cuenta de AWS para realizar este tutorial
No se aplican cargos adicionales por el uso de Step Functions ni Lambda. Los recursos que cree con el tutorial se pueden utilizar dentro de la capa gratuita.
Paso 1. Crear una máquina de estado y un flujo de trabajo sin servidor
El primer paso es diseñar un flujo de trabajo que describa cómo deben manejarse las incidencias de soporte en su centro de atención telefónica. Los flujos de trabajo describen un proceso como una serie de tareas específicas que se pueden repetir una y otra vez.
Puede conversar con el administrador del centro de atención telefónica sobre las prácticas recomendadas para la atención de los casos de soporte. Puede definir el flujo de trabajo utilizando como referencia intuitiva los flujos de trabajo visuales de Step Functions.
Luego, podrá diseñar el flujo de trabajo en AWS Step Functions. Su flujo de trabajo llamará a una función de AWS Lambda para crear un caso de soporte, invocará otra función para asignar el caso a un representante de soporte que lo resuelva, y así sucesivamente. También transmitirá los datos entre las funciones Lambda para hacer un seguimiento del estado del caso de soporte en el momento en el que se lo resuelve.
a. Abra laconsola de AWS Step Functions. Seleccione Crear con fragmentos de código. En el cuadro de texto Nombre, escriba CallCenterStateMachine.
b. Remplace el contenido de la ventana Definición de la máquina de estado con la definición de la máquina de estado del lenguaje de estados de Amazon (ASL) que se encuentra debajo. Amazon States Language es un lenguaje estructurado basado en JSON que se utiliza para definir su máquina de estado.
Esta máquina de estado utiliza una serie de estados Task para abrir un caso de soporte, asignarlo y trabajar en él. Luego, se utiliza un estado Choice para determinar si el caso puede cerrarse o no. Dos estados Task cierran el caso de soporte o lo elevan, según corresponda.
{
"Comment": "A simple AWS Step Functions state machine that automates a call center support session.",
"StartAt": "Open Case",
"States": {
"Open Case": {
"Type": "Task",
"Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
"Next": "Assign Case"
},
"Assign Case": {
"Type": "Task",
"Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
"Next": "Work on Case"
},
"Work on Case": {
"Type": "Task",
"Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
"Next": "Is Case Resolved"
},
"Is Case Resolved": {
"Type" : "Choice",
"Choices": [
{
"Variable": "$.Status",
"NumericEquals": 1,
"Next": "Close Case"
},
{
"Variable": "$.Status",
"NumericEquals": 0,
"Next": "Escalate Case"
}
]
},
"Close Case": {
"Type": "Task",
"Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
"End": true
},
"Escalate Case": {
"Type": "Task",
"Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
"Next": "Fail"
},
"Fail": {
"Type": "Fail",
"Cause": "Engage Tier 2 Support." }
}
}
c. Haga clic en el botón Actualizar para poder ver la definición de la máquina de estado del ASL como un flujo de trabajo visual. En la situación que ejemplificamos, puede verificar fácilmente que el proceso se haya descrito correctamente revisando el flujo de trabajo visual con el administrador del centro de atención telefónica.
d. Haga clic en Siguiente.
Paso 2. Crear un rol de AWS Identity and Access Management (IAM)
AWS IAM es un servicio web que lo ayuda a controlar de forma segura el acceso a los recursos de AWS. En este paso, creará un rol de IAM que permita que Step Functions acceda a Lambda.
a. En otra ventana del navegador, abra la consola de administración de AWS. Cuando se haya cargado la pantalla, escriba IAM en la barra de búsqueda y, luego, seleccione IAM para abrir la consola del servicio.
Paso 3. Agregue el rol de IAM a la máquina de estado
A continuación, deberá agregar el ARN del rol de IAM que creó a la máquina de estado en AWS Step Functions.
Paso 4. Crear sus funciones de AWS Lambda
Ahora que ha creado su máquina de estado, puede decidir cómo quiere que realice el trabajo. Puede conectar su máquina de estado a funciones de AWS Lambda y a otros microservicios que ya posea en su entorno, o crear nuevos microservicios. En este tutorial, creará algunas funciones Lambda simples que simulen varios pasos en el manejo de las llamadas al servicio de soporte, como la asignación del caso a un representante del servicio de atención al cliente.
c. Seleccione Crear desde cero.
d. Configure su primera función Lambda con los siguientes parámetros:
Nombre: OpenCaseFunction.
Tiempo de ejecución: Node.js 4.3.
Rol: Crear rol personalizado.
Se abrirá una nueva ventana de IAM.
e. Para el Nombre del rol, deje lambda_basic_execution y haga clic en Permitir.
Volverá automáticamente a la consola de Lambda.
f. Haga clic en Crear función.
g. Remplace el contenido de la ventana Código de la función con el siguiente código y, luego, haga clic en Guardar.
exports.handler = (event, context, callback) => {
// Create a support case using the input as the case ID, then return a confirmation message
var myCaseID = event.inputCaseID;
var myMessage = "Case " + myCaseID + ": opened...";
var result = {Case: myCaseID, Message: myMessage};
callback(null, result);
};
i. Repita los pasos del 4b al 4d para crear 4 funciones Lambda más por medio del rol de IAM lambda_basic_execution que creó en el paso 4c.
Defina AssignCaseFunction como:
exports.handler = (event, context, callback) => {
// Assign the support case and update the status message
var myCaseID = event.Case;
var myMessage = event.Message + "assigned...";
var result = {Case: myCaseID, Message: myMessage};
callback(null, result);
};
Defina WorkOnCaseFunction como:
exports.handler = (event, context, callback) => {
// Generate a random number to determine whether the support case has been resolved, then return that value along with the updated message.
var min = 0;
var max = 1;
var myCaseStatus = Math.floor(Math.random() * (max - min + 1)) + min;
var myCaseID = event.Case;
var myMessage = event.Message;
if (myCaseStatus == 1) {
// Support case has been resolved
myMessage = myMessage + "resolved...";
} else if (myCaseStatus == 0) {
// Support case is still open
myMessage = myMessage + "unresolved...";
}
var result = {Case: myCaseID, Status : myCaseStatus, Message: myMessage};
callback(null, result);
};
Defina CloseCaseFunction como:
exports.handler = (event, context, callback) => {
// Close the support case
var myCaseStatus = event.Status;
var myCaseID = event.Case;
var myMessage = event.Message + "closed.";
var result = {Case: myCaseID, Status : myCaseStatus, Message: myMessage};
callback(null, result);
};
Defina EscalateCaseFunction como:
exports.handler = (event, context, callback) => {
// Escalate the support case
var myCaseID = event.Case;
var myCaseStatus = event.Status;
var myMessage = event.Message + "escalating.";
var result = {Case: myCaseID, Status : myCaseStatus, Message: myMessage};
callback(null, result);
};
Cuando haya terminado, debe tener 5 funciones Lambda.
Paso 5. Completar su flujo de trabajo
El siguiente paso es completar los estados de tarea de su flujo de trabajo de Step Functions con las funciones Lambda que acaba de crear.
c. En la sección Definición de la máquina de estado, encuentre la línea que se encuentra por debajo del estado Abrir Caso que comienza con Recurso.
Remplace el ARN con el de su función OpenCaseFunction.
Si hace clic en el ARN de muestra, aparecerá una lista de las funciones de AWS Lambda en su cuenta y podrá seleccionarla de la lista.
Paso 6. Ejecutar el flujo de trabajo
El flujo de trabajo sin servidor ya está listo para ejecutarse. Una ejecución de máquina de estado es una instancia de su flujo de trabajo y tiene lugar cada vez que una máquina de estado de Step Functions se ejecuta y realiza sus tareas. Cada máquina de estado de Step Functions puede tener múltiples ejecuciones simultáneas, que puede iniciar desde la consola de Step Functions (que es lo que hará a continuación) o por medio de los SDK de AWS, las acciones de la API de Step Functions o la CLI de AWS. Las ejecuciones reciben contenido de entrada en JSON y producen contenido de salida también en JSON.
b. Aparecerá el cuadro de diálogo Nueva ejecución. Con el fin de suministrar un ID para su caso de soporte, escriba el contenido que se encuentra abajo en la ventana Entrada del cuadro de diálogo Nueva ejecución y, luego, haga clic en Iniciar ejecución.
{
"inputCaseID": "001"
}
c. A medida que se ejecute su flujo de trabajo, cada paso en el panel Flujo de trabajo visual cambiará de color. Espere unos segundos a que termine la ejecución. Luego, en el panel Detalles de la ejecución, haga clic en Entrada y Salida para ver las entradas y los resultados del flujo de trabajo.
d. Step Functions le permite inspeccionar cada paso de la ejecución de su flujo de trabajo, como las entradas y las salidas de cada estado. Haga clic en cada tarea del flujo de trabajo y amplíe los campos Entrada y Salida que se encuentran en Detalles del paso. Se puede ver que el ID del caso que ingresó en su máquina de estado avanza de un paso al otro, y que los mensajes se actualizan a medida que cada función Lambda completa su trabajo.
f. Según el resultado de la función WorkOnCaseFunction, su flujo de trabajo puede haber resuelto el caso de soporte y cerrado la incidencia, o haber elevado la incidencia al siguiente nivel de soporte. Puede volver a realizar la ejecución algunas veces más para observar los diferentes comportamientos. Esta imagen muestra una ejecución del flujo de trabajo en la que el caso de soporte se elevó, por lo que el flujo de trabajo concluyó con el estado Fail.
En una situación de la vida real, puede decidir continuar trabajando en el caso hasta su resolución en lugar de dar por concluido el flujo de trabajo cuando el estado haya fallado. Para ello, puede eliminar el estado Fail y editar el estado Task Elevar Caso en su máquina de estado y volver al estado Trabajar En Caso. No se requerirán cambios en las funciones Lambda. Las funciones que creamos para este tutorial son solo de muestra, por lo que pasaremos al siguiente paso del tutorial.
Paso 7. Terminar los recursos
En este paso, terminará los recursos relacionados con AWS Step Functions y AWS Lambda.
Importante: Terminar los recursos que no se están utilizando de forma activa reduce los costos y es una práctica recomendada. No terminar los recursos puede conllevar cargos.
b. En la ventana Máquinas de estado, seleccione CallCenterStateMachine y haga clic en Eliminar. Para confirmar que desea eliminar la máquina de estado, haga clic en Eliminar máquina de estado en el cuadro de diálogo. Su máquina de estado se eliminará en uno o dos minutos luego de que Step Functions haya confirmado que se han completado las ejecuciones en proceso.
¡Felicitaciones!
¡Buen trabajo! Acaba de crear un flujo de trabajo sin servidor con AWS Step Functions que desencadena múltiples funciones de AWS Lambda. Su flujo de trabajo coordinó todas sus funciones de acuerdo con la lógica que definió y transmitió los datos de un estado al otro, por lo que no tuvo que escribir código en cada una de las funciones.
Ahora que ha aprendido a diseñar y ejecutar un flujo de trabajo sin servidor, puede avanzar hacia el próximo tutorial, en el que aprenderá cómo usar Step Functions para lidiar con los errores de las funciones Lambda. Creará una máquina de estado que contenga los campos de Retry y Catch que respondan a códigos de respuesta que provengan de una API simulada con base en el tipo de mensaje de error, método que se denomina manejo de errores de funciones.