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. 

Más información sobre 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.

01c
01c

(Haga clic para ampliar).


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."    }   
  }
}
03b
03b

(Haga clic para ampliar).


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.

03c
03c

(Haga clic para ampliar).


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.

02a
02a

(Haga clic para ampliar).


b. Haga clic en Roles y, luego, en Crear rol.

02b
02b

(Haga clic para ampliar).


c. En la pantalla Crear roles, deje seleccionado Servicio de AWS, seleccione Step Functions y, luego, haga clic en Siguiente: permisos. En la pantalla siguiente, haga clic en Siguiente: revisar.

02c
02c

(Haga clic para ampliar).


d. En Nombre del rol escriba step_functions_basic_execution y elija Crear rol. En la pantalla siguiente, haga clic en Siguiente: revisar.

02d
02d

(Haga clic para ampliar).


e. Su rol se ha creado y aparece en la lista. Seleccione el nombre de su rol para verlo. 

02e
02e

(Haga clic para ampliar).


f. Copie el ARN del rol en la pantalla siguiente.

02f
02f

(Haga clic para ampliar).


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.


a. Seleccione la pestaña del navegador con la consola de Step Functions.

b. Pegue el ARN que copió en el cuadro de texto ARN del rol de IAM.

c. Haga clic en Crear máquina de estado.

03a
03a

(Haga clic para ampliar).


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.


a. Haga clic en Servicios, escriba Lambda en el cuadro de texto de búsqueda y seleccione Lambda para abrir la consola del servicio.

04a
04a

(Haga clic para ampliar).


b. Haga clic en Crear función.

04b
04b

(Haga clic para ampliar).


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.

04c
04c

(Haga clic para ampliar).


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);    
};
04d
04d

(Haga clic para ampliar).


h. En la parte superior de la página, haga clic en Funciones.

04e
04e

(Haga clic para ampliar).


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.

04f
04f

(Haga clic para ampliar).


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.


a. Haga clic en Servicios, escriba Step en el cuadro de texto de búsqueda y seleccione Step Functions para abrir la consola del servicio.

05a
05a

(Haga clic para ampliar).


b. En la pantalla Máquinas de estado, seleccione CallCenterStateMachine y haga clic en Editar.

05b
05b

(Haga clic para ampliar).


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.

05c
05c

(Haga clic para ampliar).


d. Repita el paso anterior para actualizar los ARN de las funciones Lambda en los estados Task Asignar caso, Trabajar en caso, Cerrar caso, y Elevar caso en su máquina de estado y, luego, haga clic en Guardar.

05d
05d

(Haga clic para ampliar).


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.


a. Haga clic en Iniciar ejecución.

06a
06a

(Haga clic para ampliar).


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"
}
06b
06b

(Haga clic para ampliar).


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.

06c
06c

(Haga clic para ampliar).


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.

06d
06d

(Haga clic para ampliar).


e. Desplácese hacia abajo hasta la sección Historial de eventos de ejecución. Haga clic en cada paso de la ejecución para ver cómo Step Functions realizó llamadas a sus funciones Lambda y transmitió los datos entre las funciones.

06e
06e

(Haga clic para ampliar).


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.

06f
06f

(Haga clic para ampliar).


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.


a. En la parte superior de la ventana de la consola de AWS Step Functions, haga clic en Máquinas de estado.

07a
07a

(Haga clic para ampliar).


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.

07b
07b

(Haga clic para ampliar).


c. A continuación, eliminará sus funciones Lambda. En el menú de la consola de administración de AWS, haga clic en Servicios y, a continuación, seleccione Lambda.

07c
07c

(Haga clic para ampliar).


d. En la pantalla Funciones, haga clic en cada una de las funciones que creó para este tutorial, seleccione Acciones y, luego, Eliminar. Confirme la eliminación haciendo clic nuevamente en Eliminar.

07d
07d

(Haga clic para ampliar).


e. Por último, eliminará sus roles de IAM. Haga clic en Servicios en el menú de la consola de administración de AWS y, a continuación, seleccione IAM.

07e
07e

(Haga clic para ampliar).


f. Seleccione los dos roles de IAM que creó para este tutorial y, luego, haga clic en Eliminar rol. Confirme la eliminación haciendo clic en Sí, eliminar en el cuadro de diálogo.


Ahora puede cerrar sesión en la consola de administración de AWS.

07f
07f

(Haga clic para ampliar).


¡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.


¿Le resultó útil este tutorial?