[Azure] Manteniendo los Hybrid Connection entre Slots (WebApp Swapping)

Hace algunas semanas tuvimos la necesidad de empezar a hacer algunos despliegues sobre App Services en Azure con cero "downtime", es decir, sin que nuestro sitio web quede offline durante el proceso de despliegue. Lograr esto en Azure es relativamente sencillo, con una característica muy interesante llamada "Swap", la cual nos permite tener "slots" o ranuras que funcionan como un sitio web independiente, pero que a su vez, es capaz de compartir configuraciones con nuestro sitio web principal; para luego, después de desplegar y probar en nuestra ranura secundaria, hacer que el endpoint de nuestro sitio se intercambie del principal al secundario (y viceversa) logrando que nuestros usuarios puedan empezar a ver la nueva versión de nuestro sitio sin downtime. Puedes enterarte a detalle en la documentación oficial.

Todo fuera color de rosas si esta característica no viniera con algunas falencias importantes: el efecto "swap" no es capaz de mantener los Hybrid Connections y los Site Extensions durante el proceso. Es triste que exista esta falencia, dado que muchos sitios web empresariales necesitan por lo menos una conexión hacia un endpoint interno (como el acceso a una base de datos a través de un Hybrid Connection) o alguna característica de Site Extension (como Composer, para sitios web basados en PHP/Laravel/Wordpress).

Algunos tweets después...

... y sin respuestas oficiales de como poder hacer que estas configuraciones se mantengan, empecé a busear con el Resource Explorer y descubrir la magia detrás del portal.

Básicamente, nuestro App Service y sus configuraciones están compuestos por valores con tipos definidos, y el Resource Explorer nos brinda toda esta información con una vista en formato JSON muy amigable y además la posibilidad de ver y manipular estos datos a través de su API, PowerShell o CLI 2.0, realmente nada mal. Para acceder al Resource Explorer, simplemente navega entre las opciones de tu App Service hasta llegar a la opción llamada Resource Explorer; a continuación, una captura de como luce:

ResourceExplorer

Pues bien, regresando a nuestro problema del Swap, es el Resource Explorer quien me dió el "Eureka" para hacer que las configuraciones se mantengan, haciendo uso del poderosísimo PowerShell. Algunas consideraciones: dado que el "slot" de nuestro sitio web en realidad es un nodo interno del mismo, los tipos entre nuestro sitio principal y el slot, difieren; por lo que es necesario modificarlos en el camino antes de asignarlos nuevamente al sitio principal después del "swap". En fin, como no hay mejor explicación que leer algo de código, esta sería la solución:

Pensaba que si tenemos más de un Hybrid Connection en nuestro sitio, tendríamos que modificar el código de tal forma que recorra todos los Hybrid Connection y los vaya creando, este código solo soporta el "swap" de un Hybrid Connection.

Por otro lado, lo de mantener los Site Extensions es otro postre, al menos yo, no he podido encontrar referencias de ellos en el Resource Explorer, probablemente habría que solicitar al equipo de Kudu que los incluyan en su API.Así que, mientras descubro el asunto de los Site Extensions, solo les puede decir, esta historia continuará...

Espero que les sea de utilidad.
Renzo

Renzo Robles

Los días son buenos cuando tienen código, café y salsa.

Perú