Alejandro Caravantes Molina

17 de oct de 20224 min.

Exponer flujos de Power Automate a través de API Management

Actualizado: 19 de oct de 2022

¿Te has encontrado en alguna ocasión en un escenario dónde numerosas automatizaciones son desencadenadas por llamadas HTTP? ¿Donde esas llamadas HTTP puedan venir desde multitud de lugares y/o usuarios? Para este tipo de escenarios podemos exponer Azure API Management como única puerta de entrada, y configurar todos los flujos desencadenados vía HTTP como backend de nuestra arquitectura.

¿Qué ventajas obtenemos de implementar una arquitectura de este tipo? Pues aunque en un principio no te puedan parecer muchas, si que lo son:

  • Autenticación con JWT: podemos configurar API Management para que autentique las request antes de enviarlas al backend (los flujos de Power Automate en nuestro caso). Esto lo veremos en una parte II de esta entrada ☺️.

  • Seguridad y prevención de ataques: en una arquitectura de este tipo, es en el propio API Management en quien delegamos toda la responsabilidad para prevención de ataques e incluso rechazar request de un determinado solicitante si se detecta algo sospechoso, antes de que lleguen al backend.

  • Transformación de request y response: podemos sobreescribir y transformar tanto el body de la request que vamos a enviar a nuestro flujo de Power Automate, como el body del response que devuelve el propio flujo. Esto es una ventaja grande sobre todo para no tener que ir modificando flujo por flujo si necesitamos modificar la response. También es una gran ventaja si ya hay clientes invocando nuestra API Management ya que podemos modificar el backend sin impactar en los clientes.

  • Normalización de las URL´s ya que al utilizar API Management, podemos configurar la estructura de la URL a la que se va a necesitar invocar.

  • Facilidad para evolucionar y mantener los componentes ya que podemos crear revisiones dentro de API Management que no van a estar disponibles hasta que publiquemos esa versión de nuestra "api".

Seguro que si nos ponemos sacamos muchas mas ventajas 😎.

Vamos al lío.

Antes de empezar, crea varios flujos de Power Automate cuyo desencadenador sea un HTTP Request y guárdalos para que genere la URL a la que debemos invocar para cada uno de ellos. En mi caso, he creado uno con el siguiente aspecto. Algo muy sencillito.

Lo siguiente que necesitamos es crear un recurso API Management en nuestra suscripción de Azure. Para esta prueba de concepto utiliza el plan Developer. Esto tiene poco misterio: dirígete al portal de Azure, selecciona un grupo de recursos donde trabajar o crea uno nuevo y a continuación crea el componente API Management. Fíjate que podemos configurar monitorización, acceso a redes virtuales, etc, etc. Aquí hay mucha tela que cortar, pero para esta prueba de concepto no me voy a entrener explicando nada de esto. Introduce los parámetros obligatorios y crea el recurso.

Antes de seguir y a modo de inciso, unos conceptos básicos de API Management:

  • Un recurso API Management se compone de N APIs

  • Una API se compone de M operaciones

  • Cuando una operación se ejecuta, se hace en 4 fases:

    • Frontend: donde se realizan comprobaciones de seguridad y autenticación

    • Inbound Processing: donde podemos sobreescribir y modificar casi a nuestro antojo los parámetros que vamos a enviar al backend en la request

    • Backend: donde como te imaginarás está la chicha de lo que se va a ejecutar

    • Outbound Processing: donde como en Inbound Processing podemos sobreescribir y modificar casi a nuestro antojo los parámetros que vamos a devolver al solicitante en la response.

Cuando se haya terminado de crear el recurso, dirígete a APIs, selecciona Add API e introduce un nombre y un nombre para mostrar de la API que estas creando. En la parte donde te pide que indiques Web Service URL, introduce la URL necesaria para desencadenar flujo de Power Automate que estés dando de alta en este momento. Pero... ¡Cuidado! No introduzcas toda la URL, introduce únicamente hasta la palabra triggers (incluida) y guarda el resto de la URL. Observa también lo interesante de poder añadir un suffix a la URL en caso de que ese API Management se esté utilizando como puerta de entrada a mas APIs que no tengan que ver con las APIs que estamos configurando nosotros. En mi caso, queda de la siguiente forma:

Una vez creada la API, vamos a crear una operación para esta nueva API. Desde el detalle de la propia API, selecciona Add Operation. Necesitaremos indicar el nombre de la operación, el método con el que vamos a invocar a nuestro flujo, asi como los parámetros que le vamos a hacer llegar al flujo desde la request. Parámetros que pueden configurarse para ir en la query, en el header o en el body.

Date cuenta que la parte de la URL que debemos indicar en el parámetro de la operación, representa la parte de la URL que API Management va a exponer para invocar a esta operación. En mi caso la configuración de la operación queda así:

Además, como el flujo con el que estoy trabajando va a recibir parámetros en el body de la request, he aprovechado también para indicar el schema del body que esperamos recibir:

Aprovecha también para ir a la pestaña Settings y desactivar la casilla que indica Subscription required, que para esta prueba de concepto no va a ser necesario.

Ya hemos configurado el Frontend, vamos con Inbound Processing. Selecciona el icono </> de esta etapa y añade lo siguiente:

<policies>
 
<inbound>
 
<base />
 
<set-method id="apim-generated-policy">POST</set-method>
 
<set-header id="apim-generated-policy" name="Ocp-Apim-Subscription-Key" exists-action="delete" />
 
<rewrite-uri id="apim-generated-policy" template="/manual/paths/invoke/?api-version=2016-06-01&amp;sp=/triggers/manual/run&amp;sv=1.0&amp;sig=dDRHGTIa7XyBZzRSJG4QJYq5ScQbIxqA5ZG1WYMcRgc" />
 
</inbound>
 
<--! ... -->
 
</policies>

De la sección de código de arriba me interesa que te quedes con varias cosas:

  • Fíjate que el método que hemos configurado al crear la operación, se está estableciendo aquí. En este caso el método POST.

  • Observa también como cuando hemos desactivado la casilla de Subscription required, no ha hecho mas que incluirse una segunda linea en esta configuración, aplicando lo que hemos modificado.

  • ¿Qué te parece la última linea de configuración? ¡Ni mas ni menos que el resto de la URL que expone nuestro flujo de Power Automate!. Cuidado al introducir aqui el resto de la URL de tu flujo ya que vas a tener que escapar los caracteres "&" por "&amp;"

Guarda la configuración, guarda la API y abre Postman que vamos a probar esto 😎.

Crea una nueva pestaña e introduce la URL de tu recurso API Management seguido de la operación que vas a invocar. Indica ademas el body de la request segun lo que hayas configurado. En mi caso queda de la siguiente forma:

En la siguiente entrada vamos a ir un paso mas allá y vamos a configurar la seguridad para autenticar las llamadas a API Management ¡Gracias por tu tiempo! ¡Nos vemos en la siguiente!