Ejercicio: Creación de un flujo de trabajo con Durable Functions

Completado

En este ejercicio, usará el escenario de ejemplo de la unidad anterior para aprender a crear un flujo de trabajo de aprobación en Azure Portal con Durable Functions.

Creación de una aplicación de funciones

  1. Inicie sesión en Azure Portal con la misma cuenta que ha usado para activar el espacio aislado.

  2. En el menú de Azure Portal o la página de Inicio, en Servicios de Azure, seleccione Crear un recurso. Aparecerá el panel Crear un recurso.

  3. Busque y seleccione Function App. Seleccione Consumo y, después, el botón Seleccionar. Aparece el panel Crear aplicación de funciones.

  4. En la pestaña Aspectos básicos, escriba los valores siguientes para cada opción.

    Configuración valor Descripción
    Detalles del proyecto
    Suscripción Suscripción de Concierge Especifica la suscripción en la que se va a crear esta aplicación de funciones.
    Grupo de recursos En la lista desplegable, seleccione [nombre del grupo de recursos de espacio aislado]. Especifica el nombre del grupo de recursos en el que se va a crear la aplicación de funciones. La aplicación de funciones se creará en el grupo de recursos del espacio aislado que se ha asignado al activar el espacio aislado, es decir, [nombre del grupo de recursos del espacio aislado].
    Detalles de instancia
    Nombre de la aplicación de funciones [Nombre único global] Especifica el nombre que identifica la nueva aplicación de funciones. Los caracteres válidos son a-z, 0-9 y -.
    Publicar Código Especifica que la función usa código en lugar de un contenedor.
    Pila en tiempo de ejecución Node.js Especifica que el código de ejemplo de este módulo está escrito en JavaScript.
    Versión 20 LTS Especifica la versión de la pila en tiempo de ejecución.
    Region [Haga la selección en la lista que sigue a esta sección] Elija la región más cercana que también sea una de las regiones de espacio aislado permitidas a continuación.
    Sistema operativo
    Sistema operativo Windows Especifica el sistema operativo en el que se hospeda la aplicación de funciones.
    Plan

    El espacio aislado gratuito permite crear recursos en un subconjunto de las regiones globales de Azure. Seleccione una región de la lista siguiente al crear los recursos:

    • Oeste de EE. UU. 2
    • Centro-sur de EE. UU.
    • Centro de EE. UU.
    • Este de EE. UU.
    • Oeste de Europa
    • Sudeste de Asia
    • Japón Oriental
    • Sur de Brasil
    • Sudeste de Australia
    • India central
  5. Seleccione Siguiente: Almacenamiento.

  6. En la pestaña Almacenamiento, escriba los valores siguientes para cada opción.

    Configuración valor Descripción
    Storage
    Cuenta de almacenamiento [Nombre único global] Especifica el nombre de la nueva cuenta de almacenamiento usada por la aplicación de funciones (que no tiene que coincidir con el nombre único global que se ha especificado para la función). Los nombres de las cuentas de almacenamiento deben tener entre 3 y 24 caracteres, y solo pueden incluir números y letras en minúscula. Este cuadro de diálogo rellena automáticamente el campo con un nombre único que se genera dinámicamente. Pero no dude en usar otro nombre o incluso una cuenta existente.
  7. Seleccione Siguiente: Redes. Acepte los valores predeterminados.

  8. Seleccione Siguiente: Supervisión.

  9. En la pestaña Supervisión, escriba el valor siguiente para la configuración.

    Configuración valor Descripción
    Application Insights
    Habilitación de Application Insights No Especifica que para este módulo se deshabilitará Application Insights.
  10. Seleccione Revisar y crear y revise las opciones que ha configurado. Si le parecen bien las opciones, seleccione Crear para aprovisionar e implementar la aplicación de funciones.

Antes de continuar, espere a que se complete la implementación. La implementación puede tardar unos minutos.

Instalación del paquete npm durable-functions

Como se va a crear una instancia de Durable Functions de JavaScript, es necesario instalar el paquete npm durable-functions. Para ello, realice los pasos siguientes.

  1. Seleccione Ir al recurso para seleccionar la aplicación de funciones. Aparece el panel Aplicación de funciones.

  2. En el panel de menús de la izquierda, en Herramientas de desarrollo, seleccione Editor de App Service (versión preliminar) y después Abrir Editor. El panel de inicio rápido del Editor de App Service aparece en una nueva ventana del explorador.

  3. En el panel de menús de la izquierda, resalte la carpeta WWWROOT.

  4. En el menú de la barra de herramientas de la izquierda, seleccione el icono Abrir consola.

    Esta acción inicia la consola. Puede usar esta consola para acceder al servidor web en el que se hospedan las funciones y escribir el código para las funciones.

  5. Cree un archivo package.json.

    • Ejecute los comandos siguientes en la consola para crear el archivo JSON y abrirlo en el editor.

      touch package.json
      open package.json
      
    • Agregue el código siguiente:

      {
        "name": "example",
        "version": "1.0.0"
      }
      

      Reemplace example por el nombre del paquete. Por ejemplo, se puede usar el nombre único global que se especificó para la función anteriormente.

  6. Seleccione Ctrl+S para guardar el archivo y, luego, Ctrl+Q para cerrar el documento.

  7. Vuelva a Azure Portal.

  8. En la barra de menús izquierda, seleccione Consola en Herramientas de desarrollo. Aparece el panel Consola de la aplicación de funciones.

  9. Ejecute el siguiente comando:

    npm install durable-functions
    

    Este comando indica al administrador de paquetes de Node que instale el paquete durable-functions y las dependencias necesarias. La instalación puede tardar unos minutos en completarse y es posible que el administrador de paquetes de nodos muestre algunas advertencias, que puede omitir.

    Nota:

    Si se le solicita que instale una versión más reciente de npm, use el comando proporcionado en el error para instalar la versión más reciente y, a continuación, instale el paquete durable-functions una vez instalada la nueva versión.

    Espere hasta que se hayan terminado de instalar todos los paquetes.

  10. En el panel de menús de la izquierda, desplácese hacia arriba y seleccione Información general; en la barra de menús superior, seleccione Reiniciar y, después, cuando se le pida que reinicie.

    Antes de continuar, espere a que se complete el reinicio.

Creación de la función de cliente para enviar una propuesta de diseño

  1. En el menú de Azure Portal o desde la página Inicio, en Recursos recientes, seleccione Ver todo y luego la aplicación de funciones. Aparece el panel Aplicación de funciones.

  2. En la página Información general, seleccione la pestaña Funciones en el centro de la pantalla.

  3. Seleccione el botón Crear en Azure Portal. Se abre el panel Crear función.

  4. En Seleccionar una plantilla, vaya al cuadro Filtrar, especifique Inicio HTTP de Durable Functions y seleccione esa plantilla de la lista. Esta plantilla crea una instancia de Durable Functions que se ejecuta en respuesta a una solicitud HTTP.

  5. En el campo Nueva función de Detalles de la plantilla, escriba HttpStart como nombre de la función y, en el campo Nivel de autorización, seleccione Función y, a continuación, Crear. Aparece el panel HttpStart de la función.

  6. En el panel de menús izquierdo, en Desarrollador, seleccione Código y prueba. Aparece el panel Código y prueba de la función.

    El código del archivo index.js aparece en el editor. El archivo debería ser similar al ejemplo siguiente:

    const df = require("durable-functions");
    
    module.exports = async function (context, req) {
        const client = df.getClient(context);
        const instanceId = await client.startNew(req.params.functionName, undefined, req.body);
    
        context.log(`Started orchestration with ID = '${instanceId}'.`);
    
        return client.createCheckStatusResponse(context.bindingData.req, instanceId);
    };
    
  7. En la lista desplegable de los archivos de la función, seleccione function.json para ver los enlaces asociados con la función nueva. Esta información especifica los requisitos de autenticación, junto con los métodos HTTP que pueden desencadenar la función. En este archivo también se especifica que la función es un cliente que inicia el proceso de orquestación. El archivo debería ser similar al ejemplo siguiente:

    {
      "bindings": [
        {
          "authLevel": "function",
          "name": "req",
          "type": "httpTrigger",
          "direction": "in",
          "route": "orchestrators/{functionName}",
          "methods": [
            "post",
            "get"
          ]
        },
        {
          "name": "$return",
          "type": "http",
          "direction": "out"
        },
        {
          "name": "starter",
          "type": "orchestrationClient",
          "direction": "in"
        }
      ]
    }
    

    Nota:

    Un enlace asocia los recursos y demás elementos con un desencadenador. Se trata de un mecanismo declarativo que elimina la necesidad de codificar de forma rígida las referencias a otros servicios y funciones en el código.

Creación de la función de orquestador

  1. En el menú de Azure Portal o desde la página Inicio, en Recursos recientes, seleccione Ver todo y luego la aplicación de funciones. Aparece el panel Aplicación de funciones.

  2. En la página Información general, seleccione la pestaña Funciones en el centro de la pantalla.

  3. En la barra de menús Funciones, seleccione Crear. Aparece el panel Crear función.

  4. En Seleccionar una plantilla, vaya al cuadro Filtrar, especifique Orquestador de Durable Functions y seleccione esa plantilla de la lista. Esta plantilla crea una instancia de Durable Functions que organiza la ejecución de funciones.

  5. En el campo Nueva función de Detalles de la plantilla, especifique OrchFunction como nombre de la función y, a continuación, seleccione Crear. Aparece el panel de la función OrchFunction.

  6. En el panel de menús izquierdo, en Desarrollador, seleccione Código y prueba. Aparece el panel Código y prueba de la función.

    El código del archivo index.js aparece en el editor.

  7. Reemplace el código existente por el siguiente código.

    const df = require("durable-functions");
    
    module.exports = df.orchestrator(function* (context) {
        const outputs = [];
    
        /*
        * We will call the approval activity with a reject and an approved to simulate both
        */
    
        outputs.push(yield context.df.callActivity("Approval", "Approved"));
        outputs.push(yield context.df.callActivity("Approval", "Rejected"));
    
        return outputs;
    });
    

    Este código llama a una función de actividad denominada Approval, que creará en breve. El código de la función de orquestador invoca dos veces la función Approval. La primera vez simula la aceptación de la propuesta y, la segunda, prueba la lógica de rechazo de la propuesta.

    Los valores que se devuelven en cada llamada se combinan y se transmiten de vuelta a la función de cliente. En un entorno de producción, la función de orquestación llamaría a una serie de funciones de actividad que toman la decisión de aceptar o rechazar para, luego, devolver el resultado de estas actividades.

  8. En la barra de menús superior, seleccione Guardar para guardar la función nueva.

Creación de la función de actividad

  1. En el menú de Azure Portal o desde la página Inicio, en Recursos recientes, seleccione Ver todo y luego la aplicación de funciones. Aparece el panel Aplicación de funciones.

  2. En la página Información general, seleccione la pestaña Funciones en el centro de la pantalla.

  3. En la barra de menús Funciones, seleccione Crear. Aparece el panel Crear función.

  4. En Seleccionar una plantilla, vaya al cuadro Filtrar, especifique Actividad de Durable Functions y seleccione esa plantilla de la lista. Esta plantilla crea una función duradera que se ejecuta cuando una función de orquestador llama a una actividad.

  5. En el campo Nueva función de Detalles de la plantilla, especifique Aprobación como nombre de la función y, a continuación, seleccione Crear. Aparece el panel Aprobación de la aplicación de funciones.

  6. En el panel de menús izquierdo, en Desarrollador, seleccione Código y prueba. Aparece el panel Código y prueba de la función.

    El código del archivo index.js aparece en el editor.

  7. Reemplace el código existente por el siguiente código.

    module.exports = async function (context) {
        return `Your project design proposal has been -  ${context.bindings.name}!`;
    };
    

    Esta función devuelve un mensaje que indica el estado de la propuesta. La expresión context.bindings.name será Accepted o Rejected, en función del parámetro que pase a la función desde el orquestador. En un escenario del mundo real, en esta función agregaría la lógica que controla las operaciones de aceptación o rechazo.

  8. En la barra de menús superior, seleccione Guardar para guardar la función nueva.

Comprobación del inicio del flujo de trabajo de Durable Functions

  1. En el menú de Azure Portal o desde la página Inicio, en Recursos recientes, seleccione Ver todo y luego la aplicación de funciones. Aparece el panel Aplicación de funciones.

  2. Seleccione la pestaña Funciones en el centro de la página.

  3. Seleccione la función HttpStart. Aparece el panel HttpStart de la función.

  4. En la barra de menús superior, seleccione Obtener la dirección URL de la función y copie la dirección URL. La dirección URL debería ser similar al ejemplo siguiente:

    https://example.azurewebsites.net/api/orchestrators/{functionName}?code=AbCdEfGhIjKlMnOpQrStUvWxYz==
    

    Usará esta dirección URL para ejecutar las funciones.

  5. Abra una ventana nueva del explorador y vaya a la dirección URL que copió. En la dirección URL, reemplace el marcador de posición {functionName} por OrchFunction, que se parecerá al ejemplo siguiente:

    https://example.azurewebsites.net/api/orchestrators/OrchFunction?code=AbCdEfGhIjKlMnOpQrStUvWxYz==
    

    El mensaje de respuesta contiene un conjunto de puntos de conexión URI que puede usar para supervisar y administrar la ejecución, que debería ser similar al ejemplo siguiente:

    {
      "id": "f0e1d2c3b4a5968778695a4b3c2d1e0f",
      "statusQueryGetUri": "https://example.azurewebsites.net/...",
      "sendEventPostUri": "https://example.azurewebsites.net/...",
      "terminatePostUri": "https://example.azurewebsites.net/...",
      "rewindPostUri": "https://example.azurewebsites.net/...",
      "purgeHistoryDeleteUri": "https://example.azurewebsites.net/..."
    }
    
  6. Copie el valor statusQueryGetUri y use el explorador web para ir a esta dirección URL. Debería ver un mensaje de respuesta similar al ejemplo siguiente:

    {
      "name": "OrchFunction",
      "instanceId": "f0e1d2c3b4a5968778695a4b3c2d1e0f",
      "runtimeStatus": "Completed",
      "input": null,
      "customStatus": null,
      "output": [
        "Your project design proposal has been -  Approved!",
        "Your project design proposal has been -  Rejected!"
      ],
      "createdTime": "2019-04-16T15:23:03Z",
      "lastUpdatedTime": "2019-04-16T15:23:35Z"
    }
    

    Recuerde que la función de orquestación ejecuta dos veces la función de actividad. La primera vez, la función de actividad indica que se ha aceptado la propuesta de proyecto. La segunda, se rechaza la propuesta. La función de orquestación combina los mensajes de ambas llamadas de función y los devuelve a la función de cliente.