Escolar Documentos
Profissional Documentos
Cultura Documentos
sin servidor
de Azure
Libro de Segunda edición
instrucciones
Recetas para compilar y supervisar aplicaciones basadas en eventos mediante
Azure Functions
www.packt.com
Praveen Kumar Sreeram
Libro de instrucciones
de la computación sin
servidor de Azure
Segunda edición
BIRMINGHAM - BOMBAY
Libro de instrucciones de la computación sin
servidor de Azure
Segunda edición
Copyright © 2018 Packt Publishing
Todos los derechos reservados. Ninguna parte de este libro puede reproducirse,
almacenarse en un sistema de recuperación o transmitirse en cualquier formato o por
cualquier medio, sin el permiso previo por escrito del editor, excepto en el caso de citas
breves incluidas en reseñas o artículos críticos.
En aras de asegurar la exactitud de la información presentada, se han realizado todos los
esfuerzos posibles en la preparación de este libro. No obstante, la información contenida
en él se proporciona sin garantía, ya sea expresa o implícita. Ni el autor ni Packt
Publishing o sus filiales y distribuidores, serán responsables de cualquier daño causado
o presuntamente causado por este libro ya sea de forma directa o indirecta.
Si bien Packt Publishing ha procurado suministrar información sobre las marcas
comerciales de todas las empresas y productos mencionados en este libro mediante el uso
correspondiente de mayúsculas, no puede garantizar la exactitud de esta información.
Editor responsable: Vijin Boricha
Editor de adquisiciones: Shrilekha Inani
Editores de desarrollo de contenido: Nithin George Varghese
Editor técnico: Komal Karne
Editor de copias: Safis Editing
Coordinador del proyecto: Drashti Panchal
Corrector: Safis Editing
Encargado de los índices: Mariammal Chettiyar
Gráficos: Tom Scaria
Coordinador de producción: Aparna Bhagat
ISBN 978-1-78961-526-5
www.packtpub.com
No habría podido terminar el libro sin el apoyo de mi media naranja,
mi esposa Haritha y mi angelito Rithwika Sreeram
mapt.io
Mapt es una biblioteca digital online que te otorga acceso a más de 5000 libros
y vídeos, así como a herramientas líderes del sector que te ayudan a planear tu
desarrollo personal y a avanzar en tu trayectoria profesional. Para obtener más
información, visita nuestro sitio web.
PacktPub.com
¿Sabías que Packt ofrece versiones en e-book de cada libro publicado en formato PDF
y ePub? Puedes actualizarte a la versión de e-book en www.PacktPub.com y, como
cliente de libros impresos, tienes derecho a un descuento en la copia del e-book.
Ponte en contacto con nosotros en la dirección de correo electrónico service@
packtpub.com para obtener más información.
[i]
Contenido
[ ii ]
Contenido
Preparación52
Crear una nueva cuenta de Computer Vision API 52
Ajustar la configuración de la aplicación 53
Cómo hacerlo... 53
Cómo funciona... 60
Y eso no es todo… 60
Interacciones de Azure SQL Database mediante Azure Functions 61
Preparación61
Cómo hacerlo... 63
Cómo funciona... 66
Supervisar tweets a través de Logic Apps y notificar
a los usuarios publicaciones de tweets de usuarios populares 66
Preparación67
Cómo hacerlo... 67
Crear una Logic App nueva 67
Diseñar la Logic App con conectores de Twitter y Gmail 69
Probar la funcionalidad de Logic App 73
Cómo funciona... 74
Integrar Logic Apps con funciones sin servidor 74
Cómo hacerlo... 75
Y eso no es todo… 79
Consulta también 80
Auditorías de datos de Cosmos DB mediante desencadenadores
de fuente de cambios 80
Preparación80
Crear una nueva cuenta de Cosmos DB 81
Crear una nueva colección de Cosmos DB 81
Cómo hacerlo... 82
Cómo funciona... 86
Y eso no es todo… 86
Capítulo 4: Comprender la experiencia de desarrollador
integrada de Visual Studio Tools 87
Introducción 87
Crear una aplicación de función con Visual Studio 2017 88
Preparación88
Cómo hacerlo... 90
Cómo funciona... 92
Y eso no es todo… 92
Depurar Azure Functions de C# en un entorno preconfigurado
local usando Visual Studio 2017 92
Preparación93
Cómo hacerlo... 93
[ iii ]
Contenido
Cómo funciona... 97
Y eso no es todo… 97
Cómo conectarse al cloud de Azure Storage desde el entorno
local de Visual Studio 98
Preparación98
Cómo hacerlo... 98
Cómo funciona... 102
Y eso no es todo… 102
Implementar la aplicación Azure Function en Azure Cloud
mediante Visual Studio 103
Cómo hacerlo... 103
Y eso no es todo… 107
Depurar en vivo Azure Function de C#, que se hospeda
en el entorno en el cloud de Microsoft Azure, utilizando
Visual Studio 107
Preparación108
Cómo hacerlo... 108
Implementar Azure Functions en un contenedor 111
Preparación112
Creación de un ACR 113
Cómo hacerlo... 114
Crear una imagen de Docker para la aplicación de función 115
Insertar la imagen de Docker en el ACR 116
Crear una nueva aplicación de función con Docker 118
Cómo funciona... 119
Capítulo 5: Explorar las herramientas de pruebas
para la validación de Azure Functions 121
Introducción121
Probar Azure Functions 122
Preparación122
Cómo hacerlo... 123
Probar los desencadenadores de HTTP mediante Postman 123
Probar un desencadenador de blob mediante el explorador de Microsoft Storage 125
Probar el desencadenador de cola mediante el portal de administración de Azure 128
Y eso no es todo… 131
Probar una función de Azure en un entorno preconfigurado
mediante ranuras de implementación 131
Cómo hacerlo... 132
Y eso no es todo… 139
Realizar pruebas de carga de Azure Functions mediante
Azure DevOps 139
[ iv ]
Contenido
Preparación140
Cómo hacerlo... 140
Y eso no es todo… 143
Consulta también 144
Crear y probar Azure Functions a nivel local mediante
herramientas de CLI de Azure 144
Preparación145
Cómo hacerlo... 145
Probar y validar la capacidad de respuesta de la función
de Azure mediante Application Insights 148
Preparación149
Cómo hacerlo... 150
Cómo funciona... 153
Y eso no es todo… 153
Desarrollar pruebas unitarias para Azure Functions
con desencadenadores de HTTP 153
Preparación154
Cómo hacerlo... 155
Capítulo 6: Supervisar y solucionar problemas de los servicios
de Azure sin servidor 158
Introducción158
Solucionar problemas de Azure Functions 159
Cómo hacerlo... 159
Ver registros de aplicaciones en tiempo real 159
Diagnosticar la aplicación de funciones completa 161
Y eso no es todo… 162
Integrar Azure Functions con Application Insights 164
Preparación164
Cómo hacerlo... 165
Cómo funciona... 167
Y eso no es todo… 167
Supervisar Azure Functions 167
Cómo hacerlo... 167
Cómo funciona... 169
Insertar datos de telemetría personalizados
en Application Insights Analytics 169
Preparación171
Cómo hacerlo... 171
Crear una función de Application Insights 172
Configurar claves de acceso 173
Integrar y probar una consulta de Application Insights 175
[v]
Contenido
[ vi ]
Contenido
[ vii ]
Contenido
[ viii ]
Contenido
[ ix ]
Contenido
[x]
Contenido
[ xi ]
Prefacio
Prefacio
La informática sin servidor es la abstracción de la administración de infraestructura
y permite a los desarrolladores aumentar su enfoque en la lógica empresarial para que
puedan ofrecer más funciones e innovación por ciclo. Al crear aplicaciones sin servidor,
no tienes que invertir tiempo en administrar o aprovisionar la infraestructura (por
ejemplo, crear servidores, instalar actualizaciones, aplicar revisiones del SO, administrar
la escala de la aplicación). En su lugar, utiliza un conjunto de servicios en el cloud
totalmente escalables y administrados que se encargan de esa parte del trabajo.
Los beneficios de la informática sin servidor abarcan todo el ciclo de organización
y desarrollo:
• Para el desarrollador, representa un enfoque total en el valor. La creación
de aplicaciones sin servidor aumenta la capacidad individual para contribuir
de manera más efectiva al núcleo del negocio.
• Para el equipo de desarrollo, significa un tiempo de comercialización más
rápido. Un enfoque sin servidor aumenta su velocidad para ofrecer más valor
por ciclo de desarrollo.
• Para la organización, es un habilitador de la innovación desde una
base sólida. Gracias a la combinación de capacidad liberada y servicios
incorrectos, toda la organización puede actuar en las primeras señales para
desarrollar o diversificar su modelo empresarial y cumplir con su agenda
de innovación.
Cuando hablamos de aplicaciones sin servidor, podemos identificar algunos
patrones de aplicaciones que vale la pena mencionar aquí. Si bien cada uno de ellos
comparte las ventajas mencionadas anteriormente, también tienen características
específicas y ventajas adicionales que los hacen únicos y se adaptan mejor a ciertos
escenarios. Aquí están los patrones de aplicaciones sin servidor que podemos
observar:
• Las aplicaciones web, que alojan tanto el lado del back-end como el del
cliente en un servicio totalmente administrado que se ocupa de los requisitos
de escalado, seguridad y cumplimiento automáticos, con App Service.
[ xiii ]
Prefacio
[ xv ]
Prefacio
[ xvi ]
Prefacio
Convenciones utilizadas
Hay una serie de convenciones de texto que se utilizan a lo largo de este libro.
[ xvii ]
Prefacio
Negrita: indica que un nuevo término, una palabra importante o palabras que ves en
la pantalla, por ejemplo, en menús o cuadros de diálogo, que también aparecen en
este tipo de texto. Este es un ejemplo: "Durante la instalación, selecciona Desarrollo
de Azure en la sección Cargas de trabajo."
Secciones
En este libro, encontrarás varios títulos que aparecen con frecuencia (Preparación,
Cómo hacerlo..., Cómo funciona..., Y eso no es todo... y Consulta también).
Para dar instrucciones claras sobre cómo completar una receta, usa estas secciones
de la siguiente manera:
Preparación
En esta sección se indica qué esperar en la receta y se describe cómo configurar
cualquier software o cualquier configuración preliminar necesaria para la receta.
Cómo hacerlo...
Esta sección contiene los pasos necesarios para seguir la receta.
[ xviii ]
Prefacio
Cómo funciona...
Esta sección generalmente consiste en una explicación detallada de lo que sucedió en
la sección anterior.
Y eso no es todo…
Esta sección contiene información adicional sobre la receta para que tengas más
conocimiento sobre la receta.
Consulta también
En esta sección se proporcionan enlaces útiles a otra información útil para la receta.
[ xix ]
Prefacio
Reseñas
Nos encantaría que nos dejaras una reseña. Tras haber leído y utilizado este libro,
¿por qué no nos dejas una reseña en el sitio en el que lo hayas comprado? Los
lectores potenciales pueden ver tu opinión imparcial y realizar decisiones de compra
en función de ella, nosotros en Packt podemos entender qué opinas de nuestros
productos y nuestros autores podrán ver tus comentarios sobre su libro. ¡Muchas
gracias!
[ xx ]
Desarrollar aplicaciones
en el cloud mediante
desencadenadores y enlaces
de funciones
En este capítulo, abordaremos las siguientes recetas:
Introducción
Cada aplicación de software necesita componentes de back-end que sean
responsables de cuidar la lógica empresarial y almacenar los datos en algún tipo
de almacenamiento, como bases de datos y sistemas de archivos. Cada uno de estos
componentes de back-end podría desarrollarse utilizando diferentes tecnologías.
La tecnología sin servidor de Azure también nos permite desarrollar estas API
de back-end utilizando Azure Functions.
[1]
Desarrollar aplicaciones en el cloud mediante desencadenadores y enlaces de funciones
Azure Functions proporciona muchas plantillas listas para usar que resuelven los
problemas más comunes, como la conexión al almacenamiento, la creación de API
web y el recorte de imágenes. En este capítulo, descubriremos cómo usar estas
plantillas integradas. Junto con el aprendizaje de los conceptos relacionados con la
computación sin servidor de Azure, también intentaremos implementar una solución
a un problema de dominio básico de creación de componentes necesarios para que
cualquier organización gestione la información de los empleados internos.
[2]
Capítulo 1
Preparación
Comencemos nuestro viaje para comprender la informática sin servidor de Azure
utilizando Azure Functions mediante la creación de una API web back-end básica
que responde a las solicitudes HTTP:
• Consulta https://azure.microsoft.com/free/?&wt.mc_id=AID607363_
SEM_8y6Q27AS para crear una cuenta gratuita de Azure.
• Visita https://docs.microsoft.com/azure/azure-functions/
functions-create-function-app-portal para comprender el proceso
detallado de cómo crear una aplicación de función y https://docs.
microsoft.com/azure/azure-functions/functions-create-first-
azure-function crear una función. Al crear una función, también se crea
una cuenta de almacenamiento para almacenar todos los archivos. Recuerda
el nombre de la cuenta de almacenamiento, ya que se usará más adelante en
los otros capítulos.
• Después de crear la aplicación de función, desplázate por los conceptos
básicos de desencadenadores y enlaces, que son los conceptos fundamentales
de cómo funciona Azure Functions. Se recomienda encarecidamente que
leas el artículo https://docs.microsoft.com/azure/azure-functions/
functions-triggers-bindings antes de continuar.
Cómo hacerlo...
Sigue estos pasos:
[3]
Desarrollar aplicaciones en el cloud mediante desencadenadores y enlaces de funciones
[4]
Capítulo 1
[5]
Desarrollar aplicaciones en el cloud mediante desencadenadores y enlaces de funciones
using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
[6]
Capítulo 1
10. Guarda los cambios haciendo clic en el botón Guardar que se encuentra justo
encima del editor de código.
11. Intentemos probar la función RegisterUser usando la consola de prueba.
Haz clic en la pestaña Probar para abrir la consola de prueba:
13. Después de revisar los parámetros de entrada, haz clic en el botón Ejecutar
que se encuentra en la parte inferior de la consola de prueba:
[7]
Desarrollar aplicaciones en el cloud mediante desencadenadores y enlaces de funciones
Cómo funciona...
Hemos creado la primera función básica de Azure usando desencadenadores
de HTTP y hemos realizado algunas modificaciones en el código predeterminado.
El código simplemente acepta los parámetros firstname y lastname e imprime
el nombre del usuario final con un mensaje Hola {firstname} {lastname} como
respuesta. También hemos visto cómo probar la función de desencadenador de
HTTP directamente desde el portal de administración de Azure.
Consulta también
La receta Habilitar autorización para aplicaciones de la función en el capítulo 9,
Implementar prácticas recomendadas para Azure Functions
[8]
Capítulo 1
Preparación
En esta receta, descubrirás lo fácil que es integrar un desencadenador de HTTP
y el servicio almacenamiento de tablas de Azure usando enlaces de salida. La
función de desencadenador de HTTP de Azure recibe los datos de varias fuentes y
almacena los datos de perfil de usuario en una tabla de almacenamiento denominada
tblUserProfile. Vamos a seguir los requisitos previos que figuran a continuación:
Cómo hacerlo...
Sigue estos pasos:
[9]
Desarrollar aplicaciones en el cloud mediante desencadenadores y enlaces de funciones
3. Se te pedirá que instales los enlaces y hagas clic en Instalar, lo que llevaría
unos minutos. Después de instalar los enlaces, selecciona la siguiente
configuración de los enlaces de salida de almacenamiento de tablas de Azure:
° Nombre de parámetro de tabla: es el nombre del parámetro que
usarás en el método de ejecución de la función de Azure.
Para este ejemplo, proporciona objUserProfileTable como valor.
° Nombre de tabla: se creará una nueva tabla en el almacenamiento
de tablas de Azure para conservar los datos. Si la tabla aún no existe,
¡Azure creará automáticamente una para ti! Para este ejemplo,
proporciona tblUserProfile como nombre de tabla.
° Conexión de la cuenta de almacenamiento: si no ves la cadena
Conexión de la cuenta de almacenamiento, haz clic en Nuevo
(como se muestra en la siguiente captura de pantalla) para crear
una nueva o seleccionar una cuenta de almacenamiento existente.
° Los enlaces de salida del almacenamiento de tablas de Azure
deben ser como se muestran en la siguiente captura de pantalla:
using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using Microsoft.WindowsAzure.Storage.Table;
[ 10 ]
Capítulo 1
[ 11 ]
Desarrollar aplicaciones en el cloud mediante desencadenadores y enlaces de funciones
[ 12 ]
Capítulo 1
Cómo funciona...
Azure Functions nos permite integrar fácilmente con otros servicios de Azure
simplemente agregando un enlace de salida al desencadenador. Para este ejemplo,
hemos integrado el desencadenador de HTTP con el enlace de la tabla de Azure
Storage y también hemos configurado la cuenta de Azure Storage al proporcionar
la cadena de conexión de almacenamiento y el nombre de la tabla de Azure Storage
donde nos gustaría crear un registro para cada una de las solicitudes HTTP recibidas
por el desencadenador de HTTP.
[ 13 ]
Desarrollar aplicaciones en el cloud mediante desencadenadores y enlaces de funciones
[ 14 ]
Capítulo 1
Y eso no es todo…
Las siguientes son las primeras líneas del código de esta receta:
#r "Newtonsoft.json"
#r "Microsoft.WindowsAzure.Storage"
Las líneas de código anteriores le indican a la función del runtime que incluya una
referencia de la biblioteca especificada al contexto actual.
[ 15 ]
Desarrollar aplicaciones en el cloud mediante desencadenadores y enlaces de funciones
Preparación
Actualizaremos el código de la función RegisterUser que usamos en las recetas
anteriores.
Cómo hacerlo...
Sigue estos pasos:
....
[ 16 ]
Capítulo 1
....
objUserProfileTable.Execute(objTblOperationInsert);
}
8. Si todo va bien, verás el mensaje Estado: 200 OK; luego, la dirección URL
de la imagen que has pasado como un parámetro de entrada en el cuerpo
de la solicitud se creará como un mensaje de cola en el servicio de cola de
Azure Storage. Vamos a ir al explorador de Azure Storage y ver la cola
denominada userprofileimagesqueue, que es el nombre de cola que hemos
proporcionado en el paso 3. La siguiente es una captura de pantalla del
mensaje de cola que se creó:
[ 17 ]
Desarrollar aplicaciones en el cloud mediante desencadenadores y enlaces de funciones
Cómo funciona...
En esta receta, hemos agregado el enlace de salida del mensaje de cola y hemos
hecho los cambios siguientes al código:
Preparación
En la receta anterior, aprendimos a crear enlaces de salida de cola. En esta receta,
tomarás la dirección URL de la cola, crearás una matriz de bytes y luego la escribirás
en un blob.
Esta receta es una continuación de las recetas anteriores. Asegúrate de que las has
implementado.
Cómo hacerlo...
Sigue estos pasos:
[ 18 ]
Capítulo 1
[ 19 ]
Desarrollar aplicaciones en el cloud mediante desencadenadores y enlaces de funciones
{
imageData = wc.DownloadData(myQueueItem);
}
outputBlob.WriteAsync(imageData,0,imageData.Length);
}
8. Haz clic en el botón Guardar para guardar los cambios. Asegúrate de que
no haya errores de compilación en la ventana Registros:
Cómo funciona...
Hemos creado un desencadenador de cola que se ejecuta cuando llega un nuevo
mensaje a la cola. Cuando encuentra un nuevo mensaje de cola, lo lee; como
sabemos, el mensaje es una dirección URL de una imagen de perfil. La función
realiza una solicitud de cliente web, descarga los datos de imagen en forma de matriz
de bytes y luego escribe los datos en el blob, que está configurado como un blob
de salida.
[ 20 ]
Capítulo 1
Y eso no es todo…
El parámetro rand-guid generará un GUID nuevo asignado al blob que se crea
cada vez que se activa el desencadenador.
[ 21 ]
Trabajar con notificaciones
mediante los servicios
SendGrid y Twilio
En este capítulo, veremos lo siguiente:
Introducción
Para que cada aplicación empresarial ejecute sus operaciones comerciales sin
problemas, una de las características clave es tener un sistema de comunicación fiable
entre la empresa y sus clientes. El canal de comunicación puede ser bidireccional,
ya sea enviando un mensaje a los administradores que gestionan la aplicación o
enviando alertas a los clientes por correo electrónico o SMS a sus teléfonos móviles.
Azure puede integrarse con dos servicios de comunicación populares: SendGrid para
correos electrónicos y Twilio para trabajar con SMS. En este capítulo, usaremos estos
dos servicios de comunicación para descubrir cómo aprovechar sus servicios básicos
para enviar mensajes entre los administradores empresariales y los usuarios finales.
[ 23 ]
Trabajar con notificaciones mediante los servicios SendGrid y Twilio
Preparación
Seguiremos estos pasos antes de continuar:
[ 25 ]
Trabajar con notificaciones mediante los servicios SendGrid y Twilio
[ 26 ]
Capítulo 2
[ 27 ]
Trabajar con notificaciones mediante los servicios SendGrid y Twilio
Cómo hacerlo...
En esta sección, seguiremos estos pasos.
query" +
"string or in the request body");
}
[ 30 ]
Capítulo 2
[ 31 ]
Trabajar con notificaciones mediante los servicios SendGrid y Twilio
6. Después de revisar los valores, haz clic en Guardar para guardar los cambios.
7. Desplázate hasta el método Run de las funciones SendNotifications y
realiza los siguientes cambios:
° Agrega una referencia nueva para SendGrid, junto con el espacio
de nombres SendGrid.Helpers.Mail.
° Agrega un nuevo mensaje de parámetro del tipo SendGridMessage.
° Crea un objeto del tipo SendGridMessage. Vamos a ver cómo utilizar
este objeto en la siguiente receta.
[ 32 ]
Capítulo 2
{myQueueItem}");
message = new SendGridMessage();
}
Cómo funciona...
El objetivo de esta receta es enviar una notificación por correo electrónico al
administrador, enviándoles una actualización para informarle de que se ha creado
un registro nuevo.
[ 33 ]
Trabajar con notificaciones mediante los servicios SendGrid y Twilio
Y eso no es todo
Al agregar los enlaces de SendGrid, se te solicitará que instales las extensiones como
se muestra a continuación.
Si no las puedes ver, elimina el enlace de salida y vuelve a crearlas. También puedes
instalar manualmente las extensiones si sigues las instrucciones que se mencionan
en el artículo https://docs.microsoft.com/azure/azure-functions/install-
update-binding-extensions-manual.
Preparación
Asegúrate de que lo siguiente está configurado correctamente:
[ 34 ]
Capítulo 2
Cómo hacerlo...
En esta receta, actualizaremos el código en el archivo run.csx de las siguientes
Azure Functions
• RegisterUser
• SendNotifications
[ 36 ]
Capítulo 2
Cómo funciona...
Hemos actualizado el código de la función RegisterUser para aceptar otro
parámetro nuevo, denominado email.
[ 37 ]
Trabajar con notificaciones mediante los servicios SendGrid y Twilio
También podemos borrar los campos de los enlaces de salida de SendGrid, como
se muestra en la siguiente captura de pantalla:
Y eso no es todo…
También puedes enviar contenido HTML en el cuerpo para que el correo electrónico
sea más atractivo. El siguiente es un ejemplo sencillo, en el que acabo de aplicar una
etiqueta de negrita (<b>) al nombre de usuario final:
message.AddContent("text/html", "Thank you <b>" + FirstName + "</b><b>
" + LastName +" </b>so much for getting registered to our site.");
[ 38 ]
Capítulo 2
Cómo hacerlo...
Sigue estos pasos:
[ 39 ]
Trabajar con notificaciones mediante los servicios SendGrid y Twilio
4. Ejecuta una prueba con la misma carga de solicitud que usamos en la receta
anterior.
5. Después de ejecutar la prueba, el archivo de registro se creará en el
contenedor denominado userregistrationemaillogs:
[ 40 ]
Capítulo 2
Cómo funciona...
Hemos creado nuevos enlaces de salida de Azure Blob. Tan pronto como se recibe
una nueva solicitud, el contenido del correo electrónico se crea y se escribe en
un nuevo archivo .log (ten en cuenta que también puedes usar cualquier otra
extensión) que se almacena como un blob en el contenedor especificado en el
campo Ruta de los enlaces de salida.
[ 41 ]
Trabajar con notificaciones mediante los servicios SendGrid y Twilio
Preparación
Esta receta es una continuación de la receta anterior. Si estás leyendo esto primero,
asegúrate de repasar previamente las recetas de este capítulo.
Cómo hacerlo...
Tendremos que seguir estos pasos antes de continuar:
[ 42 ]
Capítulo 2
2. Ejecuta una prueba usando la misma carga de solicitud que hemos usado en
las recetas anteriores.
[ 43 ]
Trabajar con notificaciones mediante los servicios SendGrid y Twilio
[ 44 ]
Capítulo 2
Preparación
Par poder usar el enlace Twilio SMS output (objsmsmessage), tenemos que hacer
lo siguiente:
[ 45 ]
Trabajar con notificaciones mediante los servicios SendGrid y Twilio
[ 46 ]
Capítulo 2
Cómo hacerlo...
Sigue estos pasos:
[ 47 ]
Trabajar con notificaciones mediante los servicios SendGrid y Twilio
[ 48 ]
Capítulo 2
Cómo funciona...
Hemos creado una nueva cuenta de Twilio y hemos copiado el ID de cuenta
y la clave de aplicación en Configuración de la aplicación de la aplicación Azure
Function. El runtime de la aplicación de función utilizará estas dos configuraciones
para conectarse a la API de Twilio para enviar el SMS.
[ 49 ]
Integración perfecta de Azure
Functions con los Servicios
de Azure
En este capítulo, abordaremos las siguientes recetas:
Introducción
Uno de los principales objetivos de Azure Functions es permitir que los
desarrolladores puedan centrarse exclusivamente en el desarrollo de requisitos
de aplicaciones y lógica, y resumir todo lo demás.
[ 51 ]
Integración perfecta de Azure Functions con los Servicios de Azure
Azure proporciona muchos conectores que puedes aprovechar para integrar tus
aplicaciones empresariales con otros sistemas de manera muy sencilla.
Preparación
Para empezar, es necesario crear una Computer Vision API y configurar las claves
de API para que Azure Functions (o cualquier otro programa) pueda tener acceso
a ella mediante programación.
Debes asegurarte de que está instalado el explorador de Azure Storage y de que este
se ha configurado para obtener acceso al área de almacenamiento donde vas a cargar
los blobs.
[ 52 ]
Capítulo 3
Cómo hacerlo...
Sigue estos pasos:
1. Crea una función nueva mediante una de las plantillas predeterminadas con
el nombre Desencadenador de Azure Blob Storage.
[ 53 ]
Integración perfecta de Azure Functions con los Servicios de Azure
[ 54 ]
Capítulo 3
5. Después de revisar todos los detalles, haz clic en el botón Guardar para crear
el enlace de salida de Almacenamiento de tablas de Azure y guardar los
datos relativos a mujeres.
[ 55 ]
Integración perfecta de Azure Functions con los Servicios de Azure
using Newtonsoft.Json;
using Microsoft.WindowsAzure.Storage.Table;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
public static async Task Run(Stream myBlob,
string name,
IAsyncCollector<FaceRectangle>
outMaleTable,
IAsyncCollector<FaceRectangle>
outFemaleTable,
ILogger log)
{
log.LogInformation($"C# Blob trigger function Processed blob\n
Name:{name} \n Size: {myBlob.Length} Bytes");
string result = await CallVisionAPI(myBlob);
log.LogInformation(result);
if (String.IsNullOrEmpty(result))
{
return;
}
ImageData imageData = JsonConvert.DeserializeObject<ImageData>
(result);
foreach (Face face in imageData.Faces)
{
var faceRectangle = face.FaceRectangle;
faceRectangle.RowKey = Guid.NewGuid().ToString();
faceRectangle.PartitionKey = "Functions";
faceRectangle.ImageFile = name + ".jpg";
if(face.Gender=="Female")
{
await outFemaleTable.AddAsync(faceRectangle);
[ 56 ]
Capítulo 3
}
Else
{
await outMaleTable.AddAsync(faceRectangle);
}
}
}
static async Task<string> CallVisionAPI(Stream image)
{
using (var client = new HttpClient())
{
var content = new StreamContent(image);
var url = "https://westeurope.api.cognitive.microsoft.com/
vision/v1.0/analyze?visualFeatures=Faces&language=en";
client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-
Key", Environment.GetEnvironmentVariable("Vision_API_Subscription_
Key"));
content.Headers.ContentType = new MediaTypeHeaderValue("ap
plication/octet-stream");
var httpResponse = await client.PostAsync(url, content);
if (httpResponse.StatusCode == HttpStatusCode.OK)
{
return await httpResponse.Content.ReadAsStringAsync();
}
}
return null;
}
public class ImageData
{
public List<Face> Faces { get; set; }
}
public class Face
{
public int Age { get; set; }
public string Gender { get; set; }
public FaceRectangle FaceRectangle { get; set; }
}
public class FaceRectangle : TableEntity
{
public string ImageFile { get; set; }
public int Left { get; set; }
public int Top { get; set; }
public int Width { get; set; }
public int Height { get; set; }}
[ 57 ]
Integración perfecta de Azure Functions con los Servicios de Azure
[ 58 ]
Capítulo 3
[ 59 ]
Integración perfecta de Azure Functions con los Servicios de Azure
Cómo funciona...
Primero hemos creado un enlace de salida de Almacenamiento de tablas para
almacenar detalles sobre todos los hombres de las fotos. Luego, hemos creado otro
enlace de salida de Almacenamiento de tablas para almacenar los detalles sobre
todas las mujeres.
Ten en cuenta que las API no son 100 % exactas en la identificación del
género correcto. Por lo tanto, en tus entornos de producción, debes contar
con un mecanismo de reserva que te permita manejar estas situaciones.
Y eso no es todo…
El código predeterminado que proporciona la plantilla invoca la Computer Vision
API al pasar la imagen que hemos cargado en el almacenamiento de blobs. Las
plantillas de localización de caras invocan la llamada a API pasando el parámetro
visualFeatures=Faces, que devuelve información sobre lo siguiente:
• Edad
• Género
• Coordenadas de las caras de la imagen
[ 60 ]
Capítulo 3
En esta receta, aprenderás a utilizar la API de ADO.NET para conectarte a una SQL
Database e insertar datos JSON en una tabla denominada EmployeeInfo.
Preparación
Ve al portal de Azure y haz lo siguiente:
[ 61 ]
Integración perfecta de Azure Functions con los Servicios de Azure
3. Para crear una regla de firewall para tu dirección IP, haz clic en el botón
Establecer regla de firewall en la hoja Información general para que puedas
conectarte a las Azure SQL Databases a través de SQL Server Management
Studio (SSMS). Si no tienes SSMS, instala la versión más reciente de SSMS.
La puedes descargar en https://docs.microsoft.com/sql/ssms/
download-sql-server-management-studio-ssms.
4. Haz clic en el enlace Mostrar las cadenas de conexión de la base de datos
en la hoja Información esencial de SQL Database, como se muestra en la
siguiente captura de pantalla:
[ 62 ]
Capítulo 3
6. Abre SSMS y conéctate al servidor SQL Server lógico de Azure que creaste
en los pasos anteriores.
7. Una vez que conectado, crea una nueva tabla con el nombre EmployeeInfo
utilizando el siguiente esquema:
CREATE TABLE [dbo].[EmployeeInfo](
[PKEmployeeId] [bigint] IDENTITY(1,1) NOT NULL,
[firstname] [varchar](50) NOT NULL,
[lastname] [varchar](50) NULL,
[email] [varchar](50) NOT NULL,
[devicelist] [varchar](max) NULL,
CONSTRAINT [PK_EmployeeInfo] PRIMARY KEY CLUSTERED
(
[PKEmployeeId] ASC
)
)
Cómo hacerlo...
Sigue estos pasos:
using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using System.Data.SqlClient;
using System.Data;
[ 63 ]
Integración perfecta de Azure Functions con los Servicios de Azure
con = new
SqlConnection("Server=tcp:azurecookbooks.database.
windows.net,1433;Initial Catalog=Cookbookdatabase;Persist Security
Info=False;User ID=username;Password=password;MultipleActiveResu
ltSets=False;Encrypt=True;TrustServerCertificate=False;Connection
Timeout=30;");
SqlCommand cmd = new SqlCommand(query, con);
cmd.Parameters.Add("@firstname", SqlDbType.VarChar,
50).Value = firstname;
cmd.Parameters.Add("@lastname", SqlDbType.VarChar,
50)
.Value = lastname;
cmd.Parameters.Add("@email", SqlDbType.VarChar, 50)
.Value = email;
cmd.Parameters.Add("@devicelist", SqlDbType.VarChar)
.Value = devicelist;
con.Open();
cmd.ExecuteNonQuery();
}
catch(Exception ex)
{
log.LogInformation(ex.Message);
}
Finally
{
[ 64 ]
Capítulo 3
if(con!=null)
{
con.Close();
}
}
Ten en cuenta que debes validar todos y cada uno de los parámetros de entrada. Para
que resulte más sencillo, el código que valida los parámetros de entrada no está incluido.
Asegúrate de validar todos los parámetros antes de guardarlos en la base de datos. También
se recomienda almacenar la cadena de conexión en la Configuración de la aplicación.
Ten en cuenta que debes validar todos y cada uno de los parámetros de entrada. Para
que resulte más sencillo, el código que valida los parámetros de entrada no está incluido.
Asegúrate de validar todos los parámetros antes de guardarlos en la base de datos.
[ 65 ]
Integración perfecta de Azure Functions con los Servicios de Azure
Cómo funciona...
El objetivo de esta receta era aceptar los valores de entrada del usuario y guardarlos
en una base de datos relacional donde poder recuperar los datos posteriormente para
fines operativos. Para ello, hemos utilizado Azure SQL Database, una oferta de base
de datos relacional también conocida como base de datos como servicio (DBaaS).
Hemos creado una nueva SQL Database y reglas de firewall que nos permiten
conectar de forma remota desde la estación de trabajo de desarrollo local mediante
SSMS. También hemos creado una tabla denominada EmployeeInfo, que se puede
utilizar para guardar datos.
Hemos desarrollado un sencillo programa que utiliza la API ADO.NET, que conecta
con Azure SQL Database e inserta datos en la tabla EmployeeInfo.
Antes de conocer Azure Logic Apps, pensé que llevaría varias semanas estudiar,
desarrollar, probar e implementar una solución de este tipo. Obviamente, se
necesitaría bastante tiempo para estudiar, comprender y consumir la API de Twitter
(o de cualquier otro canal social) para obtener la información necesaria y crear una
solución completa que resuelva el problema.
Afortunadamente, tras conocer Logic Apps y sus conectores listos para usar,
comprobé que apenas se tarda 10 minutos en diseñar una solución para el problema
que tenía mi amigo.
En esta receta, aprenderás a diseñar una Logic App que se integre con Twitter
(para supervisar tweets) y Gmail (para enviar correos electrónicos).
Preparación
Necesitamos lo siguiente para trabajar con esta receta:
Al trabajar con esta receta, tendremos que autorizar a Azure Logic Apps para
acceder a tus cuentas.
Cómo hacerlo...
Vamos a llevar a cabo los siguientes pasos:
[ 67 ]
Integración perfecta de Azure Functions con los Servicios de Azure
[ 68 ]
Capítulo 3
[ 69 ]
Integración perfecta de Azure Functions con los Servicios de Azure
4. Ahora vamos a agregar una condición nueva. Para ello, hay que hacer
clic en Siguiente paso, buscar la condición y seleccionar la acción para
la condición, como se muestra en la siguiente captura de pantalla:
[ 70 ]
Capítulo 3
[ 71 ]
Integración perfecta de Azure Functions con los Servicios de Azure
[ 72 ]
Capítulo 3
11. Una vez que hayas terminado, haz clic en el botón Guardar.
[ 73 ]
Integración perfecta de Azure Functions con los Servicios de Azure
Cómo funciona...
Has creado una nueva Logic App y has elegido el conector de Twitter para
supervisar los tweets publicados con el hashtag #AzureFunctions una vez por
minuto. Si hay algún tweet con ese hashtag, la aplicación comprueba si el recuento
de seguidores es mayor o igual que 200. Si el recuento de seguidores cumple la
condición, se crea una acción nueva con un nuevo conector de Gmail que envía
un correo electrónico con el contenido dinámico que deseas enmarcar usando los
parámetros del conector de Twitter.
[ 74 ]
Capítulo 3
Preparación
Antes de seguir avanzando, vamos a realizar los siguientes pasos:
1. Crea una cuenta de SendGrid (si no se ha creado ya), obtén la clave de API
de SendGrid y crea una clave nueva en la Configuración de la aplicación
de la Function App.
2. Instala Postman para probar el desencadenador de HTTP. Puedes descargar
la herramienta en https://www.getpostman.com/.
Cómo hacerlo...
Sigue estos pasos:
using SendGrid.Helpers.Mail;
public static async Task<IActionResult> Run(HttpRequest req, IAsyn
cCollector<SendGridMessage> messages, ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a
request.");
}
Else
{
message = null;
}
await messages.AddAsync(message);
return (ActionResult)new OkObjectResult($"Hello");
}
[ 76 ]
Capítulo 3
[ 77 ]
Integración perfecta de Azure Functions con los Servicios de Azure
[ 78 ]
Capítulo 3
10. En el siguiente paso, hay que preparar la entrada JSON que se debe
pasar desde la Logic App a la función de desencadenador de HTTP
ValidateTwitterFollowerCount que hemos desarrollado. Ahora vamos
a enmarcar la entrada JSON de la misma manera que lo hicimos al probar la
función de desencadenador de HTTP mediante Postman, como se muestra
en la siguiente captura de pantalla (la única diferencia es que los valores,
como followersCount, Name y tweettext, son dinámicos ahora):
11. Una vez que hayas revisado todos los parámetros que espera la función
ValidateTwitterFollowerCount, haz clic en el botón Guardar para guardar
los cambios.
12. Puedes esperar unos minutos o publicar un tweet con el hashtag que has
configurado en el campo de entrada Texto de búsqueda.
Y eso no es todo…
Si no ves el parámetro dinámico previsto, haz clic en el botón Ver más, como
se muestra en la siguiente captura de pantalla:
[ 79 ]
Integración perfecta de Azure Functions con los Servicios de Azure
Consulta también
• Consulta la receta Enviar una notificación por correo electrónico al usuario final de
forma dinámica en el capítulo 2, Trabajar con notificaciones mediante los servicios
SendGrid y Twilio
Preparación
Para poder comenzar, debemos hacer primero lo siguiente:
• Crear una cuenta de Cosmos DB
• Crear una nueva colección de Cosmos DB en la que puedas almacenar datos
en forma de documentos
[ 80 ]
Capítulo 3
1. Una vez creada la cuenta, tendrás que crear una base de datos nueva
y una colección. Podemos crear las dos en un solo paso directamente desde
el portal.
2. Ve a la pestaña Información general y haz clic en el botón Agregar colección
para crear una colección nueva:
[ 81 ]
Integración perfecta de Azure Functions con los Servicios de Azure
Cómo hacerlo...
Sigue estos pasos:
[ 82 ]
Capítulo 3
[ 83 ]
Integración perfecta de Azure Functions con los Servicios de Azure
3. Una vez que hayas revisado los detalles, haz clic en el botón Guardar (que
se muestra en la captura de pantalla anterior) para crear la nueva función,
que se activará cada vez que se realice un cambio en la colección. Ahora,
iremos rápidamente a la aplicación de la función de Azure (en mi caso, es
AzureFunctionCookBookV2) para ver si se ha creado la función nueva con
el nombre cookbookdatacollectionTrigger. Esto es lo que aparece en la
aplicación de mi función:
6. Una vez que hayas reemplazado el JSON predeterminado (que solo tiene
un atributo Id.) con el JSON que tiene los atributos necesarios, haz clic en
el botón Guardar para guardar los cambios y acceder rápidamente a la
pestaña del otro navegador, donde está abierta la función de Azure,
y revisar los registros para comprobar la salida de la función. Así es como
se muestran mis registros justo después de agregar un valor al atributo Id.
del documento. Puede que a ti te aparezca de otra forma, va a depender
de la estructura JSON:
[ 85 ]
Integración perfecta de Azure Functions con los Servicios de Azure
Cómo funciona...
Para integrar las Azure Functions con Cosmos DB, primero hemos creado una
cuenta de Cosmos DB, a continuación, una base de datos y, dentro de esta, una
colección nueva. Una vez creada la colección, la hemos integrado desde el portal
de Azure. Para ello, hemos hecho clic en el botón Agregar Azure Function, que está
disponible en el nivel de cuenta de Cosmos DB. Hemos elegido la Function App
necesaria en la que queríamos crear un desencadenador de Cosmos DB. Una vez
finalizada la integración, hemos creado un documento de muestra en la colección
de Cosmos DB y, a continuación, hemos comprobado que la función se ha activado
automáticamente para todos los cambios (todas las lecturas y escrituras, pero no las
eliminaciones) que hemos realizado en la colección.
Y eso no es todo…
Al integrar Azure Functions para realizar un seguimiento de los cambios de Cosmos
DB, se creará automáticamente una colección nueva denominada concesiones, como
se muestra aquí. Ten en cuenta que esto conlleva coste adicional, ya que el coste en
Cosmos DB se basa en las unidades de solicitud (RU) asignadas a cada colección:
[ 86 ]
Comprender la experiencia
de desarrollador integrada de
Visual Studio Tools
En este capítulo, explicaremos lo siguiente:
• Crear una aplicación de función con Visual Studio 2017
• Depurar Azure Functions de C# en un entorno preconfigurado local usando
Visual Studio 2017
• Cómo conectarse al cloud de Azure Storage desde el entorno local de
Visual Studio
• Implementar la aplicación Azure Function en Azure Cloud mediante
Visual Studio
• Depurar en vivo Azure Function de C#, que se hospeda en el entorno
en el cloud de Microsoft Azure, utilizando Visual Studio
• Implementar Azure Functions en un contenedor
Introducción
En todos los capítulos anteriores, hemos visto cómo crear Azure Functions
directamente desde el portal de administración de Azure. A continuación,
vemos algunas de las características:
A pesar de todas las ventajas mencionadas, puede que los desarrolladores no lo vean
cómodo si se acostumbraron a trabajar con sus entornos de desarrollo integrado
(IDE) favoritos hace mucho tiempo. Por lo tanto, el equipo de Microsoft ha creado
algunas herramientas que ayudan a los desarrolladores a integrarlos en Visual
Studio para que puedan aprovechar algunas de las características IDE importantes
que aceleran sus esfuerzos de desarrollo. Aquí tenemos algunas:
Preparación
Debes descargar e instalar el software y las herramientas siguientes:
[ 88 ]
Capítulo 4
[ 89 ]
Comprender la experiencia de desarrollador integrada de Visual Studio Tools
Cómo hacerlo...
Sigue estos pasos:
[ 90 ]
Capítulo 4
[ 91 ]
Comprender la experiencia de desarrollador integrada de Visual Studio Tools
Cómo funciona...
Las herramientas de Visual Studio de Azure Functions permiten a los
desarrolladores usar su IDE favorito, que puede que lleven años utilizando. Con
las herramientas de Azure Function, puedes usar el mismo conjunto de plantillas
que proporciona el portal de administración de Azure para la rápida creación e
integración con los servicios en el cloud sin escribir ningún código de asociación
(o un código mínimo).
La otra ventaja de usar las herramientas de Visual Studio para las funciones es que
no es necesario tener una suscripción a Azure en vivo. Puedes depurar y probar
Azure Functions directamente en tu entorno de desarrollo local. La CLI de Azure
y las utilidades relacionadas nos brindan toda la asistencia necesaria para ejecutar
Azure Functions.
Y eso no es todo…
Uno de los problemas más comunes a los que se enfrentan los desarrolladores al
desarrollar cualquier aplicación en su entorno local es que todo funciona bien en el
equipo local, pero no en el entorno de producción. Cuando hablamos de Azure Functions,
los desarrolladores no deben preocuparse acerca de esto. El runtime de Azure
Functions, proporcionado por las herramientas de la CLI de Azure, es exactamente
el mismo runtime disponible en Azure Cloud.
Preparación
Descarga e instala la CLI de Azure (si no tienes estas herramientas instaladas, ten
en cuenta que Visual Studio las descargará automáticamente cuando ejecutes tus
funciones desde Visual Studio).
Cómo hacerlo...
Sigue estos pasos:
[ 93 ]
Comprender la experiencia de desarrollador integrada de Visual Studio Tools
[ 94 ]
Capítulo 4
[ 95 ]
Comprender la experiencia de desarrollador integrada de Visual Studio Tools
10. Una vez completada la depuración, puedes hacer clic en la tecla F5 para
finalizar el proceso de ejecución, después del cual verás la respuesta de salida
en el navegador, como se muestra en la siguiente captura de pantalla:
Cómo funciona...
El host de trabajo funciona como un servidor que escucha un puerto específico.
Si hay alguna solicitud a ese puerto en concreto, automáticamente se encarga de
ejecutar las solicitudes y envía una respuesta.
Y eso no es todo…
Al usar Visual Studio, puedes crear directamente funciones precompiladas, lo que
significa que cuando compilas tus funciones, Visual Studio crea un archivo .dll
al que se puede hacer referencia en otras aplicaciones, tal como lo haces para las
clases normales. A continuación, se enumeran dos de las ventajas de usar funciones
precompiladas:
[ 97 ]
Comprender la experiencia de desarrollador integrada de Visual Studio Tools
Preparación
Establece los siguientes requisitos previos:
Cómo hacerlo...
Sigue estos pasos:
[ 98 ]
Capítulo 4
[ 99 ]
Comprender la experiencia de desarrollador integrada de Visual Studio Tools
[ 101 ]
Comprender la experiencia de desarrollador integrada de Visual Studio Tools
Cómo funciona...
En esta clase BlobTriggerCSharp, el método Run tiene los atributos de WebJobs
con una cadena de conexión (en este caso, es AzureWebJobsStorage). Esto indica
al runtime que consulte la cadena de conexión de Azure Storage en el archivo de
configuración de opciones local con la clave nombrada después de la cadena de
conexión AzureWebJobsStorage. Cuando el host de trabajo se empieza a ejecutar,
usa la cadena de conexión y mantiene el control de los contenedores de las cuentas de
almacenamiento que hemos especificado. Cada vez que se agrega o actualiza un nuevo
blob, desencadena automáticamente el desencadenador de blob en el entorno actual.
Y eso no es todo…
Al crear Azure Functions en el portal de administración de Azure, debes crear
desencadenadores y enlaces de salida en la pestaña Integrar de cada Azure Function.
Sin embargo, cuando creas una función desde el IDE de Visual Studio 2017, solo
puedes configurar los atributos de WebJobs para lograrlo.
[ 102 ]
Capítulo 4
• El grupo de recursos
• El plan de App Service
• La aplicación Azure Function
Puedes proporcionar toda esta información directamente desde Visual Studio sin
abrir el portal de administración de Azure. Aprenderás a hacer eso en esta receta.
Cómo hacerlo...
Sigue estos pasos:
[ 103 ]
Comprender la experiencia de desarrollador integrada de Visual Studio Tools
[ 104 ]
Capítulo 4
[ 105 ]
Comprender la experiencia de desarrollador integrada de Visual Studio Tools
[ 106 ]
Capítulo 4
Y eso no es todo…
Las Azure Functions creadas desde Visual Studio 2017 están precompiladas, lo
que significa que implementas los archivos .dll de Visual Studio 2017 en Azure.
Por lo tanto, no puedes editar el código de las funciones en Azure después de
implementarlas. Sin embargo, puedes realizar cambios en las opciones, como
cambiar la cadena de conexión de Azure Storage, la ruta del contenedor, etc.
Vamos a ver cómo hacerlo en la siguiente receta.
[ 107 ]
Comprender la experiencia de desarrollador integrada de Visual Studio Tools
Preparación
Crea un contenedor denominado cookbookfiles-live en la cuenta de
almacenamiento. Vamos a cargar un blob en este contenedor.
Cómo hacerlo...
Sigue estos pasos:
[ 108 ]
Capítulo 4
[ 109 ]
Comprender la experiencia de desarrollador integrada de Visual Studio Tools
[ 110 ]
Capítulo 4
Al ver el título de esta receta, es posible que ya te estés preguntando por qué y cómo
puede ser útil la implementación de Azure Function en un contenedor de Docker.
Exacto, la combinación de Azure Functions y el contenedor de Docker podría no
tener sentido, ya que perderías todas las ventajas de Azure Functions sin servidor
al realizar la implementación en Docker. Sin embargo, puede haber algunos clientes
cuyas cargas de trabajo existentes puedan estar en algún cloud (ya sea público o
privado), pero ahora quieren aprovechar algunos de los desencadenadores de Azure
Function y los servicios de Azure relacionados, por lo que querrán implementar
Azure Functions como una imagen de Docker. Esta receta trata sobre cómo
implementar esto.
Preparación
A continuación, se indican los requisitos previos para empezar a trabajar con
esta receta:
[ 112 ]
Capítulo 4
Creación de un ACR
Sigue estos pasos:
[ 113 ]
Comprender la experiencia de desarrollador integrada de Visual Studio Tools
Cómo hacerlo...
En los tres primeros capítulos, hemos creado la aplicación de función y las funciones
en el portal. Y, hasta el momento, en este capítulo, hemos creado la aplicación de
función y las funciones en Visual Studio.
[ 114 ]
Capítulo 4
[ 115 ]
Comprender la experiencia de desarrollador integrada de Visual Studio Tools
[ 116 ]
Capítulo 4
4. Después de revisar todos los detalles, haz clic en el botón Crear para crear la
aplicación de función.
5. Eso es todo. Hemos creado una aplicación de función que nos permite
implementar las imágenes de Docker enlazándolas a la imagen hospedada
en Azure Container Registry. Vamos a probar rápidamente HttpTrigger
navegando hasta el punto de conexión de HTTP en el navegador.
A continuación, vemos el resultado de Azure Function.
Cómo funciona...
En los tres primeros capítulos, hemos creado la aplicación de función y las funciones
en el portal. Por el contrario, hasta el momento, en este capítulo, hemos creado la
aplicación de función y las funciones en Visual Studio.
[ 119 ]
Comprender la experiencia de desarrollador integrada de Visual Studio Tools
Los puntos numerados de este diagrama hacen referencia a los pasos siguientes:
[ 120 ]
Explorar las herramientas de
pruebas para la validación de
Azure Functions
En este capítulo, vamos a explorar distintas formas de probar Azure Functions
con mayor detalle con las siguientes recetas:
Introducción
En los capítulos anteriores, has descubierto cómo desarrollar Azure Functions
y cuándo pueden resultar útiles. Además, has aprendido a validar la funcionalidad
de dichas funciones.
[ 121 ]
Explorar las herramientas de pruebas para la validación de Azure Functions
Preparación
Si no lo has hecho previamente, instala las siguientes herramientas:
[ 122 ]
Capítulo 5
Cómo hacerlo...
En esta sección, vamos a crear tres Azure Functions con las plantillas
predeterminadas disponibles en el portal de administración de Azure
y, a continuación, las probaremos con diferentes herramientas.
using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
string firstname=req.Query["firstname"];
string lastname=req.Query["lastname"];
[ 123 ]
Explorar las herramientas de pruebas para la validación de Azure Functions
1. En primer lugar, elige el tipo de método HTTP con el que quieras
realizar la solicitud HTTP. De forma predeterminada, nuestra función
acepta la mayoría de los métodos. Elige el método GET, tal como se
muestra a continuación:
[ 124 ]
Capítulo 5
[ 125 ]
Explorar las herramientas de pruebas para la validación de Azure Functions
[ 126 ]
Capítulo 5
[ 127 ]
Explorar las herramientas de pruebas para la validación de Azure Functions
[ 128 ]
Capítulo 5
3. En la hoja Servicio de cola, haz clic en Cola para añadir una cola nueva:
[ 129 ]
Explorar las herramientas de pruebas para la validación de Azure Functions
[ 130 ]
Capítulo 5
Y eso no es todo…
Para todos los desencadenadores de HTTP, si quieres que los clientes de la API solo
utilicen el método POST, restríngelo. Para ello, elige Métodos seleccionados y solo
POST en Métodos HTTP seleccionados, tal como se muestra en la siguiente captura
de pantalla:
[ 131 ]
Explorar las herramientas de pruebas para la validación de Azure Functions
Cómo hacerlo...
Sigue estos pasos:
[ 132 ]
Capítulo 5
[ 133 ]
Explorar las herramientas de pruebas para la validación de Azure Functions
11. Cuando hagas clic en Crear, se creará una nueva ranura, tal como se indica
en la siguiente captura de pantalla. En este caso, si Functions es de solo
lectura, puedes cambiar a lectura y escritura en la configuración de la
aplicación de función.
12. Para que un entorno preconfigurado esté completo, deberás copiar todas las
Azure Functions desde el entorno de producción (en este caso, la aplicación
MyProductionApp) en la nueva ranura preconfigurada denominada Ensayo.
Crea dos desencadenadores de HTTP y copia el código de ambas funciones
(MyProd-HttpTrigger1 y MyProd-HttpTrigger2) de MyProductionApp a la
nueva ranura Ensayo. Básicamente, deberás copiar manualmente todas las
funciones en la nueva ranura.
13. Cambia la cadena producción por ensayo en la última línea de ambas
funciones de la ranura Ensayo. Esto resultará útil para probar el resultado
de la operación de intercambio:
[ 134 ]
Capítulo 5
Ten en cuenta que, en todas las ranuras que crees como aplicación de
preproducción, deberás asegurarte de utilizar los mismos nombres de
función que tienes en el entorno de producción.
[ 135 ]
Explorar las herramientas de pruebas para la validación de Azure Functions
16. Cuando revises la configuración, haz clic en el botón Aceptar del paso
anterior. Se tardará unos minutos en intercambiar las funciones. Aparecerá
una barra de progreso, tal como se muestra en la siguiente captura
de pantalla:
[ 136 ]
Capítulo 5
[ 137 ]
Explorar las herramientas de pruebas para la validación de Azure Functions
Y eso no es todo…
Si intentas crear una ranura sin habilitar la función Ranuras de implementación,
verás algo similar a lo que se muestra en la siguiente captura de pantalla:
Debes tener todas las Azure Functions en todas las ranuras que quieras intercambiar
con la aplicación de función de producción:
[ 139 ]
Explorar las herramientas de pruebas para la validación de Azure Functions
Preparación
Crea una cuenta de Azure DevOps en https://visualstudio.microsoft.com/.
Vamos a utilizar la herramienta Prueba de carga de Azure DevOps para crear
pruebas de carga basadas en URL.
Cómo hacerlo...
Sigue estos pasos:
[ 140 ]
Capítulo 5
[ 141 ]
Explorar las herramientas de pruebas para la validación de Azure Functions
10. El siguiente paso es proporcionar detalles sobre la carga que queremos crear
en la función de Azure. Como se indica en la siguiente captura de pantalla,
haz clic en Configuración y proporciona información sobre la prueba de
carga que desees en función de tus requisitos:
[ 142 ]
Capítulo 5
12. Haz clic en Ejecutar prueba para iniciar la prueba de carga. Dado que la
duración de la ejecución de nuestra prueba de carga es de 20 minutos, se
tardará 20 minutos en completarla. Cuando la carga se haya completado,
Azure DevOps proporcionará los informes de rendimiento, tal como se
indica a continuación:
° Informe de resumen: esta opción proporciona el tiempo medio de
respuesta del desencadenador de HTTP para una carga de 1000
usuarios.
Y eso no es todo…
También podemos consultar cómo Azure se amplía automáticamente en segundo
plano en la pestaña Live Metrics Stream de Application Insights. La siguiente
captura de pantalla muestra los identificadores de instancia y el estado de las
máquinas virtuales que se asignan automáticamente, en función de la carga en la
arquitectura sin servidor de Azure. Descubrirás cómo integrar Application Insights
con Azure Functions en el capítulo 6, Supervisar y solucionar problemas de servicios de
Azure sin servidor
[ 143 ]
Explorar las herramientas de pruebas para la validación de Azure Functions
Consulta también
La receta de supervisión de Azure Functions mediante Application Insights del
capítulo 6, Supervisar y solucionar problemas de servicios de Azure sin servidor, contiene
más información sobre este tema.
Azure también nos proporciona herramientas para los desarrolladores que disfrutan
al trabajar con la línea de comandos. Estas herramientas nos permiten crear recursos
de Azure con comandos sencillos directamente desde la línea de comandos. En esta
receta, aprenderás a crear una nueva aplicación de función y comprenderás cómo
crear una función e implementarla en el cloud de Azure desde la línea de comandos.
[ 144 ]
Capítulo 5
Preparación
Sigue estos pasos:
Cómo hacerlo...
Sigue estos pasos:
[ 145 ]
Explorar las herramientas de pruebas para la validación de Azure Functions
[ 146 ]
Capítulo 5
[ 147 ]
Explorar las herramientas de pruebas para la validación de Azure Functions
Nos resultaría muy útil recibir una notificación cuando el sitio no esté disponible
o no responda a las solicitudes de los usuarios. Azure proporciona unas cuantas
herramientas para alertarnos si el sitio web no responde o no está disponible. Una
de ellas es Application Insights. Aprenderás a configurar Application Insights para
hacer ping a nuestra aplicación de función de Azure cada minuto y ajustarla para
que nos avise si la función no responde.
[ 148 ]
Capítulo 5
Preparación
Sigue estos pasos:
[ 149 ]
Explorar las herramientas de pruebas para la validación de Azure Functions
Cómo hacerlo...
Sigue estos pasos:
[ 150 ]
Capítulo 5
[ 151 ]
Explorar las herramientas de pruebas para la validación de Azure Functions
[ 152 ]
Capítulo 5
Cómo funciona...
Hemos creado una prueba de Disponibilidad en la que se hará ping en nuestra
aplicación de función cada cinco minutos desde un máximo de cinco ubicaciones
diferentes de todo el mundo. Puedes configurarlas en la pestaña Ubicación de
la prueba de la hoja Crear prueba al crear la prueba. El criterio predeterminado
del ping es comprobar si el código de respuesta de la URL es 200. Si el código de
respuesta no es 200, la prueba habrá fallado y se enviará una alerta a la dirección de
correo electrónico configurable.
Y eso no es todo…
Puedes utilizar una prueba web de varios pasos (con la opción Tipo de prueba de
la hoja Crear prueba) si quieres probar una página o funcionalidad que requiera la
navegación por distintas páginas.
Preparación
Vamos a utilizar el marco de simulación de Moq para realizar una prueba unitaria de
nuestra función de Azure. Para esta receta, es necesario un conocimiento básico del
funcionamiento de Moq. Si lo necesitas, puedes obtener más información sobre Moq
en https://github.com/moq/moq4/wiki.
Para que el caso de prueba unitaria sea más sencillo, he comentado las líneas
de código que leen los datos de los parámetros Post del método Run del
desencadenador de HTTP HTTPTriggerCSharpFromVS, tal como se muestra a
continuación destacado en negrita.
[FunctionName("HTTPTriggerCSharpFromVS")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post",
Route = null)] HttpRequest req,
ILogger log)
{
log.LogInformation("C# HTTP trigger function processed
a request.");
[ 154 ]
Capítulo 5
Cómo hacerlo...
Sigue estos pasos:
1. Crea un nuevo proyecto de pruebas unitarias. Para ello, haz clic con el botón
derecho en la solución y, a continuación, haz clic en Agregar nuevo proyecto.
En la ventana Agregar nuevo proyecto, selecciona Prueba en la lista de Tipo
de proyecto y xUnit Test Project(.NET Core) en la lista de proyectos tal
como se indica a continuación:
[ 155 ]
Explorar las herramientas de pruebas para la validación de Azure Functions
namespace AzureFunctions.Tests
{
public class ShouldExecuteAzureFunctions
{
[Fact]
public async Task WithAQueryString()
{
var httpRequestMock = new Mock<HttpRequest>();
var LogMock = new Mock<ILogger>();
var queryStringParams = new Dictionary<String,
StringValues>();
httpRequestMock.Setup(req => req.Query).Returns(new Qu
eryCollection(queryStringParams));
queryStringParams.Add("name", "Praveen Sreeram");
[ 156 ]
Capítulo 5
5. Haz clic con el botón derecho en la prueba unitaria y haz clic en Ejecutar
prueba, tal como se muestra en la siguiente captura de pantalla:
Eso es todo. Hemos aprendido a escribir un caso de prueba unitaria básica para un
desencadenador de HTTP.
[ 157 ]
Supervisar y solucionar
problemas de los servicios de
Azure sin servidor
En este capítulo, vas a aprender lo siguiente:
Introducción
El proceso de implementación no termina cuando se completa el desarrollo de un
proyecto y se lanza una aplicación. Debemos supervisar continuamente nuestras
aplicaciones, analizar su rendimiento y revisar los registros para determinar si el
usuario final está experimentando problemas.
En este capítulo, vas a aprender a utilizar estas herramientas y a tomar las medidas
necesarias en función de la información disponible.
[ 158 ]
Capítulo 6
Cómo hacerlo...
Una vez desarrolladas y probadas tus aplicaciones en el entorno local, puedes
intentar implementarlas en Azure. Puede haber casos en los que surjan problemas
después de implementar una aplicación en Azure, ya que el entorno es diferente.
Por ejemplo, es posible que un desarrollador no haya creado la configuración
de la aplicación en la aplicación. Si falta una clave de configuración, es posible
que la aplicación no funcione de la forma prevista y no es fácil solucionar el
error. Afortunadamente, el entorno de Azure facilita esta resolución gracias a la
característica de secuencias de registro. En esta receta, vamos a aprender a ver los
registros en tiempo real y a utilizar la función Diagnosticar y solucionar problemas.
[ 159 ]
Supervisar y solucionar problemas de los servicios de Azure sin servidor
La ventana de registro muestra los errores solo para esa función concreta,
no para las demás funciones asociadas a la aplicación de funciones. Es
en este caso en el que resultan útiles los registros de las aplicaciones de
secuencias de registro, que se pueden utilizar para todas las funciones de
cualquier aplicación de funciones.
[ 160 ]
Capítulo 6
[ 161 ]
Supervisar y solucionar problemas de los servicios de Azure sin servidor
Y eso no es todo…
Cada evento de función se registra en un servicio de Almacenamiento
de tablas de Azure. Cada mes, se crea una tabla con el nombre
AzureWebJobsHostLogs<año><mes>.
[ 162 ]
Capítulo 6
[ 163 ]
Supervisar y solucionar problemas de los servicios de Azure sin servidor
Preparación
Hemos creado una cuenta de Application Insights en la receta Probar y validar la
capacidad de respuesta de Azure Functions mediante Application Insights del capítulo 5,
Explorar herramientas de prueba para la validación de Azure Functions. Sigue estos pasos
para crear una cuenta si aún no lo has hecho:
1. Ve al portal de Administración de Azure, haz clic en Crear un recurso
y, a continuación, selecciona Herramientas de administración.
2. Selecciona Application Insights y proporciona todos los datos necesarios.
Si ya has creado una cuenta de Application Insights en la receta anterior,
puedes omitir este paso.
[ 164 ]
Capítulo 6
Cómo hacerlo...
Sigue estos pasos:
2. Ve a Function Apps para seleccionar las aplicaciones para las que deseas
habilitar la supervisión y ve a Configuración de la aplicación.
3. Agrega una nueva clave con el nombre APPINSIGHTS_INSTRUMENTATIONKEY
y proporciona la clave de instrumentación que has copiado de la cuenta
de Application Insights, tal como se muestra a continuación, y haz clic en
Guardar para guardar los cambios:
[ 165 ]
Supervisar y solucionar problemas de los servicios de Azure sin servidor
[ 166 ]
Capítulo 6
Cómo funciona...
Hemos creado una cuenta de Application Insights. Una vez que integres la Clave
de instrumentación de Application Insights con Azure Functions, el runtime
se encargará de enviar los datos de telemetría asincrónicamente a tu cuenta de
Application Insights.
Y eso no es todo…
En Live Metrics Stream, también se pueden ver todas las instancias, junto con otros
datos, como el número de solicitudes por segundo administradas por las instancias.
Cómo hacerlo...
Sigue estos pasos:
[ 167 ]
Supervisar y solucionar problemas de los servicios de Azure sin servidor
[ 168 ]
Capítulo 6
Cómo funciona...
En el desencadenador de HTTP, hemos agregado una instrucción de registro que
muestra el valor del parámetro name proporcionado por el usuario. Hemos ejecutado
el desencadenador de HTTP varias veces. Transcurridos unos instantes, haz clic en
el botón Análisis del botón Application Insights, lo que abrirá la ventana Análisis,
donde puedes escribir consultas para ver los datos de telemetría emitidos por Azure
Functions. Todo esto se puede llevar a cabo sin necesidad de escribir ningún código
personalizado.
[ 169 ]
Supervisar y solucionar problemas de los servicios de Azure sin servidor
Vamos a usar Azure Functions que proporcionan datos a Application Insights con
una métrica derivada denominada solicitudes por hora:
Para este ejemplo, vamos a desarrollar una consulta mediante el lenguaje de consulta
de análisis para la métrica derivada solicitudes por hora. Puedes realizar
cambios en la consulta para generar otras métricas derivadas para tus requisitos,
como, por ejemplo, solicitudes por hora para mi campaña o una métrica similar.
[ 170 ]
Capítulo 6
Preparación
Sigue estos pasos de requisitos previos:
Cómo hacerlo...
Vamos a llevar a cabo los siguientes pasos para insertar detalles de telemetría
personalizados en Análisis de Application Insights.
[ 171 ]
Supervisar y solucionar problemas de los servicios de Azure sin servidor
3. También tenemos que crear una nueva clave de API. Como se muestra en
el paso anterior, haz clic en el botón Crear clave de API para generar la
nueva clave de API, como se muestra en la siguiente captura de pantalla.
Proporciona un nombre descriptivo, comprueba los datos de Leer telemetría
y haz clic en Generar clave:
[ 173 ]
Supervisar y solucionar problemas de los servicios de Azure sin servidor
[ 174 ]
Capítulo 6
[ 175 ]
Supervisar y solucionar problemas de los servicios de Azure sin servidor
5. Vamos a llevar a cabo una prueba rápida para comprobar si has configurado
los tres ajustes de la aplicación y la consulta correctamente. Ve a la pestaña
Integrar y cambia la frecuencia de ejecución a un minuto, como se muestra
en la captura de pantalla siguiente:
[ 176 ]
Capítulo 6
[ 177 ]
Supervisar y solucionar problemas de los servicios de Azure sin servidor
[ 178 ]
Capítulo 6
Cómo funciona...
Así es como funciona todo el proceso:
[ 179 ]
Supervisar y solucionar problemas de los servicios de Azure sin servidor
Azure Functions nos permite obtener todos los datos básicos mediante una plantilla
de función con código que es responsable de recuperar todos los valores necesarios
de Application Insights y el código de asociación que enmarca el cuerpo del
correo electrónico y envía el correo electrónico mediante SendGrid. En esta receta,
aprenderemos cómo hacerlo.
Preparación
Sigue estos pasos de requisitos previos:
[ 180 ]
Capítulo 6
Cómo hacerlo...
Sigue estos pasos:
[ 181 ]
Supervisar y solucionar problemas de los servicios de Azure sin servidor
7. Esta es una captura de pantalla del correo electrónico que recibí después
de hacer clic en el botón Ejecutar en la captura de pantalla anterior:
[ 182 ]
Capítulo 6
Cómo funciona...
La función de Azure usa la API de Application Insights para ejecutar todas las
consultas de Análisis de Application Insights, recupera todos los resultados, enmarca
el cuerpo del correo electrónico con todos los datos e invoca la API de SendGrid para
que envíe un correo electrónico a la cuenta de correo electrónico configurada.
Y eso no es todo…
Las plantillas de Azure proporcionan un código predeterminado que contiene
una serie de consultas que suelen resultar útiles para supervisar el estado de las
aplicaciones. Si tienes requisitos específicos para obtener alertas de notificación,
continúa y agrega nuevas consultas al método GetQueryString. Para incorporar los
nuevos valores, también tendrás que cambiar la clase DigestResult y la función
GetHtmlContentValue.
Consulta también
La receta Enviar una notificación por correo electrónico al administrador del sitio web
mediante el servicio SendGrid del capítulo 2, Trabajar con notificaciones mediante los
servicios SendGrid y Twilio.
[ 183 ]
Supervisar y solucionar problemas de los servicios de Azure sin servidor
Preparación
Sigue estos pasos de requisitos previos:
[ 184 ]
Capítulo 6
Debes utilizar tu cuenta de profesional para crear una cuenta de Power BI.
En el momento de redactar esta receta, no fue posible crear una cuenta de
Power BI con una dirección de correo electrónico personal, por ejemplo,
de Gmail, Yahoo, etc.
Asegúrate de seguir los pasos descritos en la sección Configurar claves de
acceso de la receta Insertar datos de telemetría personalizada en análisis
de Application Insights para configurar estas claves de acceso: Clave de
instrumentación de Application Insights, el Id. de la aplicación y la clave
de acceso de la API.
Cómo hacerlo...
Vamos a seguir estos pasos para integrar Application Insights y Power BI.
[ 185 ]
Supervisar y solucionar problemas de los servicios de Azure sin servidor
[ 186 ]
Capítulo 6
[ 187 ]
Supervisar y solucionar problemas de los servicios de Azure sin servidor
[ 188 ]
Capítulo 6
8. En el panel vacío, haz clic en el botón Agregar icono para crear un nuevo
icono. Al hacer clic en Agregar icono, se abrirá una ventana nueva donde
puedes seleccionar la fuente de datos de la que debe rellenarse el icono:
[ 189 ]
Supervisar y solucionar problemas de los servicios de Azure sin servidor
10. El siguiente paso es elegir el Tipo de visualización (en este caso es Tarjeta)
y seleccionar los campos de la fuente de datos, como se muestra en la
siguiente captura de pantalla:
[ 191 ]
Supervisar y solucionar problemas de los servicios de Azure sin servidor
[ 192 ]
Capítulo 6
AiAppKey);
httpClient.DefaultRequestHeaders.Add("x-ms-app",
"FunctionTemplate");
httpClient.DefaultRequestHeaders.Add("x-ms-client-
request-id", requestId);
string apiPath = $"{AppInsightsApi}/{AiAppId}/query?
clientId={requestId}×pan=P1D&query={query}";
using (var httpResponse = await
httpClient.GetAsync(apiPath))
{
httpResponse.EnsureSuccessStatusCode();
var resultJson = await
httpResponse.Content.ReadAsAsync<JToken>();
double result;
if (!double.TryParse(resultJson.SelectToken
("Tables[0].Rows[0][0]")?.ToString(), out
result))
{
throw new FormatException("Query must result
in a
single metric number. Try it on Analytics
before
scheduling.");
}
string postData = $"[{{ "requests": "{result}"
}}]";
log.Verbose($"[Verbose]: Sending data:
{postData}");
using (var response = await
httpClient.PostAsync(RealTimePushURL, new
ByteArrayContent(Encoding.UTF8.
GetBytes(postData))))
{
log.Verbose($"[Verbose]: Data sent with
response:
{response.StatusCode}");
}
}
}
}
[ 193 ]
Supervisar y solucionar problemas de los servicios de Azure sin servidor
Cómo funciona...
Hemos creado lo siguiente en este orden específico:
Y eso no es todo…
• Power BI nos permite crear datos en tiempo real en informes de varias
maneras. En esta receta, has aprendido a crear informes en tiempo real
mediante el conjunto de datos de transmisión. Las otras formas de crearlos
son con el conjunto de datos de inserción y con el conjunto de datos de
transmisión de PubNub. Puedes obtener más información sobre los tres
procedimientos en https://powerbi.microsoft.com/documentation/
powerbi-service-real-time-streaming/.
• Debes prestar especial cuidado cuando intentes obtener datos de estado de
la aplicación en tiempo real. La API de Application Insights tiene un límite
de velocidad. Echa un vistazo a https://dev.applicationinsights.
io/documentation/Authorization/Rate-limits para obtener más
información acerca de los límites de API.
[ 194 ]
Desarrollar aplicaciones
fiables sin servidor mediante
Durable Functions
En este capítulo, vas a aprender lo siguiente:
Introducción
Al trabajar en el desarrollo de aplicaciones modernas que deban estar alojadas en
el cloud, debes asegurarte de que las aplicaciones no tengan estado. El hecho de no
tener estado es un factor esencial para el desarrollo de aplicaciones compatibles con
el cloud. Por ejemplo, debes evitar la persistencia de cualquier dato en el recurso que
sea específico para cualquier instancia de máquina virtual (VM) aprovisionada para
cualquier servicio de Azure (por ejemplo, el servicio de aplicaciones, la API, etc.).
Si lo haces, no puedes aprovechar algunos de los servicios, como la funcionalidad
de escalado automático, ya que el aprovisionamiento de instancias es dinámico.
Si dependes de algún recurso específico de la máquina virtual, te encontrarás con
comportamientos inesperados.
[ 196 ]
Capítulo 7
Preparación
Crea una nueva aplicación de función si aún no está creada. Asegúrate de que la
versión del runtime sea ~2 en Configuración de la aplicación, como se muestra
en la siguiente captura de pantalla:
[ 197 ]
Desarrollar aplicaciones fiables sin servidor mediante Durable Functions
Cómo hacerlo...
Sigue estos pasos:
[ 198 ]
Capítulo 7
Y eso no es todo…
Actualmente, C# es el único lenguaje compatible para el desarrollo de Durable
Functions. La compatibilidad con otros lenguajes se encuentra en la fase de preview.
[ 199 ]
Desarrollar aplicaciones fiables sin servidor mediante Durable Functions
Preparación
Antes de seguir avanzando, vamos a seguir estos pasos:
Cómo hacerlo...
Para desarrollar Durable Functions, es necesario que creemos las tres funciones
siguientes:
[ 200 ]
Capítulo 7
using System.Net;
eventData);
return starter.CreateCheckStatusResponse(req,
instanceId);
}
[ 202 ]
Capítulo 7
"type": "orchestrationClient",
"direction": "in"
}
]
}
[ 203 ]
Desarrollar aplicaciones fiables sin servidor mediante Durable Functions
[ 204 ]
Capítulo 7
[ 205 ]
Desarrollar aplicaciones fiables sin servidor mediante Durable Functions
Cómo funciona...
Echemos un vistazo al funcionamiento de la receta:
Y eso no es todo…
Las Durable Functions dependen del marco de tareas durables. Puedes obtener más
información sobre el marco de tareas durables en https://github.com/Azure/
durabletask.
En esta receta, descubriremos algunas de las cosas esenciales que uno debe tener
en cuenta al trabajar con Durable Functions.
[ 206 ]
Capítulo 7
Preparación
Si aún no lo has hecho, descarga e instala:
Cómo hacerlo...
Sigue estos pasos:
[ 207 ]
Desarrollar aplicaciones fiables sin servidor mediante Durable Functions
[ 208 ]
Capítulo 7
También simularemos un caso de uso simple para comprender cómo las Durable
Functions se reparan automáticamente cuando la máquina virtual en la que están
alojadas se desactiva o se reinicia.
Preparación
Si aún no lo has hecho, instala:
[ 209 ]
Desarrollar aplicaciones fiables sin servidor mediante Durable Functions
Cómo hacerlo...
En esta receta, crearemos los siguientes desencadenadores de la función de Azure:
• Una función de orquestador, denominada GenerateBARCode
• Dos funciones de desencadenador de actividad, que son:
° GetAllCustomers: para hacerlo simple, esta función simplemente
devuelve la matriz de ID de clientes. En tus aplicaciones del mundo real,
dispondrías de lógica empresarial que decidiría qué clientes son aptos y,
en función de esa lógica, devolverías los ID de los clientes aptos.
° CreateBARCodeImagesPerCustomer: esta función no crea realmente
el código de barras; más bien, simplemente registra un mensaje en la
consola, ya que nuestro objetivo es comprender las características de
las Durable Functions. Para cada cliente, generaremos aleatoriamente
un número inferior a 50 000 y simplemente iteraremos a través de ese
número.
await Task.WhenAll(tasks);
int nTotalItems = tasks.Sum(item => item.Result);
return nTotalItems;
}
[ 211 ]
Desarrollar aplicaciones fiables sin servidor mediante Durable Functions
"direction": "in"
}
]
}
Cómo funciona...
Durable Functions nos permiten desarrollar una ejecución fiable de nuestras
funciones, lo que significa que, aunque las máquinas virtuales se bloqueen o se
reinicien mientras la función se esté ejecutando, vuelve automáticamente a su estado
anterior. Lo hace con la ayuda de lo que se denomina crear punto de comprobación
y reproducir, donde el historial de la ejecución se almacena en la tabla de
almacenamiento.
Y eso no es todo...
• Si obtienes la respuesta 404 No encontrado al ejecutar la dirección URL
statusQueryGetURi, no te preocupes. Llevará algún tiempo, pero finalmente
funcionará cuando hagas una solicitud más adelante.
• Para ver el historial de ejecución de tus Durable Functions, dirígete a la
tabla DurableFunctionsHubHistory, que se encuentra en la cuenta de
almacenamiento surgida al crear la aplicación de la función:
[ 214 ]
Importación masiva de datos
mediante Cosmos DB
y Durable Functions de Azure
En este capítulo, abordaremos las siguientes recetas:
Introducción
En este capítulo, vamos a desarrollar un miniproyecto con un caso de uso muy
común que resuelve el problema empresarial de compartir datos entre distintas
aplicaciones mediante Excel. Utilizaremos Durable Functions, una extensión de
Azure Functions que permite crear flujos de trabajo mediante la escritura de una
cantidad mínima de líneas de código.
[ 216 ]
Capítulo 8
Problema empresarial
En general, las organizaciones utilizan distintas aplicaciones hospedadas en
múltiples plataformas de diferentes centros de datos (en el cloud u on-premises).
A menudo, es necesario que los datos de una aplicación se envíen a otro sistema.
Normalmente, las hojas de cálculo de Excel (y en algunos casos, los archivos JSON
o XML) se utilizan para exportar datos desde una aplicación e importarlos en otra.
[ 217 ]
Importación masiva de datos mediante Cosmos DB y Durable Functions de Azure
Preparación
Establece los siguientes requisitos previos:
Cómo hacerlo...
Sigue estos pasos:
[ 219 ]
Importación masiva de datos mediante Cosmos DB y Durable Functions de Azure
Install-Package Microsoft.Extensions.Configuration
Install-Package Microsoft.Extensions.Configuration.FileExtensions
Install-Package Microsoft.Extensions.Configuration.Json
3. Añade los siguientes espacios de nombres en la parte superior del archivo
Program.cs:
using Microsoft.Extensions.Configuration;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Blob;
using System;
using System.IO;
using System.Threading.Tasks;
4. El siguiente paso es desarrollar el código en una función denominada
UploadBlob que carga el archivo de Excel en el contenedor de blobs que
hemos creado. Para simplificar la tarea, el siguiente código cargará el archivo
de Excel desde una ubicación codificada de forma rígida. Sin embargo, en
una aplicación típica en tiempo real, este archivo lo cargaría el usuario final
mediante una interfaz web. Copia el siguiente código y pégalo en el archivo
Program.cs de la aplicación ExcelImport.Client:
private static async Task UploadBlob()
{
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile(“appsettings.json”, optional: true, reloadOnChange:
true);
IConfigurationRoot configuration = builder.Build();
CloudStorageAccount cloudStorageAccount = CloudStorageAccount.
Parse(configuration.GetConnectionString(“StorageConnection”));
CloudBlobClient cloudBlobClient = cloudStorageAccount.
CreateCloudBlobClient();
CloudBlobContainer ExcelBlobContainer = cloudBlobClient.GetContain
erReference(“Excelimports”);
await ExcelBlobContainer.CreateIfNotExistsAsync();
CloudBlockBlob cloudBlockBlob = ExcelBlobContainer.GetBlockBlobRef
erence(“EmployeeInformation” + Guid.NewGuid().ToString());
await cloudBlockBlob.UploadFromFileAsync(@”C:\Users\
vmadmin\source\repos\POC\ImportExcelPOC\ImportExcelPOC\
EmployeeInformation.xlsx”);
}
[ 220 ]
Capítulo 8
[ 221 ]
Importación masiva de datos mediante Cosmos DB y Durable Functions de Azure
Cómo funciona...
En esta receta, hemos creado una aplicación de consola que utiliza ensamblados
de almacenamiento para cargar un blob (en nuestro caso, un archivo de Excel) en
el contenedor de blobs designado. Ten en cuenta que, cada vez que se ejecute la
aplicación, se creará un nuevo archivo en el contenedor de blobs. Con el fin de cargar
los archivos de Excel con nombres únicos, vamos a anexar un GUID.
[ 222 ]
Capítulo 8
Y eso no es todo…
Anota las convenciones de nomenclatura que se deben seguir al crear el contenedor
de blobs:
Preparación
Establece los siguientes requisitos previos:
[ 223 ]
Importación masiva de datos mediante Cosmos DB y Durable Functions de Azure
[ 224 ]
Capítulo 8
[ 225 ]
Importación masiva de datos mediante Cosmos DB y Durable Functions de Azure
[ 226 ]
Capítulo 8
Cómo hacerlo...
En esta receta, hemos creado una nueva aplicación de función basada en el runtime
de Azure Functions V2, que se basa en el marco de .NET Core y se puede ejecutar en
todas las plataformas compatibles con .NET Core (como Windows y Linux OSes).
También hemos creado un desencadenador de blob y lo hemos configurado para que
se ejecute cuando se añade un nuevo blob mediante la configuración de la cadena de
conexión. Además, hemos creado un archivo de configuración local.setting.json
para almacenar los valores de configuración que se utilizan en el desarrollo local.
Tras crear el desencadenador de blob, hemos ejecutado la aplicación ExcelImport.
Client para cargar un archivo y validar que se ejecuta el desencadenador de blob.
Y eso no es todo…
Todas las configuraciones se obtendrán del archivo local.settings.json al
ejecutar las funciones en el entorno local. Sin embargo, cuando implementes las
funciones en Azure, la referencia a los elementos de configuración (como la cadena
de conexión y la configuración de la aplicación) se obtendrá de la configuración de
la aplicación de la aplicación de función. Asegúrate de crear todos los elementos de
configuración de la aplicación de función después de implementar las funciones.
[ 227 ]
Importación masiva de datos mediante Cosmos DB y Durable Functions de Azure
Cómo hacerlo...
Sigue estos pasos:
[ 228 ]
Capítulo 8
[ 229 ]
Importación masiva de datos mediante Cosmos DB y Durable Functions de Azure
[ 230 ]
Capítulo 8
Cómo funciona...
Hemos comenzado la receta mediante la creación de la función de orquestación
y hemos aplicado cambios al desencadenador de blob ExcelImportBlobTrigger
mediante la adición de enlaces de salida OrchestratonClient para invocar la
función de orquestador durable.
Cuando se crea una nueva función de orquestación, esta crea funciones de actividad.
En las próximas recetas, las eliminaremos y crearemos nuevas funciones de actividad
según nuestros requisitos.
Y eso no es todo…
En esta receta, hemos utilizado DurableOrchestrationClient, que sabe cómo
iniciar y finalizar las orquestaciones duraderas.
[ 231 ]
Importación masiva de datos mediante Cosmos DB y Durable Functions de Azure
Preparación
En esta receta, crearemos el desencadenador de actividad denominado
función ReadExcel_AT que lee los datos del blob almacenado en la cuenta de
almacenamiento. Este desencadenador de actividad realiza los siguientes trabajos:
Se conecta al blob mediante una función, ReadBlob, de una clase denominada
StorageManager.
1. Lee los datos del Excel mediante un componente denominado EPPlus.
Puedes obtener más información sobre este tema en https://github.com/
JanKallman/EPPlus.
2. Devuelve los datos del archivo de Excel en forma de colección de objetos de
empleados.
A continuación, instala los siguientes paquetes NuGet en el proyecto ExcelImport.
DurableFunctions:
Install-Package WindowsAzure.Storage
Install-Package EPPlus
[ 232 ]
Capítulo 8
Cómo hacerlo...
Si nos planteamos que Durable Functions es un flujo de trabajo, la función de
desencadenador de actividad se puede considerar un paso del flujo de trabajo que
obtiene información de entrada opcional, realiza una funcionalidad y produce
información de salida opcional. Es uno de los conceptos fundamentales de Durable
Functions de Azure.
[ 233 ]
Importación masiva de datos mediante Cosmos DB y Durable Functions de Azure
[ 234 ]
Capítulo 8
employees.Add(new Employee()
{
EmpId = Convert.ToString(ExcelWorksheet.Cells[EmployeeIndex,
1].Value),
Name = Convert.ToString(ExcelWorksheet.Cells[EmployeeIndex,
2].Value),
Email = Convert.ToString(ExcelWorksheet.Cells[EmployeeIndex,
3].Value),
PhoneNumber = Convert.ToString(ExcelWorksheet.
Cells[EmployeeIndex, 4].Value)
});
}
}
return employees;
}
}
2. Vamos a crear otra clase denominada Employee y a copiar el siguiente
código:
public class Employee
{
public string EmpId { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public string PhoneNumber { get; set; }
}
[ 235 ]
Importación masiva de datos mediante Cosmos DB y Durable Functions de Azure
log.LogInformation(“Orchestration started”);
StorageManager storageManager = new StorageManager();
Stream stream = null; ;
log.LogInformation(“Reading the Blob Started”);
stream = await storageManager.ReadBlob(name);
log.LogInformation(“Reading the Blob has Completed”);
EPPLusExcelManager ePPLusExcelManager = new EPPLusExcelManager();
log.LogInformation(“Reading the Excel Data Started”);
List<Employee> employees = ePPLusExcelManager.
ReadExcelData(stream);
log.LogInformation(“Reading the Blob has Completed”);
return employees;
}
[ 236 ]
Capítulo 8
Y eso no es todo…
La función de orquestador recibe la información de entrada mediante el método
GetInput() de la clase DurableOrchestratorContext. Esta información de
entrada la pasa el desencadenador de blob mediante el método de función
StartNewAsync de la clase DurableOrchestrationClient.
[ 237 ]
Importación masiva de datos mediante Cosmos DB y Durable Functions de Azure
Además, con el fin de reducir los costes de cada servicio, se recomienda que la
capacidad sea inferior y se amplíe conforme sea necesario. La API de Cosmos DB
nos permite controlar el número de RU en función de nuestras necesidades. Como
necesitamos hacer una importación masiva, aumentaremos las RU antes de empezar
a importar los datos. Una vez finalizado el proceso de importación, podemos reducir
las RU al mínimo.
Preparación
Establece los siguientes requisitos previos:
[ 238 ]
Capítulo 8
[ 239 ]
Importación masiva de datos mediante Cosmos DB y Durable Functions de Azure
Cómo hacerlo...
Sigue estos pasos:
using System.Linq;
using Microsoft.Azure.Documents;
using Microsoft.Azure.Documents.Client;
[ 240 ]
Capítulo 8
3. Crea una nueva cadena de conexión para Cosmos DB, tal como se muestra
en la siguiente captura de pantalla. Puedes copiar la conexión desde la hoja
Claves de la cuenta de Cosmos DB:
[ 241 ]
Importación masiva de datos mediante Cosmos DB y Durable Functions de Azure
Y eso no es todo…
La capacidad de la colección de Cosmos DB se representa en forma de recurso
denominado oferta. En esta receta, hemos recuperado la oferta existente y la hemos
sustituido por una nueva. Puedes ver más información sobre el tema en https://
docs.microsoft.com/en-us/rest/api/cosmos-db/offers.
Cómo hacerlo...
Sigue estos pasos:
[ 242 ]
Capítulo 8
Y eso no es todo…
El equipo de Cosmos DB ha publicado una biblioteca denominada Cosmos DB Bulk
Executor. Puedes ver más información sobre el tema en https://docs.microsoft.
com/en-us/azure/cosmos-db/bulk-executor-overview.
[ 243 ]
Implementar prácticas
recomendadas para
Azure Functions
En este capítulo, aprenderás algunas de las prácticas recomendadas para trabajar con
Azure Functions, entre ellas:
[ 244 ]
Capítulo 9
En esta receta, vamos a simular las solicitudes mediante Postman, que enviará la
solicitud a la API web de back-end (HTTPTrigger), que puede crear todos los
mensajes de cola de una sola vez.
Preparación
Estos son los pasos necesarios:
Cómo hacerlo...
Sigue estos pasos:
[ 246 ]
Capítulo 9
[ 247 ]
Implementar prácticas recomendadas para Azure Functions
Cómo funciona...
Hemos creado una nueva función HTTP que tiene un parámetro del tipo
IAsyncCollector<string>, que se puede utilizar para almacenar varios mensajes
en un servicio de cola a la vez y de forma asincrónica. Este procedimiento para
almacenar varios elementos de forma asincrónica reducirá la carga en las instancias.
Por último, hemos probado la invocación del desencadenador de HTTP desde Azure
Portal y hemos visto asimismo que los mensajes de la cola se ha podido agregar
mediante el explorador de Azure Storage.
Y eso no es todo…
También puedes utilizar la interfaz ICollector, en lugar de IAsyncCollector,
si deseas almacenar varios mensajes de forma asincrónica.
En esta receta, aprenderás cómo nos ayuda Azure Functions a controlar este tipo de
problemas con un código mínimo.
Preparación
Estos son los pasos necesarios:
1. Crear una cuenta de almacenamiento mediante Azure Portal si aún
no lo has hecho
2. Instalar el explorador de Azure Storage desde http://storageexplorer.
com/ si aún no lo has instalado
Cómo hacerlo...
En esta receta, haremos lo siguiente:
• Desarrollar una aplicación de consola con C# que se conecte a la cuenta
de almacenamiento y cree mensajes de cola en la cola denominada
myqueuemessages
• Crear un desencadenador de cola de la Azure Function denominada
ProcessData que se active cada vez que se agregue un mensaje nuevo a la
cola denominada myqueuemessages
[ 250 ]
Capítulo 9
[ 251 ]
Implementar prácticas recomendadas para Azure Functions
Cómo funciona...
Hemos creado una aplicación de consola que crea mensajes en Azure Queue Storage
y también hemos desarrollado un desencadenador de cola que es capaz de leer los
mensajes de la cola. Como parte de la simulación de un error imprevisto, hemos
hecho que se genere un error si el valor del contenido del mensaje de cola es mayor
que 50.
Y eso no es todo…
Antes de insertar un mensaje de cola en la cola de daños, el runtime de Azure
Function intenta seleccionar el mensaje y procesarlo cinco veces. Puedes obtener
información sobre cómo funciona este proceso si agregas un nuevo parámetro
dequecount del tipo int al método Run y registras su valor.
[ 252 ]
Capítulo 9
Preparación
Sigue estos pasos:
1. Crea un espacio de nombres de Event Hubs. Para ello, ve al Internet de las
cosas y selecciona Event Hubs.
2. Una vez creado el espacio de nombres de Event Hubs, ve la pestaña
Información general y haz clic en el icono Centro de eventos para crear un
Centro de eventos nuevo.
3. De forma predeterminada, se creará un Grupo de consumidores
denominado $Default, que es el que vamos a utilizar en esta receta.
Cómo hacerlo...
En esta receta, vamos a seguir estos pasos:
• Crear un desencadenador de centro de eventos de la Azure Function
• Desarrollar una aplicación de consola que simule los datos del Internet de
las cosas (IoT)
Crear un desencadenador de centro de eventos
de la Azure Function
Sigue estos pasos:
1. Para crear una nueva función de Azure, selecciona Desencadenador de
centro de eventos en la lista de plantillas.
2. Una vez seleccionada la plantilla, es posible que tengas que instalar las
extensiones. A continuación, deberás proporcionar el nombre del centro
de eventos, capturemessage. Si aún no has configurado ninguna conexión,
haz clic en el botón Nueva.
3. Al hacer clic en el botón Nueva, se abrirá una ventana emergente de
Conexión en la que puedes seleccionar el Centro de eventos y otros datos.
Selecciona los datos solicitados y haz clic en el botón Seleccionar, como se
muestra en la siguiente captura de pantalla:
[ 253 ]
Implementar prácticas recomendadas para Azure Functions
[ 254 ]
Capítulo 9
namespace EventHubApp
{
class EventHubHelper
{
static EventHubClient eventHubClient = null;
public static async Task GenerateEventHubMessages()
{
eventHubClient =
EventHubClient.CreateFromConnectionString
(conBuilder.ToString());
string strMessage = string.Empty;
for (int nEventIndex = 0; nEventIndex <= 100;
nEventIndex++)
{
strMessage = Convert.ToString(nEventIndex);
await eventHubClient.SendAsync(new EventData
(Encoding.UTF8.GetBytes(strMessage)));
Console.WriteLine(strMessage);
}
await eventHubClient.CloseAsync();
}
}
}
6. En tu función principal, coloca el siguiente código, que invoca el método
para enviar el mensaje:
namespace EventHubApp
{
[ 255 ]
Implementar prácticas recomendadas para Azure Functions
class Program
{
static void Main(string[] args)
{
EventHubHelper.GenerateEventHubMessages().Wait();
}
}
}
7. Ahora ejecuta la aplicación pulsando Ctrl + F5. Debería aparecer algo similar
a lo que se muestra aquí:
[ 256 ]
Capítulo 9
Solo podrás obtener todas las ventajas de la arquitectura sin servidor si creas la
Function App mediante el plan de consumo. Sin embargo, uno de los problemas del
que han informado los desarrolladores en cuanto al uso del plan de consumo es lo
que se conoce como arranque en frío, que consiste en poner en marcha una función
de Azure para atender las solicitudes sin que se hayan recibido solicitudes desde
hace tiempo. Puedes obtener más información sobre este tema en
https://blogs.msdn.microsoft.com/appserviceteam/2018/02/07/
understanding-serverless-cold-start/.
Preparación
Para completar esta receta, debemos tener una aplicación de función con lo siguiente:
[ 257 ]
Implementar prácticas recomendadas para Azure Functions
Cómo hacerlo...
En esta receta, vamos a crear un desencadenador de temporizador que simulará
el tráfico al desencadenador de HTTP, lo que hará que la Function App esté
permanentemente activa y las instancias sin servidor estén siempre en
estado aprovisionado.
[ 258 ]
Capítulo 9
Y eso no es todo…
Si experimentas un poco con Azure Functions, podrás observar que los tiempos de
arranque en frío para Azure Functions que tienen C# como lenguaje son de apenas
unos segundos. Sin embargo, si trabajas con Azure Functions que utilizan JavaScript
(como Node.js) como lenguaje, el tiempo de arranque en frío será mayor, dado que
el runtime tiene que descargar todos los paquetes de NPM que son dependencias
de la aplicación. Para estos casos hay una función, denominada Ejecutar desde
el paquete, que resulta muy útil. Vamos a aprender cómo implementar esto en el
próximo capítulo.
Consulta también
Consulta la receta Implementar Azure Functions mediante Ejecutar desde el paquete del
capítulo 10, Configurar aplicaciones sin servidor en el entorno de producción.
Preparación
Supongo que ya sabes cómo crear una función de desencadenador de HTTP.
Puedes descargar la herramienta Postman de https://www.getpostman.com/.
La herramienta Postman se utiliza para enviar solicitudes HTTP. También puedes
utilizar cualquier herramienta o aplicación que permita enviar solicitudes
y encabezados HTTP.
[ 259 ]
Implementar prácticas recomendadas para Azure Functions
Cómo hacerlo...
Sigue estos pasos:
[ 260 ]
Capítulo 9
Cómo funciona...
Al realizar una solicitud a través de Postman o de cualquier otra herramienta
o aplicación que pueda enviar solicitudes HTTP, la aplicación web de Azure App
Service subyacente recibirá la solicitud (ten en cuenta que Azure Functions se basa
en App Services), que primero comprueba si está presente el código del nombre de
encabezado en la colección de cadenas de consulta o en el cuerpo de la solicitud.
Si lo encuentra, valida el valor de la cadena de consulta de código con las claves de
función. Si es válido, autoriza la solicitud y permite que el runtime la procese. De lo
contrario, se genera un error con el mensaje 401: No autorizado.
Y eso no es todo…
Ten en cuenta que la clave de seguridad (parámetro de cadena de consulta con
el nombre code) del ejemplo anterior se usa solo con fines de demostración. En
escenarios de producción, en lugar de pasar la clave como un parámetro de cadena
de consulta (el parámetro code), debes agregar la clave x-functions-key como
encabezado HTTP, como se muestra en la siguiente captura de pantalla:
[ 261 ]
Implementar prácticas recomendadas para Azure Functions
Cómo hacerlo...
Azure es compatible con las siguientes claves, que se pueden utilizar para controlar
el acceso a Azure Functions:
Del mismo modo, puedes crear diferentes claves para cualquier otra aplicación
(por ejemplo, una aplicación de IoT) en función de tus requisitos.
[ 262 ]
Capítulo 9
Al contar con diferentes claves para la misma función podrás tener control sobre
los permisos de acceso de diferentes aplicaciones para el uso de las funciones. Por
ejemplo, si deseas revocar los permisos solo a una aplicación, y no a todas ellas, tan
solo tendrás que eliminar (o revocar) esa clave. De esa manera, no afectará a otras
aplicaciones que estén utilizando la misma función.
[ 263 ]
Implementar prácticas recomendadas para Azure Functions
Al igual que con las claves de función, también puedes crear varias
claves de host si hay varias aplicaciones que utilizan las aplicaciones
de función. Puedes controlar el acceso de diferentes aplicaciones a cada
una de las aplicaciones de función con diferentes teclas.
Puedes crear varias claves de host siguiendo los mismos pasos que para
crear las claves de función normales.
[ 264 ]
Capítulo 9
Y eso no es todo…
Si crees que la clave ha sido atacada, puedes volver a generarla en cualquier
momento a través del botón Renovar. Ten en cuenta que cuando se renueva una
clave, todas las aplicaciones que acceden a la función ya no funcionarán y se
generará un error con el código de estado 401: No autorizado.
Puedes eliminar o revocar la clave si ya no se utiliza en ninguna de las aplicaciones.
A continuación, se muestra una tabla con más información sobre las claves:
[ 265 ]
Implementar prácticas recomendadas para Azure Functions
Gracias a Azure App Service, desde el que se hereda la función EasyAuth, podemos
hacer lo que sea necesario sin escribir una sola línea de código.
Preparación
En esta receta, para simplificar el procedimiento, vamos a utilizar el AD
predeterminado que se crea durante la creación de una cuenta de Azure. Sin
embargo, en los escenarios de producción en tiempo real, ya tendrías un AD
existente que tendría que integrarse. Es recomendable leer este artículo:
https://docs.microsoft.com/azure/active-directory-b2c/active-
directory-b2c-tutorials-web-app.
Cómo hacerlo...
En esta receta, haremos lo siguiente:
[ 266 ]
Capítulo 9
Eso es todo. Sin escribir una sola línea de código, hemos terminado con la
configuración de una instancia de Azure AD que funciona como capa de seguridad
y permite el acceso solo a los usuarios autenticados. Es decir, hemos habilitado
OAuth para nuestra Function App de back-end con Azure AD. Vamos a probarlo
rápidamente accediendo a cualquiera de los desencadenadores de HTTP que tienes
en la Function App. Para realizar esta prueba he utilizado Postman. Como es de
esperar, aparecerá un mensaje de error en el que se te pedirá que inicies sesión.
Con las configuraciones actuales, ninguna de las aplicaciones cliente externas podrá
acceder a nuestra API de back-end. Para otorgar el acceso necesario, tienes que
seguir estos pasos:
Registra todas las aplicaciones cliente en Azure AD (para nuestro ejemplo, vamos
a realizar un registro para la aplicación Postman).
1. Abre Azure AD a través del botón Azure Active Directory, tal como se
muestra. Si no aparece en la lista de favoritos, lo puedes buscar en la hoja
Todos los servicios, que también aparece resaltada en la siguiente
captura de pantalla:
[ 267 ]
Implementar prácticas recomendadas para Azure Functions
[ 268 ]
Capítulo 9
[ 269 ]
Implementar prácticas recomendadas para Azure Functions
[ 270 ]
Capítulo 9
2. Una vez que dispongas de toda esa información, debes pasar todos los
parámetros y realizar una llamada a un inquilino de Azure AD, que devuelve
el token de portador de la siguiente manera:
[ 271 ]
Implementar prácticas recomendadas para Azure Functions
En esta receta, aprenderemos cómo restringir a los clientes el acceso de API solo una
vez por minuto para una dirección IP determinada. A continuación, se proporcionan
los pasos de alto nivel que seguiremos:
[ 272 ]
Capítulo 9
Preparación
Para empezar, necesitamos crear un servicio Azure API Management mediante los
pasos siguientes:
[ 273 ]
Implementar prácticas recomendadas para Azure Functions
Cómo hacerlo...
Con el fin de aprovechar las capacidades API Management, necesitamos integrar
los puntos de conexión de servicio (en nuestro caso, los desencadenadores de HTTP
que hemos creado) con el servicio API Management. En esta sección indicaremos los
pasos necesarios para la integración. Vamos a comenzar integrando los dos.
[ 274 ]
Capítulo 9
[ 275 ]
Implementar prácticas recomendadas para Azure Functions
[ 276 ]
Capítulo 9
[ 277 ]
Implementar prácticas recomendadas para Azure Functions
[ 278 ]
Capítulo 9
[ 279 ]
Implementar prácticas recomendadas para Azure Functions
Cómo funciona...
En esta receta, hemos creado una instancia de Azure API Management y hemos
integrado una Azure Function App para aprovechar las funciones de API
Management. Una vez integradas, hemos creado una política de entrada que
restringe a los clientes a realizar una sola llamada por minuto desde una dirección IP
determinada. A continuación, se muestra un diagrama de alto nivel que representa
todo el proceso:
[ 280 ]
Capítulo 9
Preparación
Esta receta nos indica cómo crear Azure Functions (con el runtime v1) y la base de
datos SQL en el mismo grupo de recursos. Si no las has creado, créalas primero
y vuelve luego a esta receta para continuar. Estos son los pasos que vamos a seguir
en esta receta:
1. Crear una aplicación de función con Visual Studio 2017 con el runtime v1
2. Crear un SQL Server lógico y una SQL Database
3. Habilitar Managed Service Identity desde el portal
4. Recuperar información de Managed Service Identity mediante
la CLI de Azure
5. Permitir el acceso de SQL Server a la nueva Managed Service Identity
6. Ejecutar el desencadenador de HTTP y probarlo
[ 281 ]
Implementar prácticas recomendadas para Azure Functions
Cómo hacerlo...
En esta receta, vamos a seguir estos pasos:
1. Crear una aplicación de función con Visual Studio 2017 con el runtime v1
2. Crear un SQL Server lógico y una SQL Database
3. Habilitar la Managed Service Identity
1. Crea una aplicación de función nueva con el runtime de Azure Functions v1.
2. Una vez creado el desencadenador de HTTP, reemplaza la función por el
código siguiente:
public static class HttpTriggerWithMSI
{
[FunctionName("HttpTriggerWithMSI")]
public static async Task<HttpResponseMessage> Run([HttpTr
igger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]
HttpRequestMessage req, TraceWriter log)
{
log.Info("C# HTTP trigger function processed a
request.");
con = new
SqlConnection("Server=tcp:dbserver.database.
windows.net,1433;Initial Catalog=database;Persist Security Info=Fa
[ 282 ]
Capítulo 9
lse;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertifi
cate=False;Connection Timeout=30;");
SqlCommand cmd = new SqlCommand(query, con);
con.AccessToken = (new
AzureServiceTokenProvider()).GetAccessTokenAsync("https://
database.windows.net/").Result;
cmd.Parameters.Add("@firstname", SqlDbType.
VarChar,
50).Value = firstname;
cmd.Parameters.Add("@lastname", SqlDbType.VarChar,
50)
.Value = lastname;
cmd.Parameters.Add("@email", SqlDbType.VarChar,
50)
.Value = email;
cmd.Parameters.Add("@devicelist", SqlDbType.
VarChar)
.Value = devicelist;
con.Open();
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (con != null)
{
con.Close();
}
}
return req.CreateResponse(HttpStatusCode.OK, "Hello,
Successfully inserted the data");
}
El código anterior es el código que copié del capítulo 3, Integración perfecta de Azure
Functions con los Servicios de Azure, con los cambios siguientes, pero la cadena de
conexión no contiene el Id. de usuario ni la contraseña.
[ 283 ]
Implementar prácticas recomendadas para Azure Functions
[ 284 ]
Capítulo 9
[ 285 ]
Implementar prácticas recomendadas para Azure Functions
[ 286 ]
Capítulo 9
[ 287 ]
Implementar prácticas recomendadas para Azure Functions
Y eso no es todo…
Asegúrate de que la clase tiene todos los espacios de nombres siguientes:
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Azure.WebJobs.Host;
using System.Data.SqlClient;
using System.Data;
using System;
using Microsoft.Azure.Services.AppAuthentication;
Consulta también
Consulta la receta Interacciones de Azure SQL Database mediante Azure Functions del
capítulo 3, Integración perfecta de Azure Functions con los Servicios de Azure.
[ 288 ]
Capítulo 9
Cómo hacerlo...
Sigue estos pasos:
5. A continuación, crea una nueva carpeta bin. Para ello, haz clic con el botón
derecho en el área vacía debajo de los archivos ubicados en WWWROOT.
6. Después de hacer clic en el elemento Nueva carpeta de la pantalla resultante,
aparecerá un cuadro de texto nuevo en el que debes especificar el
nombre "bin".
7. A continuación, haz clic con el botón derecho en la carpeta bin y selecciona la
opción Cargar archivos para cargar el archivo .dll que hemos creado en
Visual Studio.
8. Esto es lo que se muestra después de cargar el archivo .dll en la carpeta bin:
[ 290 ]
Capítulo 9
13. Repite los mismos pasos para agregar la referencia y el espacio de nombres
de la biblioteca de utilidades, también en la segunda Azure Function,
ReusableMethodCaller2. Si has realizado los cambios correctamente,
debería mostrarse algo muy parecido a lo siguiente:
Cómo funciona...
Hemos creado un archivo .dll que contiene el código reutilizable que se puede
utilizar en cualquiera de las Azure Functions que requieren la funcionalidad
disponible a través del archivo .dll.
Con el archivo .dll ya listo, hemos creado una carpeta bin en la Function App
y hemos agregado el archivo .dll a la carpeta bin.
[ 291 ]
Implementar prácticas recomendadas para Azure Functions
Y eso no es todo…
Si deseas utilizar el código compartido únicamente en una función, debes
agregar la carpeta bin junto con el archivo .dll en la carpeta de la Azure
Function correspondiente.
En esta receta, vamos a aprender a obtener los datos del usuario de la cola mediante
objetos fuertemente tipados.
Preparación
Antes de seguir avanzando, vamos a seguir estos pasos:
[ 292 ]
Capítulo 9
Cómo hacerlo...
Sigue estos pasos:
1. Utiliza el explorador de Azure Storage para crear una cola denominada
registeruserqueue en la cuenta de Azure Storage denominada
azurefunctionscookbook. Se presupone que todas las demás aplicaciones
estarían creando mensajes en la cola registeruserqueue.
2. Ve a Azure Functions y crea una Azure Function nueva mediante el
desencadenador de Azure Queue Storage y, a continuación, selecciona la cola
que hemos creado.
3. Es posible que se te pida que instales las extensiones de Azure Storage si
no están ya instaladas. Una vez instaladas las extensiones, proporciona los
datos de la cola y haz clic en el botón Crear, como se muestra en la siguiente
captura de pantalla:
[ 293 ]
Implementar prácticas recomendadas para Azure Functions
[ 294 ]
Capítulo 9
6. Haz clic en Aceptar para crear el mensaje de cola, vuelve a la Azure Function
y revisa los registros, como se muestra en la siguiente captura de pantalla:
Cómo funciona...
Hemos desarrollado una nueva función de cola que se activa cuando se agrega un
nuevo mensaje a la cola. Hemos creado un nuevo mensaje de la cola con todos los
datos necesarios para crear el usuario. Puedes seguir reutilizando el código de la
Azure Function para pasar el objeto de usuario (en este caso, myQueueItem) a la clase
de capa de base de datos, que se encarga de insertar los datos en una base de datos
o en cualquier otro medio persistente.
Y eso no es todo…
En esta receta, el tipo del parámetro de mensaje de cola aceptado por el método Run
ha sido User. El runtime de Azure Functions se encargará de deserializar el mensaje
JSON disponible en la cola para el tipo personalizado; en nuestro caso, es "user".
[ 295 ]
Configurar aplicaciones sin
servidor en el entorno de
producción
En este capítulo, abordaremos las siguientes recetas:
Introducción
Hemos estado hablando sobre las diferentes características de Azure Functions
que ayudan a los desarrolladores a compilar rápidamente aplicaciones de back-end.
El enfoque de este capítulo se centra en las configuraciones que se deben realizar en
un entorno que no sea de desarrollo (como por ejemplo, almacenamiento provisional,
UAT y producción).
[ 296 ]
Capítulo 10
Como ya sabrás, cada aplicación de función puede tener múltiples funciones alojadas
en ella. Todo el contenido relacionado con estas funciones se ubica en la carpeta
D:\home\site\wwwroot:
En esta receta, veremos una técnica nueva, denominada Ejecutar desde el paquete
(anteriormente denominada Ejecutar desde ZIP) para implementar Azure Function
como un paquete.
[ 297 ]
Configurar aplicaciones sin servidor en el entorno de producción
Preparación
Necesitamos lo siguiente para completar esta receta:
Cómo hacerlo...
Sigue estos pasos:
[ 299 ]
Configurar aplicaciones sin servidor en el entorno de producción
Cómo funciona...
Si el runtime de Azure Function encuentra una configuración de la aplicación con
el nombre WEBSITE_RUN_FROM_PACKAGE, comprende que debe buscar los paquetes
en la cuenta de almacenamiento. Entonces, sobre la marcha, el runtime descarga los
archivos y los usa para iniciar la aplicación.
Y eso no es todo…
Puedes obtener más información sobre esta técnica y sus ventajas en https://
github.com/Azure/app-service-announcements/issues/84.
Preparación
Antes de comenzar a crear las plantillas de ARM, debemos comprender los otros
servicios de Azure de los que depende Azure Function. Los siguientes servicios
se crean automáticamente cuando creas una aplicación de función:
[ 300 ]
Capítulo 10
Cómo hacerlo...
A estas alturas, ya sabes que al crear Azure Functions debemos asegurarnos
de que también tenemos un plan de App Service y una cuenta de almacenamiento.
Empecemos con la creación de la plantilla de ARM usando Visual Studio:
[ 301 ]
Configurar aplicaciones sin servidor en el entorno de producción
[ 302 ]
Capítulo 10
[ 303 ]
Configurar aplicaciones sin servidor en el entorno de producción
Y eso no es todo…
Estas son algunas de las ventajas de aprovisionar recursos de Azure utilizando
plantillas de ARM:
[ 304 ]
Capítulo 10
Preparación
Crear un dominio con cualquiera de los registradores de dominios. También puedes
comprar un dominio en el portal mediante el botón Comprar dominio, que está
disponible en la hoja Dominios personalizados:
Cuando el dominio esté listo, crea los siguientes registros DNS utilizando
un registrador de dominios:
• Un registro
• Registro CName
Cómo hacerlo...
Sigue estos pasos:
[ 305 ]
Configurar aplicaciones sin servidor en el entorno de producción
[ 306 ]
Capítulo 10
[ 307 ]
Configurar aplicaciones sin servidor en el entorno de producción
[ 308 ]
Capítulo 10
Cualquiera que sea el uso del valor de configuración, debes tener un lugar para
almacenarlos que sea accesible para tu aplicación.
Preparación
Si no se ha creado, crea una Azure Function con el runtime de la función V2.
Utilizaré la aplicación de función que creamos en el capítulo 4, Comprender la
experiencia de desarrollador integrada de Visual Studio Tools.
Cómo hacerlo...
En esta receta, vamos a ver algunas maneras de acceder a los valores
de configuración.
[ 311 ]
Configurar aplicaciones sin servidor en el entorno de producción
1. Abre Visual Studio y realiza los cambios en el método Run para agregar
un nuevo parámetro para configurar QueueTrigger:
[ 312 ]
Capítulo 10
Preparación
Crea una función y uno o varios desencadenadores de HTTP. Para simplificarlo,
he creado una aplicación de función y un desencadenador de HTTP, que solo acepta
métodos Get.
Ten en cuenta que en el momento de la escritura, la
función de definición de la API solo es compatible con
el runtime de Azure Function V1.0 y aún está en modo
preview. Todavía no funciona con la V2.
Cómo hacerlo...
Sigue estos pasos:
[ 313 ]
Configurar aplicaciones sin servidor en el entorno de producción
[ 314 ]
Capítulo 10
[ 315 ]
Configurar aplicaciones sin servidor en el entorno de producción
8. También nos permite realizar algunas pruebas. Haz clic en el botón Probar
esta operación que se muestra en la captura de pantalla anterior. Se abre una
ventana donde puedes proporcionar entradas:
[ 316 ]
Capítulo 10
Preparación
En esta receta, implementaremos la siguiente arquitectura:
[ 317 ]
Configurar aplicaciones sin servidor en el entorno de producción
Cómo hacerlo...
En esta receta, seguiremos estos pasos:
[ 318 ]
Capítulo 10
Crear microservicios
Sigue estos pasos:
Nombre del
Mensaje de salida
desencadenador de HTTP
Hola, <<Nombre>>: bienvenido/a al
Men-HttpTrigger
microservicio Hombres
Hola, <<Nombre>>: bienvenido/a al
Women-HttpTrigger
microservicio Mujeres
Hola, <<Nombre>>: bienvenido/a al
Kids-HttpTrigger
microservicio Niños
[ 319 ]
Configurar aplicaciones sin servidor en el entorno de producción
[ 320 ]
Capítulo 10
4. Después de crear los tres proxies, la lista deberá tener el aspecto siguiente:
• https://azurefunctioncookbook-gateway.azurewebsites.net/Men
• https://azurefunctioncookbook-gateway.azurewebsites.net/Women
• https://azurefunctioncookbook-gateway.azurewebsites.net/Kids
[ 321 ]
Configurar aplicaciones sin servidor en el entorno de producción
• Hombres:
• Mujeres:
• Niños:
Observa las direcciones URL de las tres capturas de pantalla. Verás que parece
que se sirven desde una sola aplicación con diferentes rutas. Sin embargo, son
tres microservicios diferentes que se pueden administrar individualmente.
Y eso no es todo…
Todos los microservicios que hemos creado en esta receta son anónimos, lo que
significa que son de acceso público para todas las personas. Para garantizar su
seguridad, debes seguir cualquiera de los enfoques recomendados en el capítulo 9,
Implementar prácticas recomendadas para Azure Functions.
[ 322 ]
Capítulo 10
Consulta también
• La receta Controlar el acceso a Azure Functions mediante claves de función
del capítulo 9, Implementar prácticas recomendadas para Azure Functions
• La receta Proteger Azure Functions utilizando Azure AD del capítulo 9,
Implementar prácticas recomendadas para Azure Functions
• La receta Configurar la limitación de Azure Functions utilizando API Management
incluida en el capítulo 9, Implementar prácticas recomendadas para Azure
Functions
En el mundo PaaS de Azure, con Azure App Services, puedes tener los archivos Web.
Config, que funcionan como solían hacerlo en el mundo on-premise tradicional.
Sin embargo, Azure App Service nos proporciona una característica adicional
en términos de configuración de la aplicación, donde puedes configurar estas
opciones (ya sea manualmente o mediante plantillas de ARM), que se almacenan
en un formato cifrado. Pero se pueden mostrar como texto normal en el portal si
dispones de acceso.
[ 323 ]
Configurar aplicaciones sin servidor en el entorno de producción
Preparación
Sigue estos pasos:
[ 324 ]
Capítulo 10
Cómo hacerlo...
Sigue estos pasos:
[ 325 ]
Configurar aplicaciones sin servidor en el entorno de producción
[ 326 ]
Capítulo 10
[ 327 ]
Configurar aplicaciones sin servidor en el entorno de producción
[ 328 ]
Implementar la integración
continua mediante Azure
DevOps
En este capítulo, vas a aprender lo siguiente:
Introducción
Como profesional de software, es posible que ya conozcas las distintas metodologías
de desarrollo de software que se utilizan. Con independencia de la metodología,
habrá distintos entornos (por ejemplo, desarrollo, ensayo y producción), en los que
el ciclo de vida de la aplicación debe preceder a estas fases críticas relacionadas con
el desarrollo:
[ 330 ]
Capítulo 11
Ten en cuenta que, para facilitar la tarea, las fases iniciales, como la
recopilación de requisitos, la planificación, el diseño y la arquitectura, se
han excluido. De esta forma, se da mayor énfasis a las fases relevantes
para este capítulo.
Para cada cambio que debas aplicar al software, es necesario compilar e implementar
la aplicación en distintos entornos. Puede darse el caso de que distintos equipos
sean responsables de publicar las compilaciones en entornos diferentes. Dado
que intervienen distintos entornos y equipos, el cálculo de la cantidad de tiempo
necesario para ejecutar las compilaciones e implementarlas en entornos diferentes
dependería más de los procesos que utilicen los equipos.
Requisitos previos
Si no lo has hecho previamente, crea lo siguiente:
[ 331 ]
Implementar la integración continua mediante Azure DevOps
[ 332 ]
Capítulo 11
Preparación
Establece los siguientes requisitos previos:
[ 333 ]
Implementar la integración continua mediante Azure DevOps
Cómo hacerlo...
Sigue estos pasos:
2. En el próximo paso, haz clic en el enlace de uso del diseñador visual, tal
como se muestra en la siguiente captura de pantalla:
[ 334 ]
Capítulo 11
[ 335 ]
Implementar la integración continua mediante Azure DevOps
[ 336 ]
Capítulo 11
8. Cuando revises todos los valores de todos los campos, haz clic en Guardar,
tal como se muestra en la siguiente captura de pantalla. Vuelve a hacer clic
en Guardar en el cuadro emergente Guardar definición de compilación:
[ 337 ]
Implementar la integración continua mediante Azure DevOps
Cómo funciona...
La definición de compilación es un esquema de las tareas necesarias para
compilar una aplicación de software. En esta receta, hemos utilizado una plantilla
predeterminada para crear la definición de compilación. También podemos elegir
una plantilla en blanco y crear la definición mediante la selección de las tareas
disponibles en Azure DevOps.
Obtén más información sobre los distintos tipos de variables de la pestaña Variables
que se muestran aquí:
[ 338 ]
Capítulo 11
Y eso no es todo…
• Azure DevOps proporciona muchas tareas. Para elegir una nueva tarea para
la plantilla, haz clic en el botón Agregar tarea (+), tal como se muestra en la
siguiente captura de pantalla:
Preparación
Antes de comenzar, asegúrate de lo siguiente:
[ 339 ]
Implementar la integración continua mediante Azure DevOps
Cómo hacerlo...
Sigue estos pasos:
[ 340 ]
Capítulo 11
[ 341 ]
Implementar la integración continua mediante Azure DevOps
[ 342 ]
Capítulo 11
Cómo hacerlo...
Sigue estos pasos:
[ 343 ]
Implementar la integración continua mediante Azure DevOps
[ 344 ]
Capítulo 11
Cómo funciona...
A continuación, se indican los pasos que hemos seguido en esta receta:
Y eso no es todo…
Si quieres que los desarrolladores solo inserten el código después de una
compilación correcta, habilita la inserción en el repositorio validada. Para ello, edita
la definición de compilación, dirígete a la pestaña Desencadenadores y a la opción
Habilitar la inserción en el repositorio validada, tal como se muestra en la siguiente
captura de pantalla:
[ 345 ]
Implementar la integración continua mediante Azure DevOps
[ 346 ]
Capítulo 11
Cómo hacerlo
Sigue estos pasos:
[ 347 ]
Implementar la integración continua mediante Azure DevOps
°° Haz caso omiso de todos los archivos .dll de la carpeta obj, ya que
nuestro objetivo es trabajar solo en los archivos .dll ubicados en la
carpeta release.
4. Eso es todo. Ahora vamos a poner la compilación en cola. Para ello, haremos
clic en el botón Cola después de guardar los cambios. Transcurridos unos
minutos, la canalización de compilación se superará sin advertencias, tal
como se muestra en la siguiente captura de pantalla:
[ 348 ]
Capítulo 11
Y eso no es todo…
Si has respetado las convenciones de nomenclatura que se indican en las
instrucciones, no tendrás problemas con la receta. Sin embargo, si has utilizado un
nombre diferente para el proyecto unitario y no has incluido la palabra test en
el nombre del proyecto (el mismo nombre del archivo .dll generado), cambia el
formato en el siguiente ajuste:
**\$(BuildConfiguration)\**\*whateverwordyouhaveinthenameofthedllfi
le*.dll
[ 349 ]
Implementar la integración continua mediante Azure DevOps
Preparación
He utilizado el nuevo editor de definiciones de versión para visualizar las
canalizaciones de implementación. El editor de definiciones de versión aún está en
estado preview. Al leer este documento, si sigue en versión preview, actívalo. Para
ello, haz clic en la imagen de perfil y, a continuación, en el enlace Características
de versión preview, tal como se muestra en la siguiente captura de pantalla:
[ 350 ]
Capítulo 11
Cómo hacerlo...
Sigue estos pasos:
[ 351 ]
Implementar la integración continua mediante Azure DevOps
[ 352 ]
Capítulo 11
[ 354 ]
Capítulo 11
9. Haz clic en el botón Guardar para guardar los cambios. Ahora vamos
a utilizar la definición de versión para intentar crear una nueva versión
mediante el clic en Crear versión, tal como se muestra en la siguiente captura
de pantalla:
[ 355 ]
Implementar la integración continua mediante Azure DevOps
[ 356 ]
Capítulo 11
11. Al hacer clic en el botón Crear del paso anterior, pasarás al paso siguiente.
Haz clic en el botón Implementar fase, tal como se muestra a continuación,
para iniciar el proceso de implementación de la versión:
12. Ahora se te solicitará que revises los artefactos asociados. Cuando lo hayas
hecho, haz clic en el botón Implementar que se muestra a continuación:
[ 357 ]
Implementar la integración continua mediante Azure DevOps
[ 358 ]
Capítulo 11
14. Haz clic en los enlaces En curso que se muestran en la captura de pantalla
anterior para revisar el progreso. Como se muestra a continuación, el proceso
de creación de la versión ha funcionado correctamente:
Cómo funciona...
En la pestaña Canalización, hemos creado artefactos y un entorno denominado
ensayo y los hemos vinculado.
También hemos configurado el entorno para que Azure App Service se relacione
con las Azure Functions que hemos creado en el capítulo 4, Comprender la experiencia
de desarrollador integrada de Visual Studio Tools para Azure Functions.
Y eso no es todo…
Si vas a configurar una implementación continua por primera vez, es posible que
veas un botón con el texto Autorizar en el paso Implementación de Azure App
Service. Al hacer clic en el botón Autorizar, se abrirá una ventana emergente en la
que se te pedirán las credenciales del portal de administración de Azure.
[ 359 ]
Implementar la integración continua mediante Azure DevOps
Consulta también
La receta Implementación de una aplicación de función de Azure en el cloud de Azure
mediante Visual Studio del capítulo 4, Comprender la experiencia de desarrollador integrada
de Visual Studio Tools para Azure Functions.
[ 360 ]
Capítulo 11
Desencadenar la versión
automáticamente
En esta receta, aprenderás a configurar la implementación continua de un entorno.
En el proyecto puedes configurar desarrollo/ensayo o cualquier otro entorno
de preproducción y configurar la implementación continua para optimizar el proceso
de implementación.
Preparación
Si aún no has instalado la herramienta Postman, descárgala e instálala.
Cómo hacerlo...
Sigue estos pasos:
[ 361 ]
Implementar la integración continua mediante Azure DevOps
[ 362 ]
Capítulo 11
Cómo funciona...
En la pestaña Canalización, hemos habilitado el Desencadenador
de implementación continua.
Y eso no es todo…
También puedes crear distintos entornos y configurar las definiciones para publicar
las compilaciones necesarias en estos entornos.
[ 363 ]
Otros libros que te podrían
gustar
Si te ha gustado este libro, puede que te interesen estos otros libros de Packt:
Frederik Vos
ISBN: 978-1-78913-096-6
ff Descubre por qué Azure es la solución ideal para tus cargas de trabajo de código
abierto
ff Domina las habilidades esenciales de Linux y aprende a encontrar tu camino
en el entorno Linux
ff Implementa Linux en un entorno de Azure
ff Utiliza la administración de configuración para administrar Linux en Azure
ff Administra contenedores en un entorno de Azure
ff Mejora la seguridad de Linux y usa los sistemas de gestión de identidades
de Azure
ff Automatiza la implementación con Azure Resource Manager (ARM)
y Powershell
ff Utiliza Ansible para administrar instancias de Linux en un entorno en el cloud
de Azure
365
Otros libros que te podrían gustar
366