Documente Academic
Documente Profesional
Documente Cultură
sin servidor de
Azure
Manual Segunda edición
www.packt.com
Praveen Kumar Sreeram
Manual de informática sin
servidor de Azure
Segunda edición
BIRMINGHAM - BOMBAY
Manual de informática sin servidor de Azure
Segunda edición
Copyright © 2018 Packt Publishing
Durante la preparación de este libro, se hizo todo lo posible por asegurar la exactitud
de la información presentada. Sin embargo, los datos que contiene este libro se
venden sin garantía, ya sea expresa o implícita. Ni el autor ni Packt Publishing, sus
concesionarios y distribuidores se considerarán responsables de cualquier daño causado
o presuntamente causado de manera directa o indirecta por el contenido de este libro.
ISBN 978-1-78961-526-5
www.packtpub.com
No hubiera sido posible completar este libro sin el apoyo de mi otra mitad, mi esposa,
Haritha, y mi pequeño y bello ángel, Rithwika Sreeram.
mapt.io
Mapt es una biblioteca digital en línea que brinda acceso completo a más de 5.000
libros y videos, así como también a importantes herramientas, para ayudarlo
a planificar su desarrollo personal y a avanzar en su profesión. Para obtener más
información, visite nuestro sitio web.
PacktPub.com
¿Sabía que Packt ofrece versiones de eBook de cada libro publicado, con
archivos PDF y ePub disponibles? Puede actualizar a la versión de eBook en
www.PacktPub.com y, como compró la versión impresa del libro, tiene derecho
a un descuento en la copia del eBook. Para obtener más información, comuníquese
con nosotros a la dirección service@packtpub.com.
[ ii ]
Contenido
[ iii ]
Contenido
[ iv ]
Contenido
[ vi ]
Contenido
[ vii ]
Contenido
Procedimiento...239
Aún hay más... 241
Inserción masiva de datos en Cosmos DB 241
Procedimiento...241
Aún hay más... 242
Capítulo 9: Implementar procedimientos recomendados
para Azure Functions243
Incorporación de varios mensajes a una cola utilizando
la función IAsyncCollector 244
Preparación244
Procedimiento...245
Funcionamiento...247
Aún hay más... 247
Implementación de aplicaciones defensivas con
Azure Functions y desencadenadores de cola 247
Preparación248
Procedimiento...248
Aplicar la consola, CreateQueueMessage, mediante C# 248
Desarrollar la función de Azure, desencadenador de cola 249
Ejecutar pruebas utilizando la aplicación de consola 250
Funcionamiento...251
Aún hay más... 251
Control del ingreso masivo utilizando Event Hubs
para IoT y otros escenarios similares 252
Preparación252
Procedimiento...252
Crear un desencadenador de Event Hub para una función de Azure 252
Desarrollar una aplicación de consola que simule datos de IoT 253
Prevención de arranques en frío activando la aplicación
a intervalos constantes 256
Preparación256
Procedimiento...257
Crear un desencadenador HTTP 257
Crear un desencadenador de temporizador 257
Aún hay más... 258
Consulte también 258
Habilitación de la autorización para aplicaciones de función 258
Preparación258
Procedimiento...259
Funcionamiento...260
Aún hay más... 260
[ viii ]
Contenido
[ ix ]
Contenido
[x]
Contenido
Introducción329
Requisitos previos 330
Integración continua: crear una definición de compilación 331
Preparación332
Procedimiento...333
Funcionamiento...337
Aún hay más... 338
Integración continua: poner en cola una compilación
y desencadenarla de forma manual 338
Preparación338
Procedimiento...339
Configuración y desencadenamiento de una
compilación automatizada 341
Procedimiento...342
Funcionamiento...344
Aún hay más... 344
Integración continua: ejecutar casos de prueba
unitaria en la canalización 345
Procedimiento...346
Aún hay más... 348
Creación de una definición de versión 348
Preparación349
Procedimiento...350
Funcionamiento...358
Aún hay más... 358
Consulte también 359
Desencadenamiento de la versión automáticamente 360
Preparación360
Procedimiento...360
Funcionamiento...362
Aún hay más... 362
Otros libros que puede disfrutar 363
[ xi ]
Prólogo
Prólogo
La informática sin servidor es la abstracción de la administración de infraestructura
y permite que los desarrolladores aumenten su enfoque en la lógica de negocios para
que puedan ofrecer más características e innovación por ciclo. Al compilar aplicaciones
sin servidor, no tiene que invertir tiempo en el aprovisionamiento o la administración
de la infraestructura (por ejemplo, crear servidores, instalar actualizaciones, aplicar
parches al sistema operativo, administrar el escalado de la aplicación). En cambio,
emplea un conjunto de servicios en la nube totalmente administrados y altamente
escalables que se encargan de esa parte del trabajo.
Los beneficios de la informática sin servidor abarcan toda la organización y el ciclo
de desarrollo:
• Para el desarrollador, representa el enfoque pleno en el valor. La compilación
de aplicaciones sin servidor aumenta la capacidad individual de contribuir
de forma más eficaz a las áreas centrales 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 facilitador de la innovación desde una base
sólida. Gracias a la combinación de capacidad liberada y servicios
disruptivos, toda la organización puede actuar a partir de las primeras
señales para desarrollar o diversificar su modelo de negocio y cumplir con su
agenda de innovación.
Cuando se habla de aplicaciones sin servidor, podemos identificar algunos patrones
de aplicación que vale la pena mencionar aquí. Mientras que cada uno de ellos
comparte los beneficios indicados anteriormente, también tienen características
específicas y beneficios adicionales que los hacen únicos y los convierte en una mejor
opción para ciertos escenarios. Podemos observar los siguientes patrones en las
aplicaciones sin servidor:
• Aplicaciones web que hospedan tanto el lado del cliente como el del back-
end en servicios totalmente administrados que gestionan los requisitos de
escalado automático, seguridad y cumplimiento con App Service.
[ xiii ]
Prólogo
[ xiv ]
Prólogo
En el Capítulo 3, Integración perfecta de Azure Functions con los servicios de Azure, se explica
cómo Azure proporciona muchos conectores que puede aprovechar para integrar sus
aplicaciones empresariales con otros sistemas con bastante facilidad. En este capítulo,
aprenderá a integrar Azure Functions con Cognitive Services y Logic Apps.
En el Capítulo 5, Explorar las herramientas de prueba para validar las funciones de Azure,
comprenderá diferentes herramientas y procesos que le ayudan a agilizar sus
procesos de desarrollo y control de la calidad. También aprenderá a crear cargas
utilizando pruebas de carga de Azure DevOps (antes VSTS) y verá cómo supervisar
el rendimiento de Azure Functions utilizando los informes proporcionados por
Application Insights. Finalmente, también le enseñaremos cómo configurar alertas
que le informan cuando sus aplicaciones no responden.
[ xv ]
Prólogo
[ xvi ]
Prólogo
Convenciones utilizadas
Existen varias convenciones de texto que se utilizan en este libro.
[ xvii ]
Prólogo
Negrita: Indica un nuevo término, una palabra importante o palabras que se ven en
la pantalla; por ejemplo, en menús o cuadros de diálogo, también aparecen en textos
como este. Este es un ejemplo: "Durante la instalación, elija Azure development en la
sección Workloads".
Secciones
En este libro, encontrará varios encabezados que aparecen con frecuencia
(Preparación, Procedimiento, Funcionamiento, Aún hay más... y Consulte también).
Para dar instrucciones claras sobre cómo completar una tarea, utilice estas secciones
de la siguiente manera:
Preparación
Esta sección indica de qué se trata la tarea y describe cómo configurar el software
o la configuración preliminar requerida para la tarea.
Procedimiento
Esta sección contiene los pasos necesarios para seguir la tarea.
[ xviii ]
Prólogo
Funcionamiento
En general, en esta sección se explica detalladamente lo que sucedió
en la sección anterior.
Consulte también
Esta sección contiene enlaces eficaces a otras fuentes de información útil para la tarea.
Póngase en contacto
Siempre estamos dispuestos a recibir los comentarios de nuestros lectores.
[ xix ]
Prólogo
Opiniones
Deje una reseña. Una vez que haya leído y utilizado este libro, ¿por qué no deja una
reseña en el sitio en el que lo compró? Entonces, los potenciales lectores podrán ver
y utilizar su opinión imparcial para tomar decisiones de compra, nosotros en Packt
podremos saber lo que piensa de nuestros productos y nuestros autores podrán ver
su opinión acerca del libro. ¡Gracias!
[ xx ]
Desarrollo de aplicaciones
en la nube utilizando
desencadenadores de
funciones y enlaces
En este capítulo, trataremos los siguientes temas:
Introducción
Toda aplicación de software necesita componentes de back-end que protejan la lógica
empresarial y almacenen los datos en algún tipo de almacenamiento, como bases de
datos y sistemas de archivos. Cada uno de estos componentes de back-end se podría
desarrollar con tecnologías diferentes. La tecnología sin servidor de Azure también
nos permite desarrollar estas API de back-end utilizando Azure Functions.
[1]
Desarrollo de aplicaciones en la nube utilizando desencadenadores de funciones y enlaces
Azure Functions brinda muchas plantillas listas para utilizar que resuelven la
mayoría de los problemas comunes, como conectarse con el almacenamiento, crear
API web y recortar imágenes. En este capítulo, vamos a aprender cómo utilizar
estas plantillas incorporadas. Además de conocer los conceptos relacionados con
la informática sin servidor de Azure, intentaremos implementar una solución
que resuelve un problema de dominio básico: la creación de los componentes que
cualquier organización necesita para administrar la información de los empleados
internos.
[2]
Capítulo 1
Preparación
Para empezar a comprender la informática sin servidor de Azure utilizando Azure
Functions, vamos a crear una API web de back-end básica que responda a las
solicitudes de HTTP.
• Consulte https://azure.microsoft.com/free/?&wt.mc_
id=AID607363_SEM_8y6Q27AS para crear una cuenta de Azure gratuita.
• Visite https://docs.microsoft.com/azure/azure-functions/
functions-create-function-app-portal para comprender el proceso
paso a paso para crear una aplicación de función y https://docs.
microsoft.com/azure/azure-functions/functions-create-first-
azure-function para crear una función. Al crear una función, también
se crea una cuenta de almacenamiento para guardar todos los archivos.
Recuerde el nombre de la cuenta de almacenamiento, ya que la utilizará más
adelante en otros capítulos.
• Una vez que cree la aplicación de función, repase los conceptos básicos de
desencadenadores y enlaces, que son esenciales para entender cómo funciona
Azure Functions. Antes de continuar, le recomiendo encarecidamente que
lea el artículo https://docs.microsoft.com/azure/azure-functions/
functions-triggers-bindings.
Procedimiento...
Lleve a cabo los pasos siguientes:
1. Ingrese a la página de listado Function App haciendo clic en el menú
Function Apps, ubicado en el extremo izquierdo.
2. Cree una nueva función haciendo clic en el icono +.
[3]
Desarrollo de aplicaciones en la nube utilizando desencadenadores de funciones y enlaces
3. Verá la página Azure Functions for .NET - getting started, donde tendrá
que elegir la clase de herramientas que desea utilizar. Puede elegir la que
le interese. Para los primeros capítulos, utilizaremos la opción In-portal,
ya que allí puede crear Azure Functions de forma rápida, directamente
desde el portal y sin utilizar ninguna herramienta. En los demás capítulos,
emplearemos Visual Studio y Azure Functions Core Tools para crear las
funciones.
[4]
Capítulo 1
[5]
Desarrollo de aplicaciones en la nube utilizando desencadenadores de funciones y enlaces
using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
[6]
Capítulo 1
10. Para guardar los cambios, haga clic en el botón Save ubicado arriba del
editor de código.
11. Vamos a probar la función RegisterUser utilizando la consola Test. Haga
clic en la pestaña Test para abrir la consola Test.
12. Ingrese los valores para firstname y lastname en la sección Request body.
13. Una vez que haya revisado los parámetros de entrada, haga clic en el botón
Run, ubicado en el extremo inferior de la consola Test.
[7]
Desarrollo de aplicaciones en la nube utilizando desencadenadores de funciones y enlaces
Funcionamiento...
Ya creamos la primera función básica de Azure utilizando desencadenadores HTTP
e hicimos algunas modificaciones al código predeterminado. El código solo acepta
los parámetros firstname y lastname e imprime el nombre del usuario final con el
mensaje Hello {firstname} {lastname} como respuesta. También aprendimos
a probar la función del desencadenador HTTP directamente desde el portal de
administración de Azure.
Consulte también
La tarea Habilitar la autorización para aplicaciones de función en el Capítulo 9:
Implementar procedimientos recomendados para Azure Functions.
[8]
Capítulo 1
Preparación
En esta tarea, aprenderá lo fácil que es integrar un desencadenador HTTP y el
servicio de Almacenamiento de tablas de Azure utilizando enlaces de salida.
La función del desencadenador HTTP de Azure recibe los datos provenientes
de múltiples fuentes y almacena los datos de perfil de usuario en una tabla de
almacenamiento llamada tblUserProfile. Seguiremos los requisitos previos
enumerados a continuación:
Procedimiento...
Lleve a cabo los pasos siguientes:
[9]
Desarrollo de aplicaciones en la nube utilizando desencadenadores de funciones y enlaces
3. Se le pedirá que instale los enlaces. Para ello, haga clic en Install y espere
unos minutos. Cuando los enlaces se hayan instalado, elija la siguiente
configuración de los enlaces de salida de Almacenamiento de tablas de
Azure:
°° Table parameter name: Este es el nombre del parámetro que utilizará
en el método Run de la función de Azure. Para este ejemplo, utilice el
valor objUserProfileTable.
°° Table name: Se creará una nueva tabla en el Almacenamiento de
tablas de Azure para conservar los datos. Si la tabla aún no existe,
Azure la creará automáticamente para usted. Para este ejemplo,
ingrese tblUserProfile como nombre de tabla.
°° Storage account connection: Si no aparece la cadena de conexión de
la cuenta de Storage, haga clic en new (como se muestra en la captura
de pantalla a continuación) para crear una nueva o elegir una cuenta
de almacenamiento existente.
°° Los enlaces de salida de Almacenamiento de tablas de Azure deben
ser como los que 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 ]
Desarrollo de aplicaciones en la nube utilizando desencadenadores de funciones y enlaces
6. Para ejecutar la función, haga clic en el botón Run de la pestaña Test, con lo
cual se transfieren los parámetros firstname y lastname en Request body:
[ 12 ]
Capítulo 1
Funcionamiento...
Azure Functions nos permite integrarnos fácilmente con otros servicios de Azure,
tan solo agregando un enlace de salida al desencadenador. En este ejemplo,
integramos el desencadenador HTTP con el enlace de tabla de Azure Storage y
también configuramos la cuenta de Azure Storage. Para ello, ingresamos la cadena
de conexión de almacenamiento y el nombre de la tabla de Azure Storage en la que
queremos crear un registro de cada una de las solicitudes de HTTP recibidas por el
desencadenador HTTP.
[ 13 ]
Desarrollo de aplicaciones en la nube utilizando desencadenadores de funciones y enlaces
[ 14 ]
Capítulo 1
Estas líneas del código indican la función de tiempo de ejecución para incluir una
referencia a la biblioteca especificada en el contexto actual.
[ 15 ]
Desarrollo de aplicaciones en la nube utilizando desencadenadores de funciones y enlaces
Preparación
Actualizaremos el código de la función RegisterUser que empleamos en las tareas
anteriores.
Procedimiento...
Lleve a cabo los pasos siguientes:
1. Diríjase a la pestaña Integrate de la función de desencadenador HTTP
RegisterUser.
2. Haga clic en el botón New Output, seleccione Azure Queue Storage y luego
haga clic en el botón Select.
3. Proporcione los siguientes parámetros en la configuración de Azure Queue
Storage output:
° Message parameter name: Ingrese el nombre del parámetro
objUserProfileQueueItem, que se utilizará en el método Run
° Queue name: Ingrese el valor del nombre de cola
userprofileimagesqueue
° Storage account connection: Asegúrese de elegir la cuenta de
almacenamiento correcta en el campo Storage account connection
4. Haga clic en Save para crear el nuevo enlace de salida.
5. Vuelva al editor de código haciendo clic en el nombre de la función
(RegisterUser en este ejemplo) o en el archivo run.csx e incorpore los
cambios marcados en negrita en el siguiente código:
public static async Task<IActionResult> Run(
HttpRequest req,
CloudTable objUserProfileTable,
IAsyncCollector<string> objUserProfileQueueItem,
ILogger log)
{
....
[ 16 ]
Capítulo 1
....
objUserProfileTable.Execute(objTblOperationInsert);
}
8. Si todo va bien, verá el mensaje Status: 200 OK, lo cual indica que la URL
de la imagen que pasó como parámetro de entrada en Request body se
creará como un mensaje de cola en el servicio de cola de Azure Storage.
Vayamos al explorador de Azure Storage para ver la cola denominada
userprofileimagesqueue, que es el nombre de cola que ingresamos en el
Paso 3. A continuación se muestra una captura de pantalla del mensaje de
cola que se creó:
[ 17 ]
Desarrollo de aplicaciones en la nube utilizando desencadenadores de funciones y enlaces
Funcionamiento...
En esta tarea, agregamos el enlace de salida para el mensaje de cola y realizamos los
siguientes cambios en el código:
Almacenamiento de la imagen en el
Almacenamiento de blobs de Azure
En la tarea anterior, almacenamos la URL de la imagen en el mensaje de cola. Ahora
veamos cómo desencadenar una función de Azure (desencadenador de cola) cuando
se agrega un nuevo elemento de cola al servicio de cola de Azure Storage. Cada
mensaje de cola es la dirección URL de la imagen de perfil de un usuario, que se
procesará mediante Azure Functions y se almacenará como blob en el servicio de
blob de Azure Storage.
Preparación
En la tarea anterior, aprendimos a crear enlaces de salida de cola. En esta tarea,
vamos a tomar la URL de la cola para crear una matriz de bytes y luego escribirla en
un blob.
Procedimiento...
Lleve a cabo los pasos siguientes:
1. Para crear una nueva función de Azure, elija Azure Queue Storage Trigger
en las plantillas.
2. Después de elegir la plantilla, brinde estos detalles:
° Name your function: Asigne un nombre significativo, como
CreateProfilePictures.
[ 18 ]
Capítulo 1
3. Revise todos los detalles y haga clic en Create para crear una función nueva.
4. Desplácese hasta la pestaña Integrate, haga clic en New Output, elija la
opción Azure Blob Storage y luego haga clic en el botón Select.
5. En la sección Azure Blob Storage output, ingrese lo siguiente:
° Blob parameter name: Configúrelo en outputBlob
° Path: Indique userprofileimagecontainer/{rand-guid}
° Storage account connection: Elija la cuenta de almacenamiento
donde desea guardar los blobs y haga clic en el botón Save:
[ 19 ]
Desarrollo de aplicaciones en la nube utilizando desencadenadores de funciones y enlaces
{
imageData = wc.DownloadData(myQueueItem);
}
outputBlob.WriteAsync(imageData,0,imageData.Length);
}
8. Haga clic en el botón Save para guardar los cambios. Compruebe que no
haya errores de compilación en la ventana Logs:
11. Puede ver la imagen desde cualquier herramienta (como MS Paint o Internet
Explorer).
Funcionamiento...
Hemos creado un desencadenador de cola que se ejecuta como nuevo mensaje
y cuando llega un nuevo mensaje a la cola. Una vez que encuentra un nuevo mensaje
de cola, lo lee y, como sabemos, el mensaje es una URL de una imagen de perfil. La
función se encarga de realizar una solicitud de cliente web, de descargar los datos
de imagen en forma de una matriz de bytes y de escribir los datos en el blob que está
configurado como un blob de salida.
[ 20 ]
Capítulo 1
[ 21 ]
Trabajar con notificaciones
utilizando los servicios
SendGrid y Twilio
En este capítulo, trataremos los siguientes temas:
Introducción
Para que todas las aplicaciones empresariales ejecuten sin problemas las operaciones
empresariales, es fundamental disponer de un sistema de comunicación confiable
entre el negocio y sus clientes. El canal de comunicación puede ser bidireccional y
enviarles un mensaje a los administradores encargados de la aplicación o alertas a los
clientes a través de correos electrónicos o SMS.
Azure se puede integrar con dos servicios de comunicación populares: SendGrid, para
correos electrónicos, y Twilio, para trabajar con SMS. En este capítulo, utilizaremos
ambos servicios de comunicación con el fin de aprender a aprovechar sus servicios
básicos para enviar mensajes entre los administradores del negocio y los usuarios finales.
[ 23 ]
Trabajar con notificaciones utilizando los servicios SendGrid y Twilio
Preparación
Antes de pasar a la siguiente sección, llevaremos a cabo los pasos siguientes:
[ 25 ]
Trabajar con notificaciones utilizando los servicios SendGrid y Twilio
[ 26 ]
Capítulo 2
3. En la página API Keys, haga clic en Create API Key, como se muestra en la
siguiente captura de pantalla:
[ 27 ]
Trabajar con notificaciones utilizando los servicios SendGrid y Twilio
Procedimiento...
En esta sección, realizaremos lo siguiente:
1. Crear un enlace de cola de almacenamiento para el desencadenador HTTP.
2. Crear un desencadenador de cola para procesar el mensaje del
desencadenador HTTP.
3. Crear un enlace de salida de SendGrid para el desencadenador de cola.
4. Crear un enlace de salida de Twilio para el desencadenador de cola.
[ 28 ]
Capítulo 2
[ 29 ]
Trabajar con notificaciones utilizando los servicios SendGrid y Twilio
query" +
"string or in the request body");
}
[ 30 ]
Capítulo 2
[ 31 ]
Trabajar con notificaciones utilizando los servicios SendGrid y Twilio
6. Una vez que revise los valores, haga clic en Save para guardar los cambios.
7. Navegue hasta el método Run de las funciones SendNotifications para
incorporar los siguientes cambios:
° Agregue una nueva referencia para SendGrid, junto con el espacio
de nombres SendGrid.Helpers.Mail.
° Agregue un nuevo mensaje de parámetro de salida del tipo
SendGridMessage.
° Cree un objeto del tipo SendGridMessage. Veremos cómo
utilizar este objeto en la siguiente tarea.
[ 32 ]
Capítulo 2
{myQueueItem}");
message = new SendGridMessage();
}
Funcionamiento...
El objetivo de esta tarea es enviar una notificación por correo electrónico al
administrador para informarle que se creó un nuevo registro de manera correcta.
Para enviar los correos electrónicos, utilizamos uno de los enlaces de salida de Azure
Functions, denominado SendGrid, como servidor de Simple Mail Transfer Protocol
(SMTP). Para ello, codificamos las siguientes propiedades en los enlaces SendGrid
output (message):
[ 33 ]
Trabajar con notificaciones utilizando los servicios SendGrid y Twilio
Preparación
Asegúrese de que los siguientes parámetros están configurados correctamente:
Procedimiento...
En esta tarea, actualizaremos el código que se encuentra en el archivo run.csx de las
siguientes funciones de Azure
• RegisterUser
• SendNotifications
[ 36 ]
Capítulo 2
Funcionamiento...
Actualizamos el código de la función RegisterUser para aceptar otro parámetro
nuevo llamado email.
[ 37 ]
Trabajar con notificaciones utilizando los servicios SendGrid y Twilio
Asimismo, podemos borrar los campos en los enlaces de SendGrid output, como se
detalla en esta captura de pantalla:
[ 38 ]
Capítulo 2
Procedimiento...
Lleve a cabo los pasos siguientes:
[ 39 ]
Trabajar con notificaciones utilizando los servicios SendGrid y Twilio
4. Ejecute una prueba con la misma carga de solicitud que utilizamos en la tarea
anterior.
5. Después de la prueba, se creará el archivo de registro en el contenedor, que
tendrá el nombre userregistrationemaillogs:
[ 40 ]
Capítulo 2
Funcionamiento...
Acabamos de crear nuevos enlaces de salida de blob de Azure. Apenas recibamos
una nueva solicitud, se creará el contenido del correo electrónico y se escribirá en
un nuevo archivo .log (también puede utilizar otra extensión), que será almacenado
como blob en el contenedor especificado en el campo Path de los enlaces de salida.
[ 41 ]
Trabajar con notificaciones utilizando los servicios SendGrid y Twilio
Preparación
Esta tarea es la continuación de la tarea anterior. Si está leyendo esto, primero
asegúrese de repasar las tareas anteriores de este capítulo.
Procedimiento...
Tendremos que seguir estos pasos antes de avanzar a la próxima sección:
[ 42 ]
Capítulo 2
4. Ejecutemos una prueba con la misma carga de solicitud que utilizamos en las
tareas anteriores.
5. Como figura en la captura de pantalla más abajo, se puede ver el nuevo
archivo de registro de correo electrónico creado utilizando el elemento
RowKey del nuevo registro guardado en el Almacenamiento de tablas
de Azure:
2. Ejecute una prueba con la misma carga de solicitud que empleó en las tareas
anteriores.
[ 43 ]
Trabajar con notificaciones utilizando los servicios SendGrid y Twilio
[ 44 ]
Capítulo 2
Preparación
Para utilizar el enlace Twilio SMS output (objsmsmessage), tenemos que hacer
lo siguiente:
[ 45 ]
Trabajar con notificaciones utilizando los servicios SendGrid y Twilio
4. En la página Get Started with Phone Numbers, haga clic en Get your first
Twilio phone number, como vemos aquí:
6. El último paso es verificar el número al que desea enviar un SMS. Solo puede
tener un número en la cuenta de prueba. Para verificar un número, visite la
página Twilio's Verified disponible en https://www.twilio.com/console/
phone-numbers/verified. La siguiente es una captura de pantalla de la lista
de números verificados:
[ 46 ]
Capítulo 2
Procedimiento...
Lleve a cabo los pasos siguientes:
[ 47 ]
Trabajar con notificaciones utilizando los servicios SendGrid y Twilio
[ 48 ]
Capítulo 2
Funcionamiento...
Creamos una nueva cuenta de Twilio y copiamos la clave de la aplicación y la
ID de la cuenta en la App settings de la aplicación Azure Functions. El tiempo
de ejecución de la aplicación de función empleará estas dos configuraciones para
conectarse con la API de Twilio y enviar el SMS.
Para hacerlo más simple, codifiqué el número de teléfono en los enlaces de salida.
No obstante, en las aplicaciones reales, se envía el SMS al número de teléfono
indicado por los usuarios finales.
[ 49 ]
Integración perfecta de Azure
Functions con los servicios
de Azure
En este capítulo, trataremos los siguientes temas:
Introducción
Uno de los principales objetivos de Azure Functions es permitir que los
desarrolladores se centren exclusivamente en desarrollar los requisitos y la lógica
de las aplicaciones, y abstraer todo lo demás.
[ 51 ]
Integración perfecta de Azure Functions con los servicios de Azure
Azure le proporciona muchos conectores que puede aprovechar para integrar sus
aplicaciones empresariales con otros sistemas de una manera bastante sencilla.
Preparación
Para empezar, necesitamos crear una API de Computer Vision y configurar sus
claves de API para que Azure Functions (o cualquier otro programa) acceda a ella
mediante programación.
[ 52 ]
Capítulo 3
Configurar la aplicación
Lleve a cabo los pasos siguientes:
Procedimiento...
Lleve a cabo los pasos siguientes:
[ 53 ]
Integración perfecta de Azure Functions con los servicios de Azure
[ 54 ]
Capítulo 3
4. Ahora vamos a crear otro enlace Azure Table Storage output para almacenar
toda la información de mujeres. Para ello, haga clic en el botón New Output
en la pestaña Integrate, seleccione Azure Table Storage y haga clic en el
botón Select. Así debe verse después de proporcionar los valores de entrada:
5. Revise todos los detalles y haga clic en el botón Save para crear el enlace
Azure Table Storage output y almacenar la información sobre 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
Funcionamiento...
Primero creamos un enlace de salida de Almacenamiento de tablas para almacenar
detalles sobre todos los hombres que aparecen en las fotos. Luego creamos otro
enlace de salida de Almacenamiento de tablas para almacenar los detalles sobre
todas las mujeres.
Tenga en cuenta que las API no son 100 % precisas a la hora de identificar
el género correcto. Por lo tanto, en sus entornos de producción, debe tener
un mecanismo de reserva para manejar tales situaciones.
• Edad
• Género
• Coordenadas de los rostros en la imagen
[ 60 ]
Capítulo 3
En esta tarea, aprenderá a utilizar la API de ADO.NET para conectarse a una base
de datos SQL e insertar datos JSON en una tabla denominada EmployeeInfo.
Preparación
Diríjase al portal de Azure y haga lo siguiente:
1. Cree un SQL Server lógico con el nombre que prefiera. Se recomienda crearlo
en el mismo grupo de recursos donde tiene las funciones de Azure.
2. Cree una Azure SQL Database llamada Cookbookdatabase. Para ello,
elija Blank database en el menú desplegable Select source en la hoja SQL
Database mientras crea la base de datos.
[ 61 ]
Integración perfecta de Azure Functions con los servicios de Azure
[ 62 ]
Capítulo 3
6. Abra el SSMS y conéctese al servidor SQL Server lógico de Azure que creó en
los pasos anteriores.
7. Una vez que esté conectado, cree una nueva tabla llamada 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
)
)
Procedimiento...
Lleve a cabo los pasos siguientes:
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();
}
}
Recuerde validar todos los parámetros de entrada. Para hacerlo más simple, el código
que valida los parámetros de entrada no está incluido. Asegúrese de validar todos los
parámetros antes de guardarlos en su base de datos. También es recomendable almacenar la
cadena de conexión en Application settings.
Recuerde validar todos los parámetros de entrada. Para hacerlo más simple, el código
que valida los parámetros de entrada no está incluido. Asegúrese de validar todos los
parámetros antes de guardarlos en su base de datos.
[ 65 ]
Integración perfecta de Azure Functions con los servicios de Azure
Funcionamiento...
El objetivo de esta tarea era aceptar los valores de entrada del usuario y guardarlos
en una base de datos relacional desde donde los datos se puedan recuperar más
tarde para fines operativos. Para ello, utilizamos Azure SQL Database, una oferta
de base de datos relacional también conocida como base de datos como servicio
(DBaaS). Hemos creado una nueva base de datos SQL y reglas de Firewall que nos
permiten conectarnos de forma remota desde la estación de trabajo de desarrollo
local utilizando SSMS. También creamos una tabla denominada EmployeeInfo, que
se puede utilizar para guardar datos.
Antes de conocer Azure Logic Apps, pensaba que tardaría varias semanas en
aprender, desarrollar, probar e implementar una solución de este tipo. Obviamente,
se necesitaría una buena cantidad de tiempo para aprender, comprender y consumir
la API de Twitter (o cualquier otra red social) para obtener la información necesaria
y crear una solución completa que resolviera el problema.
Por fortuna, después de oír acerca de Logic Apps y sus innovadores conectores,
bastaron unos 10 minutos para diseñar una solución para el problema que tenía mi
amigo.
En esta tarea, aprenderá a diseñar una aplicación lógica que se integra con Twitter
(para supervisar tweets) y Gmail (para enviar correos electrónicos).
Preparación
Para trabajar con esta tarea, necesitamos lo siguiente:
Cuando trabajemos con esta tarea, tendremos que autorizar el acceso de Azure Logic
Apps a sus cuentas.
Procedimiento...
Llevaremos a cabo los pasos siguientes:
[ 67 ]
Integración perfecta de Azure Functions con los servicios de Azure
[ 68 ]
Capítulo 3
1. Una vez creada la aplicación lógica, navegue hasta Logic app designer y elija
Blank logic app.
2. A continuación, se le pedirá que seleccione Connectors. En la lista
Connectors, haga clic en Twitter. El sistema le pedirá que se conecte
a Twitter, para lo cual tendrá que proporcionar las credenciales de su
cuenta de Twitter. Si ya se conectó, directamente aparecerá la lista de
desencadenadores en Triggers asociados con el conector de Twitter, como se
muestra en la siguiente captura de pantalla:
[ 69 ]
Integración perfecta de Azure Functions con los servicios de Azure
4. Agregaremos una nueva condición. Para ello, haga clic en Next Step, busque
condition y seleccione la acción Condition, como se muestra a continuación:
[ 70 ]
Capítulo 3
[ 71 ]
Integración perfecta de Azure Functions con los servicios de Azure
[ 72 ]
Capítulo 3
11. Una vez que haya terminado, haga clic en el botón Save.
[ 73 ]
Integración perfecta de Azure Functions con los servicios de Azure
Funcionamiento...
Creó una nueva aplicación lógica y eligió 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 conteo de seguidores es
mayor o igual a 200. Si se cumple esta condición, se crea una nueva acción con un
nuevo conector de Gmail capaz de enviar un correo electrónico con el contenido
dinámico enmarcado utilizando los parámetros del conector de Twitter.
[ 74 ]
Capítulo 3
Preparación
Antes de continuar, llevaremos a cabo los pasos siguientes:
1. Cree una cuenta de SendGrid (si aún no la creó), tome la clave de la API de
SendGrid y cree una nueva clave en el campo Application settings de la
aplicación de función.
2. Instale Postman para probar el desencadenador HTTP. Puede descargar la
herramienta desde https://www.getpostman.com/.
Procedimiento...
Lleve a cabo los pasos siguientes:
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 próximo paso, prepare la entrada JSON que debe pasar desde
la aplicación lógica hasta la función de desencadenador HTTP
ValidateTwitterFollowerCount que desarrollamos. Vamos a enmarcar
la entrada JSON del mismo modo en que lo hicimos cuando probamos la
función del desencadenador HTTP utilizando Postman, como se muestra en
la siguiente captura de pantalla (la única diferencia es que los valores, como
followersCount, Name y tweettext ahora son dinámicos):
[ 79 ]
Integración perfecta de Azure Functions con los servicios de Azure
Consulte también
• Consulte la tarea Envío de una notificación por correo electrónico de manera
dinámica al usuario final en el Capítulo 2, Trabajar con notificaciones utilizando los
servicios SendGrid y Twilio
Preparación
Para empezar, primer tenemos que hacer lo siguiente:
• Crear una cuenta de Cosmos DB.
• Crear una nueva colección de Cosmos DB en la que pueda almacenar datos
en forma de documentos.
[ 80 ]
Capítulo 3
1. Después de crear la cuenta, cree una nueva base de datos y una colección.
Podemos crear ambas en un solo paso directamente desde el portal.
2. Desplácese hasta la pestaña Overview y haga clic en el botón Add Collection
para crear una colección nueva:
[ 81 ]
Integración perfecta de Azure Functions con los servicios de Azure
Nombre del
Valor Comentario
campo
Según sus cargas de trabajo de
Capacidad de producción, es posible que tenga que
Fixed (10 GB)
almacenamiento trabajar con Unlimited, ya que, de lo
contrario, podría obtener particiones.
Esta es la capacidad de la colección
de Cosmos DB. El rendimiento
Rendimiento
de las lecturas y escrituras de la
(400-10.000 400
colección depende del rendimiento
RU/s)
que configure cuando aprovisione la
colección.
Hemos creado con éxito una cuenta de Cosmos DB y una colección. Ahora vamos
a aprender a integrar la colección con una nueva función de Azure
y a desencadenarla siempre que haya un cambio en la colección de Cosmos DB.
Procedimiento...
Lleve a cabo los pasos siguientes:
[ 82 ]
Capítulo 3
[ 83 ]
Integración perfecta de Azure Functions con los servicios de Azure
3. Una vez que haya repasado los detalles, haga clic en el botón Save
(que se muestra en la captura de pantalla anterior) para crear la
nueva función que se desencadenará con cada cambio en la colección.
Vayamos rápidamente a la aplicación de función de Azure (en mi caso
es AzureFunctionCookBookV2) para ver si se creó la nueva función
denominada cookbookdatacollectionTrigger. Así se ve mi aplicación de
función:
[ 85 ]
Integración perfecta de Azure Functions con los servicios de Azure
Funcionamiento...
Para integrar Azure Functions con Cosmos DB, primero creamos una cuenta de
Cosmos DB y luego una base de datos y una nueva colección dentro de ella. Después
de crear la colección, la integramos desde el portal de Azure haciendo clic en el
botón Add Azure Function, disponible en la cuenta de Cosmos DB. Elegimos la
aplicación de función necesaria en la que queríamos crear un desencadenador de
Cosmos DB. Una vez completada la integración, creamos un documento de ejemplo
en la colección de Cosmos DB y luego comprobamos que la función se activara
automáticamente para todos los cambios (todas las lecturas y escrituras, pero no las
eliminaciones) que realizamos en la colección.
[ 86 ]
Comprender la experiencia
integrada de desarrollador de
Visual Studio Tools
En este capítulo, trataremos los siguientes temas:
• Creación de una aplicación de función utilizando Visual Studio 2017.
• Depuración de funciones de Azure C# en un entorno local previamente
configurado utilizando Visual Studio 2017.
• Conexión con la nube de Azure Storage desde el entorno local de Visual
Studio.
• Implementación de la aplicación de función de Azure en la nube de Azure
utilizando Visual Studio.
• Depuración de la función de Azure C# activa, hospedada en el entorno de
nube de Microsoft Azure, con Visual Studio.
• Implementación de las funciones de Azure en un contenedor.
Introducción
En los capítulos anteriores, aprendimos cómo crear funciones de Azure directamente
desde el portal de administración de Azure. Estas son algunas de las características:
Hoy en día, mientras escribo, las herramientas de Visual Studio para la función
admiten la depuración solo para C#. En el futuro, es probable que Microsoft ponga
a disposición todas estas características geniales en otros idiomas.
Preparación
Debe descargar e instalar las siguientes herramientas y software:
[ 88 ]
Capítulo 4
[ 89 ]
Comprender la experiencia integrada de desarrollador de Visual Studio Tools
Procedimiento...
Lleve a cabo los pasos siguientes:
1. Abra Visual Studio, elija File y luego haga clic en New Project. En el cuadro
de diálogo New Project, en la plantilla Installed, dentro de Visual C#,
seleccione Cloud y luego la opción Azure Functions:
[ 90 ]
Capítulo 4
[ 91 ]
Comprender la experiencia integrada de desarrollador de Visual Studio Tools
Funcionamiento...
Las herramientas de Visual Studio para Azure Functions les permiten a los
desarrolladores utilizar su IDE favorito, el cual, posiblemente, hayan estado
utilizando por años. Con las herramientas de función de Azure, puede utilizar el
mismo conjunto de plantillas que proporciona el portal de administración de Azure
para crear e integrar rápidamente con los servicios en la nube sin escribir ningún
código de establecimiento (o escribiendo uno mínimo).
La otra ventaja de utilizar las herramientas de Visual Studio para las funciones es
que no es necesario tener una suscripción de Azure activa. Puede depurar y probar
las funciones de Azure directamente en el entorno de desarrollo local. La CLI de
Azure y las utilidades relacionadas nos proporcionan toda la asistencia necesaria
para ejecutar las funciones de Azure.
Preparación
Descargue e instale la CLI de Azure (si no tiene instaladas estas herramientas, tenga
en cuenta que Visual Studio las descargará automáticamente cuando ejecute las
funciones desde Visual Studio).
Procedimiento...
Lleve a cabo los pasos siguientes:
[ 93 ]
Comprender la experiencia integrada de desarrollador de Visual Studio Tools
[ 94 ]
Capítulo 4
[ 95 ]
Comprender la experiencia integrada de desarrollador de Visual Studio Tools
10. Una vez completa la depuración, puede hacer clic en la tecla F5 para
completar el proceso de ejecución. Después de esto, verá la respuesta de
salida en el navegador, como se muestra en la siguiente captura de pantalla:
[ 96 ]
Capítulo 4
Funcionamiento...
El host de trabajo funciona como un servidor que escucha a un puerto específico.
Si hay alguna solicitud a ese puerto particular, automáticamente se encarga de
ejecutar las solicitudes y envía una respuesta.
[ 97 ]
Comprender la experiencia integrada de desarrollador de Visual Studio Tools
Preparación
Siga estos requisitos previos:
Procedimiento...
Lleve a cabo los pasos siguientes:
[ 98 ]
Capítulo 4
[ 99 ]
Comprender la experiencia integrada de desarrollador de Visual Studio Tools
[ 101 ]
Comprender la experiencia integrada de desarrollador de Visual Studio Tools
Funcionamiento...
En esta clase BlobTriggerCSharp, el método Run posee atributos de WebJobs con una
cadena de conexión (en este caso, AzureWebJobsStorage). Esto le indica al tiempo
de ejecución que se remita a la cadena de conexión de Azure Storage en el archivo
de configuración local con la clave denominada al igual que la cadena de conexión
AzureWebJobsStorage. Cuando el host de trabajo comienza a ejecutarse, emplea la
cadena de conexión y supervisa los contenedores de cuentas de almacenamiento que
hemos especificado. Cada vez que se agrega o actualiza un blob nuevo, desencadena
automáticamente el desencadenador de blobs en el entorno actual.
[ 102 ]
Capítulo 4
Implementación de la aplicación de
función de Azure en la nube de Azure
utilizando Visual Studio
Hasta ahora, nuestra aplicación de función solo es una aplicación normal dentro de
Visual Studio. Para implementar la aplicación de función junto con sus funciones,
necesitamos crear los siguientes recursos nuevos o seleccionar los existentes para
hospedar la nueva aplicación de función:
• El grupo de recursos.
• El plan de App Service.
• La aplicación de función de Azure.
Puede proporcionar todos estos detalles directamente desde Visual Studio sin abrir
el portal de administración de Azure. Aprenderá a hacerlo en esta tarea.
Procedimiento...
Lleve a cabo los pasos siguientes:
1. Haga clic derecho en el proyecto y luego haga clic en el botón Publish para
abrir la ventana de publicación.
2. En la ventana Publish, elija la opción Create New y haga clic en el botón
Publish, como se muestra en la siguiente captura de pantalla:
[ 103 ]
Comprender la experiencia integrada de desarrollador de Visual Studio Tools
3. En la ventana Create App Service, puede elegir entre los recursos existentes
o hacer clic en el botón New para seleccionar el nuevo grupo de recursos en
Resource Group, el plan de App Service y la cuenta de almacenamiento en
Storage Account, como se ve a continuación:
[ 104 ]
Capítulo 4
[ 105 ]
Comprender la experiencia integrada de desarrollador de Visual Studio Tools
[ 106 ]
Capítulo 4
[ 107 ]
Comprender la experiencia integrada de desarrollador de Visual Studio Tools
Preparación
Cree un contenedor llamado cookbookfiles-live en la cuenta de almacenamiento.
Subiremos un blob en este contenedor.
Procedimiento...
Lleve a cabo los pasos siguientes:
[ 108 ]
Capítulo 4
3. Haga clic derecho en la función y luego haga clic en Attach Debugger, como
se ve en la siguiente captura de pantalla:
[ 109 ]
Comprender la experiencia integrada de desarrollador de Visual Studio Tools
6. Diríjase a Storage Explorer y cargue un nuevo archivo (en este caso, cargué
EmployeeInfo.json) en el contenedor cookbookfiles-live, como se
muestra aquí:
[ 110 ]
Capítulo 4
[ 111 ]
Comprender la experiencia integrada de desarrollador de Visual Studio Tools
Al ver el título de esta tarea, quizá se haya preguntado por qué y cómo podría
ayudar la implementación de una función de Azure en un contenedor de Docker.
Efectivamente, es posible que la combinación de las funciones de Azure y el
contenedor de Docker no tenga sentido, ya que perdería todas las ventajas del
servicio sin servidor de Azure Functions al implementarlas en Docker. Sin embargo,
puede haber algunos clientes cuyas cargas de trabajo actuales se encuentren en algún
tipo de nube (ya sea pública o privada) y que ahora quieran aprovechar algunos de
los desencadenadores de funciones de Azure y los servicios de Azure relacionados,
por lo que desean implementar las funciones de Azure como una imagen de Docker.
En esta tarea se explica cómo implementar este procedimiento.
Preparación
A continuación se indican los requisitos previos para empezar a trabajar con
esta tarea:
[ 112 ]
Capítulo 4
Crear un ACR
Lleve a cabo los pasos siguientes:
1. Brinde los siguientes detalles para crear un nuevo ACR, como se muestra en
esta captura de pantalla:
[ 113 ]
Comprender la experiencia integrada de desarrollador de Visual Studio Tools
Procedimiento...
En los tres primeros capítulos, creamos tanto la aplicación de función como las
funciones directamente en el portal. Hasta ahora, 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 integrada de desarrollador de Visual Studio Tools
4. Para comprobar que todo funciona bien en el entorno local, diríjase al host
local con el puerto correcto, como se muestra en la siguiente captura de
pantalla.
[ 116 ]
Capítulo 4
[ 117 ]
Comprender la experiencia integrada de desarrollador de Visual Studio Tools
[ 118 ]
Capítulo 4
4. Después de repasar todos los detalles, haga clic en el botón Create 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 vinculándola a la imagen hospedada
en Azure Container Registry. Probemos rápidamente el desencadenador
HttpTrigger navegando al punto de conexión HTTP en el explorador.
A continuación, se muestra la salida de la función de Azure.
Funcionamiento...
En los tres primeros capítulos, creamos tanto la aplicación de función como las
funciones directamente en el portal. Por el contrario, hasta ahora en este capítulo
hemos creado la aplicación de función y las funciones en Visual Studio.
[ 119 ]
Comprender la experiencia integrada de desarrollador de Visual Studio Tools
[ 120 ]
Explorar las herramientas
de prueba para validar las
funciones de Azure
En este capítulo, vamos a explorar diferentes maneras de probar las funciones
de Azure de forma más detallada con las siguientes tareas:
• Prueba de las funciones de Azure:
°° Prueba de los desencadenadores HTTP utilizando Postman.
°° Prueba del desencadenador de blobs utilizando el explorador
de almacenamiento de Microsoft.
°° Prueba del desencadenador de cola utilizando el portal
de administración de Azure.
• Prueba de una función de Azure en un entorno previamente configurado
utilizando ranuras de implementación.
• Prueba de carga de las funciones de Azure mediante Azure DevOps.
• Creación y prueba de una función de Azure de manera local con
herramientas de la CLI de Azure.
• Prueba y validación de la capacidad de respuesta de una función de Azure
utilizando Application Insights.
• Desarrollo de pruebas unitarias para las funciones de Azure con
desencadenadores HTTP.
Introducción
En los capítulos anteriores, aprendió a desarrollar funciones de Azure y a reconocer
dónde son útiles, además de analizar la validación de su funcionalidad.
[ 121 ]
Explorar las herramientas de prueba para validar las funciones de Azure
Preparación
Instale las siguientes herramientas, si aún no las tiene:
[ 122 ]
Capítulo 5
Procedimiento...
En esta sección, crearemos tres funciones de Azure 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 prueba para validar las funciones de Azure
4. Haga clic en el botón Send para hacer la solicitud. Si especificó todos los
detalles necesarios para la API, verá Status: 200 OK, junto con la respuesta,
como figura aquí:
5.
[ 124 ]
Capítulo 5
2. Una vez que haga clic en la plantilla que se observa en la captura de pantalla
anterior, el sistema le pedirá que proporcione la cuenta de almacenamiento
y el contenedor donde almacenará el blob, como se muestra aquí:
[ 125 ]
Explorar las herramientas de prueba para validar las funciones de Azure
[ 126 ]
Capítulo 5
8. En la ventana Upload Files, elija el archivo que desea cargar y haga clic en el
botón Upload.
[ 127 ]
Explorar las herramientas de prueba para validar las funciones de Azure
[ 128 ]
Capítulo 5
3. En la hoja Queue service, haga clic en Queue para agregar una nueva cola:
[ 129 ]
Explorar las herramientas de prueba para validar las funciones de Azure
[ 130 ]
Capítulo 5
[ 131 ]
Explorar las herramientas de prueba para validar las funciones de Azure
Todas estas limitaciones están cubiertas en Azure Functions, ya que se emplea una
característica denominada slots, ranuras en español, (también se llaman deployment
slots o ranuras de implementación en los entornos de App Service). El uso de
ranuras permite configurar un entorno de preproducción donde se pueden revisar
todas las funcionalidades nuevas y promoverlas (mediante el intercambio que
abordaremos en un momento) al entorno de producción sin problemas y siempre
que lo necesite.
Procedimiento
Lleve a cabo los pasos siguientes:
[ 132 ]
Capítulo 5
[ 133 ]
Explorar las herramientas de prueba para validar las funciones de Azure
11. Después de hacer clic en Create, se creará una nueva ranura, como podemos
ver en la siguiente captura de pantalla. Si ve las funciones como de solo
lectura, puede hacerlas de lectura y escritura en Function App Settings.
12. Para que el entorno preconfigurado esté completo, copie todas las
funciones de Azure del entorno de producción (en este caso, la aplicación
MyProductionApp) en la nueva ranura preconfigurada llamada Staging.
Cree dos desencadenadores HTTP y copie los dos códigos de función
(MyProd-HttpTrigger1 y MyProd-HttpTrigger2) de MyProductionApp en
la nueva ranura Staging. Básicamente, tiene que copiar todas las funciones
en la nueva ranura de forma manual.
13. Cambie la cadena production por staging en la última línea de las dos
funciones en la ranura Staging. Esto sirve para probar la salida de la
operación de intercambio:
[ 134 ]
Capítulo 5
Tenga en cuenta que, en todas las ranuras que cree como una aplicación
de preproducción, debe utilizar los mismos nombres de función que tiene
en su entorno de producción.
14. Haga clic en el botón Swap, ubicado en la hoja Deployment slots, como se
muestra en la siguiente captura de pantalla:
[ 135 ]
Explorar las herramientas de prueba para validar las funciones de Azure
[ 136 ]
Capítulo 5
[ 137 ]
Explorar las herramientas de prueba para validar las funciones de Azure
Debe tener todas las funciones de Azure en cada una de las ranuras que pretende
intercambiar con su aplicación de función de producción:
[ 139 ]
Explorar las herramientas de prueba para validar las funciones de Azure
Preparación
Cree una cuenta de Azure DevOps en https://visualstudio.microsoft.com/.
Utilizaremos la herramienta Load Test de Azure DevOps para crear pruebas de
carga basadas en URL.
Procedimiento...
Lleve a cabo los pasos siguientes:
[ 140 ]
Capítulo 5
6. Haga clic en el enlace New y seleccione URL based test, como se muestra en
la siguiente captura de pantalla:
[ 141 ]
Explorar las herramientas de prueba para validar las funciones de Azure
10. En el siguiente paso debe proporcionar detalles sobre la carga que queremos
crear en la función de Azure. Como se muestra en la captura de pantalla más
abajo, haga clic en Settings e indique los detalles de la prueba de carga que
desea, según sus requisitos:
[ 142 ]
Capítulo 5
11. Después de brindar todos los detalles de la prueba de carga, haga clic en
Save. Una vez que guarde la prueba, el botón Run test quedará habilitado,
como vemos en esta captura de pantalla:
12. Haga clic en Run test para iniciar la prueba de carga. Como la duración de la
ejecución de nuestra prueba de carga es de 20 minutos, tardará 20 minutos
en completar la prueba de carga. Una vez completada la carga, Azure
DevOps nos proporciona los informes de rendimiento, que se muestran a
continuación:
°° Informe de rendimiento: nos brinda el tiempo de respuesta
promedio del desencadenador HTTP para cargar 1000 usuarios.
[ 143 ]
Explorar las herramientas de prueba para validar las funciones de Azure
Consulte también
Puede encontrar más información sobre este tema en la tarea Supervisar las
funciones de Azure utilizando Application Insights en el Capítulo 6, Supervisar
y solucionar problemas en los servicios sin servidor de Azure.
Azure también proporciona herramientas para los desarrolladores que aman trabajar
con la línea de comandos. Estas herramientas nos permiten crear recursos de Azure
con comandos simples directamente desde la línea de comandos. En esta tarea,
aprenderá a crear una nueva aplicación de función, además de crear una función
e implementarla en la nube de Azure directamente desde la línea de comandos.
[ 144 ]
Capítulo 5
Preparación
Lleve a cabo los pasos siguientes:
Procedimiento...
Lleve a cabo los pasos siguientes:
1. Una vez que Azure Functions Core Tools esté listo, ejecute el siguiente
comando para crear una nueva aplicación de función:
func init
[ 145 ]
Explorar las herramientas de prueba para validar las funciones de Azure
[ 146 ]
Capítulo 5
[ 147 ]
Explorar las herramientas de prueba para validar las funciones de Azure
7. Una vez que se haya iniciado el host, copie la dirección URL y pruébelo en el
explorador, junto con un nombre de parámetro de cadena de consulta, como
se muestra en la siguiente captura de pantalla:
Sería realmente útil recibir una notificación cuando nuestro sitio no está disponible
o no responde a las solicitudes de los usuarios. Azure proporciona algunas
herramientas que nos alertan si el sitio web no responde o no funciona. Una de ellas
es Application Insights. Aprenderá a configurar Application Insights para hacer ping
en nuestra aplicación de función de Azure cada minuto y a configurarla para que nos
avise si la función no responde.
[ 148 ]
Capítulo 5
Preparación
Lleve a cabo los pasos siguientes:
[ 149 ]
Explorar las herramientas de prueba para validar las funciones de Azure
Procedimiento...
Lleve a cabo los pasos siguientes:
[ 150 ]
Capítulo 5
[ 151 ]
Explorar las herramientas de prueba para validar las funciones de Azure
[ 152 ]
Capítulo 5
Funcionamiento...
Creamos la prueba Availability, donde se hará ping en nuestra aplicación de
función cada cinco minutos desde cinco ubicaciones diferentes del mundo, como
máximo. Puede configurarlas en la pestaña Test Location de la hoja Create test
mientras crea 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, entonces
la prueba ha fallado y se envía una alerta a la dirección de correo electrónico
configurable.
[ 153 ]
Explorar las herramientas de prueba para validar las funciones de Azure
en el código que creamos al inicio. Una buena práctica es escribir pruebas unitarias
automatizadas que nos ayuden a probar la funcionalidad de nuestras funciones de
Azure. Cada vez que ejecutamos estas pruebas unitarias automatizadas, podemos
probar las diversas rutas de acceso dentro del código.
Preparación
Vamos a utilizar el marco de simulación de Moq para realizar una prueba unitaria
en nuestra función de Azure. Para esta tarea, se requieren conocimientos prácticos
básicos de Moq. Si es necesario, puede obtener más información sobre Moq en
https://github.com/moq/moq4/wiki.
Para simplificar el caso de prueba unitaria, marqué con comentarios las líneas
del código que lee los datos desde los parámetros Post hasta el método Run de
HTTPTriggerCSharpFromVS HTTPTrigger, como se muestra abajo, resaltado
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
Procedimiento...
Lleve a cabo los pasos siguientes:
[ 155 ]
Explorar las herramientas de prueba para validar las funciones de Azure
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. Ahora, haga clic derecho en la prueba unitaria y luego haga clic en Run
test(s), como se muestra en esta captura de pantalla:
Si todo está configurado correctamente, las pruebas serán exitosas, como vemos aquí:
Eso es todo. Hemos aprendido a escribir un caso de prueba unitaria básica para un
desencadenador HTTP.
[ 157 ]
Supervisar y solucionar
problemas en los servicios
sin servidor de Azure
En este capítulo, aprenderá a hacer lo siguiente:
Introducción
Completar el desarrollo de un proyecto y activar una aplicación no es el final de
la historia de implementación. Necesitamos supervisar continuamente nuestras
aplicaciones, analizar su rendimiento y revisar sus registros para entender si los
usuarios finales se están enfrentando a algún problema.
Azure nos proporciona varias herramientas para satisfacer todos nuestros requisitos
de supervisión, directamente desde las fases de desarrollo y mantenimiento.
[ 158 ]
Capítulo 6
Procedimiento...
Una vez que haya terminado con el desarrollo y que haya probado sus aplicaciones
exhaustivamente en el entorno local, puede intentar implementarlas en Azure.
A veces, suelen surgir ciertos problemas después de implementar una aplicación en
Azure, ya que el entorno es diferente. Por ejemplo, el desarrollador podría haberse
olvidado de crear App Settings en la aplicación. Si falta una clave de configuración,
la aplicación podría no funcionar como se esperaba y no es fácil solucionar el error.
Afortunadamente, el entorno de Azure facilita la tarea con la característica
de transmisión de registros. En esta tarea, aprenderemos a consultar registros en
tiempo real y también entenderemos cómo utilizar la característica Diagnose and
solve problems.
[ 159 ]
Supervisar y solucionar problemas en los servicios sin servidor de Azure
[ 160 ]
Capítulo 6
[ 161 ]
Supervisar y solucionar problemas en los servicios sin servidor de Azure
4. Haga clic en Function Executions and Errors para consultar las excepciones
detalladas, como se ve en la siguiente captura de pantalla:
[ 162 ]
Capítulo 6
Como parte de la solución de problemas, si desea conocer más detalles sobre algún
error, debe buscar el campo Id en la sección Invocation details, como se muestra en
la siguiente captura de pantalla:
[ 163 ]
Supervisar y solucionar problemas en los servicios sin servidor de Azure
Preparación
Creamos una cuenta de Application Insights en la tarea Probar y validar la capacidad de
respuesta de las funciones de Azure utilizando Application Insights del Capítulo 5, Explorar
las herramientas de prueba para validar las funciones de Azure. Cree una cuenta, si aún no
lo ha hecho, siguiendo estos pasos:
[ 164 ]
Capítulo 6
Procedimiento...
Lleve a cabo los pasos siguientes:
2. Diríjase a las aplicaciones de función en Function apps para las que desea
habilitar la supervisión y vaya a Application settings.
3. Agregue una nueva clave con el nombre APPINSIGHTS_INSTRUMENTATIONKEY
e ingrese la clave que copió desde la cuenta de Application Insights, como se
muestra a continuación. Luego haga clic en Save para guardar los cambios.
[ 165 ]
Supervisar y solucionar problemas en los servicios sin servidor de Azure
[ 166 ]
Capítulo 6
Funcionamiento...
Hemos creado una cuenta de Application Insights. Una vez que integre la Clave
de instrumentación de Application Insights con las funciones de Azure, el tiempo
de ejecución se encargará de enviar datos de telemetría de manera asincrónica a su
cuenta de Application Insights.
Procedimiento...
Lleve a cabo los pasos siguientes:
[ 167 ]
Supervisar y solucionar problemas en los servicios sin servidor de Azure
[ 168 ]
Capítulo 6
Funcionamiento...
En el desencadenador HTTP, agregamos la instrucción log que muestra el valor
del parámetro name que brinda el usuario. Ejecutamos el desencadenador HTTP
varias veces. Después de unos minutos, haga clic en el botón Analytics en el botón
Application Insights, con lo cual se abrirá la ventana de análisis donde podrá
redactar consultas para ver los datos de telemetría emitidos por Azure Functions.
Puede hacer todo esto sin necesidad de escribir ningún código personalizado.
[ 169 ]
Supervisar y solucionar problemas en los servicios sin servidor de Azure
En este contexto, requests per hour es una métrica derivada y, si pretende crear
un nuevo informe dentro de Application Insights, debe brindarle información
a Application Insights sobre la nueva métrica derivada de manera periódica. Una
vez que proporcione los datos requeridos con frecuencia, Application Insights se
encargará de brindar informes para su análisis.
Usaremos las funciones de Azure que brindan a Application Insights una métrica
derivada denominada requests per hour:
[ 170 ]
Capítulo 6
Preparación
Siga estos requisitos previos:
Procedimiento...
Vamos a seguir estos pasos para insertar detalles de telemetría personalizados en
Application Insights Analytics.
[ 171 ]
Supervisar y solucionar problemas en los servicios sin servidor de Azure
3. También tenemos que crear una nueva clave de API. Como se muestra en
el paso anterior, haga clic en el botón Create API key para generar la nueva
clave de API, como se muestra en la siguiente captura de pantalla. Asigne
un nombre significativo, repase los datos en Read telemetry y haga clic en
Generate key:
[ 173 ]
Supervisar y solucionar problemas en los servicios sin servidor de Azure
4. Después de unos instantes, podrá ver y copiar la clave, como se ilustra aquí:
Vamos a utilizar esto para crear una nueva configuración de aplicación
llamada AI_APP_KEY en nuestra aplicación de función:
[ 174 ]
Capítulo 6
3. Cuando termine con la consulta, ejecútela haciendo clic en el botón Run para
ver la cantidad de registros, como se muestra en esta captura de pantalla:
[ 175 ]
Supervisar y solucionar problemas en los servicios sin servidor de Azure
[ 176 ]
Capítulo 6
2. Metrics Explorer sirve para hallar todos los análisis relacionados con las
diferentes métricas. En Metrics Explorer, haga clic en el botón Edit de
cualquier informe para configurar la métrica personalizada, como se observa
aquí (o haga clic en el botón Add chart en el extremo superior izquierdo de la
siguiente captura de pantalla):
[ 177 ]
Supervisar y solucionar problemas en los servicios sin servidor de Azure
[ 178 ]
Capítulo 6
Funcionamiento...
El proceso completo funciona de esta manera:
[ 179 ]
Supervisar y solucionar problemas en los servicios sin servidor de Azure
Azure Functions nos ofrece la capacidad de obtener todos los detalles básicos
utilizando una plantilla de función con código que se encarga de recuperar todos los
valores necesarios de Application Insights y un código "plumbing" para enmarcar
el cuerpo del correo electrónico y enviar el correo electrónico a través de SendGrid.
Veremos cómo hacerlo en esta tarea.
Preparación
Siga estos requisitos previos:
[ 180 ]
Capítulo 6
Procedimiento...
Lleve a cabo los pasos siguientes:
1. Cree una nueva función. Para ello, elija Monitoring en el menú desplegable
Scenario y seleccione la plantilla Application Insights scheduled
digest—C#, como se muestra aquí:
[ 181 ]
Supervisar y solucionar problemas en los servicios sin servidor de Azure
3. Luego haga clic en el botón Create que figura en el paso anterior para crear la
nueva función de Azure. La plantilla crea el código necesario para consultar
los datos de Application Insights y envía un correo electrónico a la persona
mencionada en To address de la captura de pantalla anterior.
[ 182 ]
Capítulo 6
Funcionamiento...
La función de Azure emplea la API de Application Insights para ejecutar todas las
consultas de Application Insights Analytics, recupera cada uno de los resultados,
enmarca el cuerpo del correo electrónico con todos los detalles e invoca la
API de SendGrid para enviar un correo electrónico a la cuenta de correo
electrónico configurada.
Consulte también
La tarea Enviar una notificación por correo electrónico al administrador de un sitio web
utilizando el servicio SendGrid del Capítulo 2, Trabajar con notificaciones utilizando los
servicios SendGrid y Twilio.
[ 183 ]
Supervisar y solucionar problemas en los servicios sin servidor de Azure
Preparación
Siga estos requisitos previos:
[ 184 ]
Capítulo 6
Debe utilizar su cuenta de trabajo para crear una cuenta de Power BI. En
el momento de la redacción de este libro, no es posible crear una cuenta
de Power BI con una dirección de correo electrónico personal como
Gmail, Yahoo y demás.
Asegúrese de seguir los pasos de la sección Configuring access keys de
la tarea Pushing custom telemetry details to analytics of Application
Insights para configurar estas claves de acceso: clave de instrumentación
de Application Insights, la ID de la aplicación y la clave de acceso
de la API.
Procedimiento...
Llevaremos a cabo los pasos siguientes para integrar Application Insights
y Power BI.
1. Si es la primera vez que utiliza el portal de Power BI, haga clic en Skip en la
página de bienvenida, como se muestra aquí:
[ 185 ]
Supervisar y solucionar problemas en los servicios sin servidor de Azure
3. En el paso New streaming dataset, elija API y haga clic en el botón Next,
como se muestra en la siguiente captura de pantalla:
[ 186 ]
Capítulo 6
[ 187 ]
Supervisar y solucionar problemas en los servicios sin servidor de Azure
[ 188 ]
Capítulo 6
8. En el panel vacío, haga clic en el botón Add tile para crear un mosaico nuevo.
Al hacer clic en Add tile, se abrirá otra ventana emergente, donde puede
seleccionar el origen de datos desde el cual se rellenará el mosaico:
[ 189 ]
Supervisar y solucionar problemas en los servicios sin servidor de Azure
10. Luego elija el tipo de visualización en Visualization Type (que en este caso
es Card) y seleccione los campos desde el origen de datos, como vemos en
esta captura de pantalla:
[ 190 ]
Capítulo 6
[ 191 ]
Supervisar y solucionar problemas en los servicios sin servidor de Azure
[ 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 en los servicios sin servidor de Azure
4. En esta captura de pantalla hay una secuencia de imágenes que muestran los
datos en tiempo real:
Funcionamiento...
Hemos creado lo siguiente en este orden específico:
[ 194 ]
Desarrollar aplicaciones
sin servidor fiables con
Durable Functions
En este capítulo, aprenderá a hacer lo siguiente:
Introducción
Durante las tareas de desarrollo de aplicaciones modernas que deben hospedarse en
la nube, conviene asegurarse de que las aplicaciones no tengan estado. Esta carencia
de estado es un factor esencial para desarrollar aplicaciones habilitadas para la
nube. Por ejemplo, conviene evitar conservar en el recurso aquellos datos específicos
de una instancia de máquina virtual (VM) aprovisionada en cualquier servicio
de Azure (por ejemplo, el servicio de aplicaciones, la API, etcétera). De lo contrario,
no podrá aprovechar algunos de los servicios, como la funcionalidad de escalado
automático, ya que el aprovisionamiento de instancias es dinámico. Si depende
de los recursos específicos de una máquina virtual, terminará enfrentando problemas
por comportamientos inesperados.
Por otro lado, la desventaja del enfoque mencionado más arriba es que termina
trabajando para identificar las posibles formas de conservar datos en diferentes
medios, dependiendo de la arquitectura de la aplicación.
[ 195 ]
Desarrollar aplicaciones sin servidor fiables con Durable Functions
Preparación
Cree una nueva aplicación de función, si aún no lo hizo. Verifique que la versión del
tiempo de ejecución sea ~2 en Application settings, como se muestra en esta captura
de pantalla:
[ 196 ]
Capítulo 7
Procedimiento...
Lleve a cabo los pasos siguientes:
[ 197 ]
Desarrollar aplicaciones sin servidor fiables con Durable Functions
[ 198 ]
Capítulo 7
Preparación
Antes de continuar, llevaremos a cabo los pasos siguientes:
Procedimiento...
Para desarrollar Durable Functions, tenemos que crear estas tres funciones:
[ 199 ]
Desarrollar aplicaciones sin servidor fiables con Durable Functions
using System.Net;
[ 200 ]
Capítulo 7
eventData);
return starter.CreateCheckStatusResponse(req,
instanceId);
}
[ 201 ]
Desarrollar aplicaciones sin servidor fiables con Durable Functions
"type": "orchestrationClient",
"direction": "in"
}
]
}
[ 202 ]
Capítulo 7
[ 203 ]
Desarrollar aplicaciones sin servidor fiables con Durable Functions
[ 204 ]
Capítulo 7
Funcionamiento
Echemos un vistazo al trabajo realizado en esta tarea:
[ 205 ]
Desarrollar aplicaciones sin servidor fiables con Durable Functions
Preparación
Descargue e instale lo siguiente, si aún no ha hecho:
Procedimiento...
Lleve a cabo los pasos siguientes:
[ 206 ]
Capítulo 7
[ 207 ]
Desarrollar aplicaciones sin servidor fiables con Durable Functions
También simularemos un caso de uso simple para entender cómo Durable Functions
se repara automáticamente cuando la máquina virtual en la que se hospeda se apaga
o se reinicia.
Preparación
Instale lo siguiente, si aún no ha hecho:
[ 208 ]
Capítulo 7
Procedimiento...
En esta tarea, vamos a crear los siguientes desencadenadores de funciones de Azure:
[ 209 ]
Desarrollar aplicaciones sin servidor fiables con Durable Functions
await Task.WhenAll(tasks);
int nTotalItems = tasks.Sum(item => item.Result);
return nTotalItems;
}
[ 210 ]
Capítulo 7
"direction": "in"
}
]
}
[ 211 ]
Desarrollar aplicaciones sin servidor fiables con Durable Functions
5. Después de hacer clic en el botón Send, recibirá una respuesta con la URL
de estado. Haga clic en statusQueryGetURi para ver el estado de la función.
Al hacer clic en el enlace statusQueryGetURi, se abrirá en una nueva
pestaña dentro de la herramienta Postman. Cuando la nueva pestaña se abra,
haga clic en el botón Send para consultar el progreso de la función.
6. Mientras la función se ejecuta, diríjase a la hoja Overview de la aplicación
de función y detenga el servicio haciendo clic en el botón Stop:
[ 212 ]
Capítulo 7
Funcionamiento...
Durable Functions nos permite desarrollar una ejecución fiable de nuestras
funciones, lo que significa que incluso si las VM se bloquean o reinician mientras
la función está en ejecución, estas se reanudan de forma automática a su estado
anterior. Esto es gracias a las características llamadas creación de puntos de
comprobación y reproducción, donde el historial de ejecución está almacenado
en la tabla de almacenamiento.
[ 213 ]
Importación masiva de datos
utilizando Azure Durable
Functions y Cosmos DB
En este capítulo, aprenderemos a realizar las siguientes tareas:
Introducción
En este capítulo, desarrollaremos un pequeño proyecto. Para ello, nos basaremos en
un caso de uso muy común que resuelve el problema comercial de compartir datos
en diferentes aplicaciones utilizando Excel. Utilizaremos Durable Functions, una
extensión de Azure Functions que le permite escribir flujos de trabajo escribiendo las
líneas mínimas de código.
[ 215 ]
Importación masiva de datos utilizando Azure Durable Functions y Cosmos DB
Estas son las dos características principales de Durable Functions que vamos
a utilizar en las tareas de este capítulo:
Problema comercial
En general, cada organización utilizará varias aplicaciones hospedadas en diversas
plataformas en distintos centros de datos (ya sea en la nube o en las instalaciones).
A menudo, nos encontramos con ciertos requisitos que exigen transmitir los datos de
una aplicación a otro sistema. Para exportar datos de una aplicación e importarlos
a otra, se suelen emplear hojas de cálculo de Excel (o, en algunos casos, archivos
JSON o XML).
[ 216 ]
Capítulo 8
[ 217 ]
Importación masiva de datos utilizando Azure Durable Functions y Cosmos DB
Preparación
Siga estos requisitos previos:
Procedimiento...
Lleve a cabo los pasos siguientes:
[ 218 ]
Capítulo 8
Install-Package Microsoft.Extensions.Configuration
Install-Package Microsoft.Extensions.Configuration.FileExtensions
Install-Package Microsoft.Extensions.Configuration.Json
3. Agregue los siguientes espacios de nombres en el extremo 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 próximo paso es desarrollar el código en una función llamada UploadBlob
para cargar el archivo de Excel en el contenedor de blobs que creamos. Para
hacerlo más simple, el código a continuación carga el archivo de Excel desde
una ubicación codificada de forma rígida. Sin embargo, en una aplicación
típica real, el usuario final es quien carga este archivo mediante una interfaz
web. Copie el código a continuación y péguelo 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”);
}
[ 219 ]
Importación masiva de datos utilizando Azure Durable Functions y Cosmos DB
[ 220 ]
Capítulo 8
Funcionamiento...
En esta tarea, creamos una aplicación de consola que utiliza ensamblados de
almacenamiento para cargar un blob (en este caso, es solo un archivo de Excel) en
el contenedor de blobs designado. Tenga en cuenta que cada vez que se ejecuta
la aplicación, se crea un nuevo archivo en el contenedor de blobs. Para cargar los
archivos de Excel con nombres únicos, anexamos un GUID.
[ 221 ]
Importación masiva de datos utilizando Azure Durable Functions y Cosmos DB
Preparación
Siga estos requisitos previos:
1. Agregue un nuevo proyecto denominado ExcelImport.DurableFunctions
a la solución existente. Para hacerlo, elija la plantilla Azure Functions, como
se muestra aquí:
[ 222 ]
Capítulo 8
[ 223 ]
Importación masiva de datos utilizando Azure Durable Functions y Cosmos DB
[ 224 ]
Capítulo 8
[ 225 ]
Importación masiva de datos utilizando Azure Durable Functions y Cosmos DB
Procedimiento...
En esta tarea, creamos una nueva aplicación de función a partir del tiempo de
ejecución de las funciones de Azure v2, que se basa en el marco .NET Core y se
puede ejecutar en todas las plataformas que admitan .NET Core (por ejemplo,
sistemas operativos Windows y Linux). También creamos un desencadenador
de blobs y lo configuramos para que se ejecute cuando se agrega un nuevo blob
mediante los ajustes de la cadena de conexión. Asimismo, creamos el archivo de
configuración local.setting.json para almacenar los valores de configuración
que se emplean en el desarrollo local. Después de crear el desencadenador de blobs,
ejecutamos la aplicación ExcelImport.Client para cargar un archivo y validar que
se esté ejecutando el desencadenador de blobs.
[ 226 ]
Capítulo 8
Procedimiento...
Lleve a cabo los pasos siguientes:
[ 227 ]
Importación masiva de datos utilizando Azure Durable Functions y Cosmos DB
[ 228 ]
Capítulo 8
[ 229 ]
Importación masiva de datos utilizando Azure Durable Functions y Cosmos DB
Funcionamiento...
Al comienzo de esta tarea, creamos la función de orquestación y luego modificamos
el desencadenador de blobs ExcelImportBlobTrigger agregando los enlaces de
salida OrchestratonClient para invocar la función de orquestador durable.
[ 230 ]
Capítulo 8
Preparación
En esta tarea, crearemos el desencadenador de actividad denominado función
ReadExcel_AT que lee los datos desde el blob almacenado en la cuenta de
almacenamiento. Este desencadenador de actividad realiza los siguientes trabajos:
[ 231 ]
Importación masiva de datos utilizando Azure Durable Functions y Cosmos DB
Procedimiento...
Si piensa en Durable Functions como un flujo de trabajo, la función de
desencadenador de actividad bien se podría tratar como un paso de flujo de trabajo
que obtiene algún tipo de entrada opcional, realiza alguna funcionalidad y devuelve
una salida opcional. Este es uno de los conceptos centrales de Azure Durable
Functions.
[ 232 ]
Capítulo 8
3. Por último, agregue una cadena de conexión (si aún no lo hizo) para la
cuenta de almacenamiento al archivo local.settings.json, como se
muestra aquí:
[ 233 ]
Importación masiva de datos utilizando Azure Durable Functions y Cosmos DB
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;
}
}
[ 234 ]
Capítulo 8
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;
}
[ 235 ]
Importación masiva de datos utilizando Azure Durable Functions y Cosmos DB
[ 236 ]
Capítulo 8
Además, con el fin de reducir los costos, se recomienda trabajar con una capacidad
mínima para cada servicio y aumentarla cuando sea necesario. La API de Cosmos
DB nos permite controlar la cantidad de RU en función de nuestras necesidades.
Debido a que 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 nivel mínimo.
Preparación
Siga estos requisitos previos:
1. Para crear una cuenta de Cosmos DB, siga las instrucciones mencionadas
en el artículo que se encuentra en https://docs.microsoft.com/en-us/
azure/cosmos-db/create-sql-api-dotnet.
[ 237 ]
Importación masiva de datos utilizando Azure Durable Functions y Cosmos DB
2. Cree una base de datos de Cosmos y una colección con almacenamiento fijo
y configure las unidades de solicitud en 400 por segundo, como se muestra
en la siguiente captura de pantalla:
[ 238 ]
Capítulo 8
Procedimiento...
Lleve a cabo los pasos siguientes:
using System.Linq;
using Microsoft.Azure.Documents;
using Microsoft.Azure.Documents.Client;
[ 239 ]
Importación masiva de datos utilizando Azure Durable Functions y Cosmos DB
3. Cree una nueva cadena de conexión para Cosmos DB, como se muestra en
esta captura de pantalla. Puede copiar la conexión desde la hoja Keys de la
cuenta de Cosmos DB:
[ 240 ]
Capítulo 8
Procedimiento...
Lleve a cabo los pasos siguientes:
[ 241 ]
Importación masiva de datos utilizando Azure Durable Functions y Cosmos DB
[ 242 ]
Implementar procedimientos
recomendados para
Azure Functions
En este capítulo, aprenderá algunos de los procedimientos recomendados que se
pueden seguir al trabajar con Azure Functions, como los siguientes:
[ 243 ]
Implementar procedimientos recomendados para Azure Functions
Preparación
Estos son los pasos necesarios:
Procedimiento...
Lleve a cabo los pasos siguientes:
[ 245 ]
Implementar procedimientos recomendados para Azure Functions
5. Vamos a ejecutar la función desde la pestaña Test del portal con este JSON
de solicitud de entrada:
{
"devices":
[
{
"type": "laptop",
"brand":"lenovo",
"model":"T440"
},
{
"type": "mobile",
"brand":"Mi",
"model":"Red Mi 4"
}
]
}
[ 246 ]
Capítulo 9
Funcionamiento...
Creamos una nueva función HTTP que posee un parámetro del tipo
IAsyncCollector<string>, que sirve para almacenar varios mensajes en un
servicio de cola de una sola vez y de forma asincrónica. Este enfoque, que consiste en
almacenar varios elementos de forma asincrónica, reducirá la carga en las instancias.
Implementación de aplicaciones
defensivas con Azure Functions
y desencadenadores de cola
Para muchas aplicaciones, incluso después de realizar varias pruebas de diferentes
entornos, es posible que aún existan motivos imprevistos por los que la aplicación
puede fallar. Los desarrolladores y arquitectos no pueden predecir todas las
entradas imprevistas durante la vida útil de la aplicación que empleen los usuarios
empresariales o los usuarios finales generales. Por lo tanto, es una buena forma de
asegurarse de que la aplicación le avise si hay errores o problemas inesperados con
las aplicaciones.
[ 247 ]
Implementar procedimientos recomendados para Azure Functions
En esta tarea, aprenderá cómo Azure Functions nos ayuda a controlar este tipo
de problemas con un código mínimo.
Preparación
Estos son los pasos necesarios:
1. Cree una cuenta de almacenamiento utilizando el portal de Azure, si aún
no ha hecho.
2. Instale el explorador de Azure Storage desde http://storageexplorer.com/
si aún no lo hizo.
Procedimiento...
En esta tarea, haremos lo siguiente:
• Desarrollar una aplicación de consola mediante C#, que se conecta con la
cuenta de almacenamiento y crea mensajes de la cola en la cola denominada
myqueuemessages.
• Crear un desencadenador de cola para la función de Azure llamado
ProcessData que se active cada vez que se agregue un mensaje nuevo
a la cola denominada myqueuemessages.
[ 249 ]
Implementar procedimientos recomendados para Azure Functions
[ 250 ]
Capítulo 9
Funcionamiento...
Creamos una aplicación de consola que genera mensajes en Azure Queue Storage
y también desarrollamos un desencadenador de cola capaz de leer los mensajes de la
cola. Como parte de la simulación de un error inesperado, aparece un error si el valor
del contenido del mensaje de cola es mayor a 50.
[ 251 ]
Implementar procedimientos recomendados para Azure Functions
Preparación
Lleve a cabo los pasos siguientes:
1. Cree el espacio de nombres Event Hubs. Para hacerlo, desplácese hasta
Internet of Things y elija Event Hubs.
2. Una vez que el espacio de nombre Event Hubs esté creado, navegue hasta
la pestaña Overview y haga clic en el ícono Event Hub para crear un nuevo
parámetro Event Hub.
3. De forma predeterminada, el sistema crea un grupo de consumidores en
Consumer Group denominado $Default, que utilizaremos en esta tarea.
Procedimiento...
En esta tarea, haremos lo siguiente:
• Crear un desencadenador de Event Hub para una función de Azure.
• Desarrollar una aplicación de consola que simule datos de la Internet de las
Cosas (IoT).
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();
}
}
}
[ 254 ]
Capítulo 9
class Program
{
static void Main(string[] args)
{
EventHubHelper.GenerateEventHubMessages().Wait();
}
}
}
[ 255 ]
Implementar procedimientos recomendados para Azure Functions
Obtendrá todas las ventajas de la arquitectura sin servidor solo cuando cree
la aplicación de función utilizando el plan de consumo. Sin embargo, una de
las preocupaciones que los desarrolladores informan sobre el uso del plan de
consumo es algo llamado "arranque en frío", que se refiere a la puesta en marcha
de una función de Azure para atender las solicitudes cuando no ha habido
solicitudes durante bastante tiempo. Puede obtener más información sobre este
tema en https://blogs.msdn.microsoft.com/appserviceteam/2018/02/07/
understanding-serverless-cold-start/.
En esta tarea, aprenderemos una técnica para mantener la instancia siempre activa
de modo que pueda servir a todas las solicitudes correctamente.
Preparación
Con el fin de completar esta tarea, necesitamos tener una aplicación de función con
lo siguiente:
Si ya comprendió con claridad qué es un arranque en frío, sabe que no tiene que
preocuparse si su aplicación tiene tráfico habitualmente durante el día. Por lo
tanto, si podemos asegurarnos de que la aplicación tenga tráfico durante todo el
día, la instancia de la función de Azure no se desaprovisionará y no habrá ninguna
inquietud sobre el plan de consumo.
[ 256 ]
Capítulo 9
Procedimiento...
En esta tarea, crearemos un desencadenador de temporizador que simule el tráfico
al desencadenador HTTP, haciendo que la aplicación de función esté activa todo el
tiempo y las instancias sin servidor estén siempre en el estado aprovisionado.
[ 257 ]
Implementar procedimientos recomendados para Azure Functions
Consulte también
Consulte la tarea Implementación de Azure Functions utilizando Run From Package del
Capítulo 10, Configurar aplicaciones sin servidor en el entorno de producción.
Preparación
Supongo que ya sabe crear una función de desencadenador HTTP. Descargue la
herramienta Postman desde https://www.getpostman.com/. La herramienta
Postman se utiliza para enviar solicitudes de HTTP. También se puede utilizar
cualquier herramienta o aplicación que envíe encabezados y solicitudes de HTTP.
[ 258 ]
Capítulo 9
Procedimiento...
Lleve a cabo los pasos siguientes:
[ 259 ]
Implementar procedimientos recomendados para Azure Functions
Funcionamiento...
Cuando realiza una solicitud a través de Postman o de cualquier otra herramienta
o aplicación capaz de enviar solicitudes de HTTP, la aplicación web de Azure App
Service subyacente recibe la solicitud (tenga en cuenta que las funciones de Azure
se generan sobre App Services) y, primero, comprueba la presencia del código de
nombre del encabezado en la colección de cadenas de consulta o en el cuerpo de la
solicitud. Si lo encuentra, la herramienta 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
tiempo de ejecución la procese. De lo contrario, se produce un error con el mensaje
401 Unauthorized.
[ 260 ]
Capítulo 9
En esta tarea, aprenderá a trabajar con claves de función dentro de Azure Functions.
Procedimiento...
Azure es compatible con las siguientes claves, que se pueden utilizar para controlar
el acceso a las funciones de Azure:
Vaya a la pestaña Manage de Azure Functions para ver y administrar todas las
claves relacionadas con la función.
Según la instrucción anterior, creé las claves para las siguientes aplicaciones:
De la misma manera, puede crear diferentes claves para cualquier otra aplicación
(por ejemplo, una aplicación de IoT) en función de sus requisitos.
[ 261 ]
Implementar procedimientos recomendados para Azure Functions
La idea de tener diferentes claves para la misma función es controlar los permisos
de acceso para las distintas aplicaciones que utilizan las funciones. Por ejemplo, si
desea revocar los permisos para una aplicación y no para todas, basta con eliminar
(o revocar) esa clave. De ese modo, no afectará a las demás aplicaciones que utilizan
la misma función.
Sin embargo, las claves de función presentan una desventaja. Si está desarrollando
una aplicación donde necesita tener varias funciones y cada función está siendo
utilizada por muchas aplicaciones, entonces terminará teniendo muchas claves.
Administrar estas claves y documentarlas sería una pesadilla. En ese caso,
puede optar por claves de host, como las que se explican a continuación.
[ 262 ]
Capítulo 9
Al igual que con las claves de función, también puede crear varias
claves de host si diversas aplicaciones utilizan sus aplicaciones
de función. Puede emplear diferentes claves para controlar el acceso
de cada aplicación individual a cada una de las aplicaciones de función.
Asimismo, puede crear varias claves de host siguiendo los mismos
pasos que para crear las claves de función normales.
[ 263 ]
Implementar procedimientos recomendados para Azure Functions
Aquí se incluye una tabla con más información sobre las claves:
Preparación
En esta tarea, para simplificar las cosas, utilizaremos el AD predeterminado que
se crea al crear una cuenta de Azure. Sin embargo, en los entornos de producción
reales, es posible que ya tenga un AD que necesita integrarse. Recomiendo consultar
este artículo: https://docs.microsoft.com/azure/active-directory-b2c/
active-directory-b2c-tutorials-web-app.
Procedimiento
En esta tarea, haremos lo siguiente:
[ 265 ]
Implementar procedimientos recomendados para Azure Functions
Eso es todo. Sin escribir una sola línea de código, terminamos de configurar una
instancia de Azure AD que actúa como un nivel de seguridad y permite el acceso
solo a los usuarios autenticados. En otras palabras,habilitamos OAuth para nuestra
aplicación de función de back-end con Azure AD. Ahora realizaremos una prueba
rápida accediendo a cualquiera de los desencadenadores HTTP que tiene en la
aplicación de función. Para hacer esto, usé Postman. Obtendrá un error pidiéndole
que inicie sesión.
Con las configuraciones actuales, ninguna de las aplicaciones cliente externas podrá
acceder a nuestra API de back-end. Para brindar acceso, tenemos que seguir estos
pasos:
Registre todas las aplicaciones cliente en Azure AD (en este ejemplo, vamos a hacer
un registro para la aplicación Postman).
[ 266 ]
Capítulo 9
[ 267 ]
Implementar procedimientos recomendados para Azure Functions
[ 268 ]
Capítulo 9
2. Una vez que tenga toda esa información, pase todos los parámetros y realice
una llamada a un inquilino de Azure AD, que devuelve el token de portador
de la siguiente manera:
[ 270 ]
Capítulo 9
En esta tarea, aprenderemos a restringir el acceso a la API de los clientes solo una vez
por minuto para una dirección IP determinada. Estos son los pasos de alto nivel que
seguiremos:
[ 271 ]
Implementar procedimientos recomendados para Azure Functions
Preparación
Para empezar, tenemos que crear un servicio Azure API Management a través de
estos pasos:
[ 272 ]
Capítulo 9
Procedimiento...
Para aprovechar las capacidades de API Management, es preciso integrar los puntos
de conexión de servicio (en este caso, los desencadenadores HTTP que creamos) con
el servicio API Management. En esta sección se detallan los pasos necesarios para la
integración. Comencemos a integrar ambos servicios.
[ 273 ]
Implementar procedimientos recomendados para Azure Functions
[ 274 ]
Capítulo 9
4. Una vez que realice todos los pasos anteriores, aparecerá la ventana
emergente Create from Function App que se incluye a continuación.
Revise los detalles y haga clic en el botón Create:
[ 275 ]
Implementar procedimientos recomendados para Azure Functions
[ 276 ]
Capítulo 9
[ 277 ]
Implementar procedimientos recomendados para Azure Functions
[ 278 ]
Capítulo 9
Funcionamiento...
En esta tarea, creamos una instancia de Azure API Management e integramos
una aplicación de función de Azure para aprovechar las características de API
Management. Una vez integrados, creamos una directiva de entrada que restringe
a los clientes a solo una llamada por minuto desde una dirección IP determinada. En
este diagrama de alto nivel que ilustra el proceso completo:
[ 279 ]
Implementar procedimientos recomendados para Azure Functions
Supongamos que, por alguna razón, cambia la contraseña de una cuenta, lo que
significa que las aplicaciones que utilicen esa cuenta no podrán obtener acceso.
Como desarrollador, ¿no sería bueno tener una instalación en la que no tenga
que preocuparse por las credenciales y, en su lugar, el marco se encargue de la
autenticación? En esta tarea, aprenderemos a obtener acceso a una instancia de SQL
Database desde una función de Azure sin proporcionar un ID de usuario ni una
contraseña utilizando una característica denominada Managed Service Identity.
Preparación
Para esta tarea, es preciso crear funciones de Azure (con el tiempo de ejecución de la
v1) y la base de datos de SQL en el mismo grupo de recursos. Si no las creó, hágalo
y regrese a esta tarea para continuar. En esta tarea, llevaremos a cabo los pasos
siguientes:
1. Crear una aplicación de función utilizando Visual Studio 2017 con el tiempo
de ejecución de la v1.
2. Crear un servidor SQL Server lógico y una base de datos SQL.
3. Habilitar Managed Service Identity desde el portal.
4. Recuperar información de Managed Service Identity utilizando la CLI de
Azure.
5. Permitir el acceso de SQL Server a la nueva identidad de servicio
administrada.
6. Ejecutar el desencadenador HTTP y realizar una prueba.
[ 280 ]
Capítulo 9
Procedimiento...
Vamos a realizar esta tarea siguiendo estos pasos:
1. Crear una aplicación de función utilizando Visual Studio 2017 con el tiempo
de ejecución de la v1.
2. Crear un servidor SQL Server lógico y una base de datos SQL.
3. Habilitar Managed Service Identity.
1. Para crear una nueva aplicación de función, elija el tiempo de ejecución de las
funciones de Azure v1.
2. Una vez creado el desencadenador HTTP, sustituya 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.
[ 281 ]
Implementar procedimientos recomendados para Azure Functions
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 que copié en el Capítulo 3, Integración perfecta de Azure
Functions con los servicios de Azure, con los cambios especificados más abajo, pero la
cadena de conexión no tiene detalles de ID de usuario ni contraseña.
[ 283 ]
Implementar procedimientos recomendados para Azure Functions
[ 284 ]
Capítulo 9
[ 285 ]
Implementar procedimientos recomendados para Azure Functions
[ 286 ]
Capítulo 9
Consulte también
Consulte la tarea Interacciones de Azure SQL Database con Azure Functions del Capítulo 3,
Integración perfecta de Azure Functions con los servicios de Azure.
[ 287 ]
Implementar procedimientos recomendados para Azure Functions
Procedimiento...
Lleve a cabo los pasos siguientes:
1. Cree una nueva aplicación Class Library utilizando Visual Studio. En este
caso, usé Visual Studio 2017:
[ 288 ]
Capítulo 9
5. Ahora cree una nueva carpeta Bin haciendo clic derecho en el área vacía
debajo de los archivos ubicados en WWWROOT.
6. Después de hacer clic en el elemento New Folder en la pantalla a la que llegó,
aparece un nuevo cuadro de texto donde tiene que especificar el nombre Bin.
7. A continuación, haga clic derecho en la carpeta Bin y seleccione la opción
Upload Files para cargar el archivo .dll que creó en Visual Studio.
8. Después de cargar el archivo .dll en la carpeta Bin, aparecerá esto:
[ 289 ]
Implementar procedimientos recomendados para Azure Functions
13. Repita los mismos pasos para agregar la referencia y el espacio de nombres
de la biblioteca de utilidades, incluso en la segunda función de Azure,
ReusableMethodCaller2. Si realizó los cambios de forma correcta, debiera
aparecer algo como lo siguiente:
Funcionamiento...
Acabamos de crear un archivo .dll, el cual contiene el código reutilizable que
se puede utilizar en cualquiera de las funciones de Azure que requieren la
funcionalidad disponible mediante el archivo .dll.
[ 290 ]
Capítulo 9
Preparación
Antes de avanzar, lleve a cabo los pasos siguientes:
[ 291 ]
Implementar procedimientos recomendados para Azure Functions
Procedimiento...
Lleve a cabo los pasos siguientes:
[ 292 ]
Capítulo 9
using System;
public static void Run(User myQueueItem, ILogger log)
{
[ 293 ]
Implementar procedimientos recomendados para Azure Functions
Funcionamiento...
Acabamos de desarrollar una nueva función de cola que se desencadena cuando
se agrega un nuevo mensaje a la cola. También creamos un nuevo mensaje de cola
con toda la información necesaria para crear el usuario. Puede seguir reutilizando
el código de la función de Azure para pasar el objeto de usuario (en este caso,
myQueueItem) a la clase de la capa de base de datos, capaz de insertar la información
en una base de datos o en cualquier otro medio persistente.
[ 294 ]
Configurar aplicaciones
sin servidor en el entorno
de producción
En este capítulo, aprenderemos a realizar las siguientes tareas:
Introducción
Estuvimos analizando cada una de las diferentes características de Azure Functions
que ayudan a los desarrolladores a crear aplicaciones de back-end con rapidez. Este
capítulo se centra en las configuraciones que se necesitan hacer en un entorno de no
desarrollo (como staging, UAT y producción).
[ 295 ]
Configurar aplicaciones sin servidor en el entorno de producción
Con Run From Package, podemos cambiar la ubicación predeterminada a una cuenta
de almacenamiento externa.
Preparación
Para completar esta receta, necesitamos lo siguiente:
Procedimiento...
Lleve a cabo los pasos siguientes:
[ 298 ]
Capítulo 10
Funcionamiento...
Cuando el tiempo de ejecución de la función de Azure encuentra una configuración
de aplicación con el nombre WEBSITE_RUN_FROM_PACKAGE, entiende que debe buscar
los paquetes en la cuenta de almacenamiento. Por lo tanto, el tiempo de ejecución
descarga los archivos sobre la marcha y los utiliza para iniciar la aplicación.
Preparación
Antes de empezar a crear las plantillas de ARM, necesitamos comprender los demás
servicios de Azure de los que depende la función de Azure. Los siguientes servicios
se crean automáticamente al crear una aplicación de función:
[ 299 ]
Configurar aplicaciones sin servidor en el entorno de producción
Procedimiento...
Hasta ahora, sabe que al crear funciones de Azure tenemos que asegurarnos
de también incluir un plan de App Service y una cuenta de almacenamiento.
Comencemos a crear la plantilla de ARM con Visual Studio:
1. Cree un nuevo proyecto eligiendo Visual C# | Cloud y luego elija Azure
Resource Group:
[ 300 ]
Capítulo 10
[ 301 ]
Configurar aplicaciones sin servidor en el entorno de producción
[ 302 ]
Capítulo 10
Configuración de un dominio
personalizado en Azure Functions
A esta altura, si observa la dirección URL predeterminada en el formato
functionappname.azurewebsites.net de la aplicación de función de Azure,, quizá
se pregunte si es posible tener un dominio independiente en lugar del dominio
predeterminado, ya que los clientes pueden tener sus propios dominios. Sí, es posible
configurar un dominio personalizado para las aplicaciones de función. En esta tarea,
aprenderá a configurarlo.
[ 303 ]
Configurar aplicaciones sin servidor en el entorno de producción
Preparación
Cree un dominio con cualquiera de los registradores de dominios. También puede
comprar un dominio directamente desde el portal empleando el botón Buy Domain
ubicado en la hoja Custom Domains:
Una vez que el dominio esté listo, cree los siguientes registros DNS con el registrador
de dominios:
• Registro A
• Registro CName
Procedimiento...
Lleve a cabo los pasos siguientes:
[ 304 ]
Capítulo 10
[ 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
Más allá del uso que le demos al valor de configuración, es importante almacenarlo
en un lugar accesible para su aplicación.
Preparación
Cree una función de Azure con el tiempo de ejecución de la función v2, si aún no lo
hizo. Voy a utilizar la aplicación de función que creamos en el Capítulo 4, Comprender
la experiencia integrada del desarrollador de Visual Studio Tools.
Procedimiento...
En esta tarea, abordaremos algunas maneras de acceder a los valores de
configuración.
[ 308 ]
Capítulo 10
[ 309 ]
Configurar aplicaciones sin servidor en el entorno de producción
5. Para ejecutar la función, haga clic en el botón Run, con lo cual se registra
la salida en la ventana Output:
[ 310 ]
Capítulo 10
Creación y generación
de especificaciones de API abiertas
utilizando Swagger
El desarrollador de API web de back-end tiene la responsabilidad de proporcionar
la documentación adecuada a los desarrolladores de aplicaciones de front-end para
que puedan consumir las API sin ningún problema. Para consumir cualquier API,
es preciso comprender dos cosas mínimas:
[ 311 ]
Configurar aplicaciones sin servidor en el entorno de producción
Preparación
Cree una función y uno o varios desencadenadores HTTP. Para simplificar la tarea,
creé una aplicación de función y un desencadenador HTTP, que solo acepta métodos
Get.
Procedimiento...
Lleve a cabo los pasos siguientes:
[ 312 ]
Capítulo 10
[ 313 ]
Configurar aplicaciones sin servidor en el entorno de producción
4. Con esto solo se crea una plantilla para la definición de API abierta.
El desarrollador de la nube debe rellenar la plantilla en función de las API
que desarrolló. Debería verse algo como esto. Vamos a cambiar la plantilla
en un momento:
[ 314 ]
Capítulo 10
8. También nos permite realizar algunas pruebas. Haga clic en el botón Try
this operation que aparece en la captura de pantalla anterior. Se abrirá una
ventana donde se pueden especificar datos de entrada:
[ 315 ]
Configurar aplicaciones sin servidor en el entorno de producción
9. Ingresé Praveen Kumar como valor para el nombre, hice clic en el botón
Send Request y obtuve los siguientes datos de salida:
Preparación
En esta tarea, vamos a implementar la siguiente arquitectura:
[ 316 ]
Capítulo 10
Procedimiento...
En esta tarea, vamos a seguir estos pasos:
[ 317 ]
Configurar aplicaciones sin servidor en el entorno de producción
Crear microservicios
Lleve a cabo los pasos siguientes:
Nombre del
Mensaje de salida
desencadenador HTTP
Hello <<Name>> - Welcome to the Men
Men-HttpTrigger
Microservice
Hello <<Name>> - Welcome to the
Women-HttpTrigger
Women Microservice
Hello <<Name>> - Welcome to the
Kids-HttpTrigger
Kids Microservice
[ 318 ]
Capítulo 10
[ 319 ]
Configurar aplicaciones sin servidor en el entorno de producción
3. Cree los proxies para mujeres y niños. Estos son los detalles de los tres
proxies. Es posible que las direcciones URL de back-end (de las aplicaciones
de función) sean diferentes en su caso:
4. Una vez que cree los tres proxies, la lista se parecerá a esta:
• https://azurefunctioncookbook-gateway.azurewebsites.net/Men
• https://azurefunctioncookbook-gateway.azurewebsites.net/Women
• https://azurefunctioncookbook-gateway.azurewebsites.net/Kids
[ 320 ]
Capítulo 10
• Hombres:
• Mujeres:
• Niños:
Observe las URL de las tres capturas de pantalla. Se dará cuenta de que funcionan
desde una única aplicación con diferentes rutas. Sin embargo, son tres microservicios
diferentes que se pueden administrar por separado.
[ 321 ]
Configurar aplicaciones sin servidor en el entorno de producción
Consulte también
• La tarea Controlar el acceso a las funciones de Azure utilizando claves de función
en el Capítulo 9, Implementar procedimientos recomendados para Azure Functions
• La tarea Proteger las funciones de Azure utilizando Azure AD en el Capítulo 9,
Implementar procedimientos recomendados para Azure Functions
• La tarea Configurar la limitación de Azure Functions utilizando API Management
en el Capítulo 9, Implementar procedimientos recomendados para Azure Functions
En el entorno de PaaS de Azure, con Azure App Services, también puede tener
archivos Web.Config que funcionan de la misma manera que en el entorno local
tradicional. Sin embargo, Azure App Service nos proporciona una característica
adicional en términos de configuración de la aplicación, donde puede configurar
estas opciones (ya sea manualmente o a través de plantillas de ARM) que se
almacenan en un formato cifrado. Si tiene acceso, puede verlas como texto normal
en el portal.
[ 322 ]
Capítulo 10
Preparación
Lleve a cabo los pasos siguientes:
[ 323 ]
Configurar aplicaciones sin servidor en el entorno de producción
Procedimiento...
Lleve a cabo los pasos siguientes:
2. Con Resource Explorer abierto, puede atravesar todos los elementos internos
de un servicio determinado:
[ 324 ]
Capítulo 10
[ 325 ]
Configurar aplicaciones sin servidor en el entorno de producción
6. Haga clic en el botón Edit y pegue el contenido que copió antes. Después
de repasar las configuraciones, haga clic en PUT, que se muestra en la
captura de pantalla anterior.
[ 326 ]
Capítulo 10
Allí puede ver todas las configuraciones de la aplicación juntas que creamos
en Resource Explorer.
[ 327 ]
Implementar y facilitar
la integración continua
utilizando Azure DevOps
En este capítulo, aprenderá a hacer lo siguiente:
Introducción
Como profesional de software, es posible que ya conozca las distintas metodologías
de desarrollo de software que aplican las personas. Más allá de la metodología que se
emplee, siempre hay varios entornos, como desarrollo, almacenamiento provisional
y producción, donde se debe seguir el ciclo de vida de la aplicación con estas etapas
fundamentales relacionadas con el desarrollo:
[ 329 ]
Implementar y facilitar la integración continua utilizando Azure DevOps
Tenga en cuenta que para hacerlo más simple, se excluyeron las etapas
iniciales, como la reunión de requisitos, la planificación, el diseño
y la arquitectura, para hacer hincapié en las etapas relevantes para este
capítulo.
Con el fin de agilizar y automatizar algunos de los pasos mencionados antes, en este
capítulo, analizaremos algunas de las técnicas populares que sigue la industria para
entregar software rápidamente, con una infraestructura mínima.
Requisitos previos
Cree lo siguiente, si aún lo hizo:
[ 330 ]
Capítulo 11
[ 331 ]
Implementar y facilitar la integración continua utilizando Azure DevOps
Preparación
Siga estos requisitos previos:
[ 332 ]
Capítulo 11
Procedimiento...
Lleve a cabo los pasos siguientes:
[ 333 ]
Implementar y facilitar la integración continua utilizando Azure DevOps
[ 334 ]
Capítulo 11
[ 335 ]
Implementar y facilitar la integración continua utilizando Azure DevOps
8. Una vez que revise cada uno de los valores en todos los campos, haga clic en
Save, como se muestra en la siguiente captura de pantalla, y vuelva
a hacer clic en Save en la ventana emergente para guardar la definición de
compilación:
[ 336 ]
Capítulo 11
Funcionamiento...
Una definición de compilación es solo un plano técnico de las tareas necesarias
para compilar una aplicación de software. En esta tarea, utilizamos una plantilla
predeterminada para crear la definición de compilación. También podemos elegir
una plantilla en blanco y crear la definición eligiendo las tareas disponibles en Azure
DevOps.
[ 337 ]
Implementar y facilitar la integración continua utilizando Azure DevOps
Preparación
Antes de comenzar, asegúrese de que realizó lo siguiente:
[ 338 ]
Capítulo 11
Procedimiento...
Lleve a cabo los pasos siguientes:
[ 339 ]
Implementar y facilitar la integración continua utilizando Azure DevOps
4. Para iniciar el proceso, haga clic en build ID (en este caso, 20181025.1). El
sistema aguardará unos segundos para que un agente disponible lo inicie.
5. Después de un momento, se inicia el proceso de compilación y, en tan solo
unos minutos, la compilación se completa. Puede revisar los pasos de la
compilación en los registros, como se muestra aquí. Por ahora, descarte la
advertencia que aparece para Test Assemblies. Lo solucionaremos en la
tarea Integración continua: ejecutar casos de prueba unitaria en la canalización más
adelante en este capítulo:
[ 340 ]
Capítulo 11
Configuración y desencadenamiento de
una compilación automatizada
Para la mayoría de las aplicaciones, no tiene sentido realizar compilaciones manuales
en Azure DevOps. Sí lo tendría si pudiéramos configurar la integración continua
(CI) automatizando el proceso para desencadenar la compilación para cada una de
las comprobaciones o confirmaciones que realicen los desarrolladores.
[ 341 ]
Implementar y facilitar la integración continua utilizando Azure DevOps
Procedimiento...
Lleve a cabo los pasos siguientes:
[ 342 ]
Capítulo 11
[ 343 ]
Implementar y facilitar la integración continua utilizando Azure DevOps
Funcionamiento...
Estos son los pasos que se siguieron en esta tarea:
[ 344 ]
Capítulo 11
Haga clic en Build Changes en el paso anterior para iniciar la compilación en Visual
Studio. Apenas se complete la compilación en Visual Studio, el código se comprobará
en Azure DevOps y, a continuación, se activará una nueva compilación de forma
automática, como se muestra aquí:
[ 345 ]
Implementar y facilitar la integración continua utilizando Azure DevOps
Procedimiento...
Lleve a cabo los pasos siguientes:
[ 346 ]
Capítulo 11
°° Pase por alto todos los archivos .dll en la carpeta obj, ya que
nuestro objetivo es trabajar únicamente en los archivos .dll situados
en la carpeta release.
4. Eso es todo. Ahora vamos a poner en cola la compilación. Para hacerlo,
haga clic en el botón Queue después de guardar los cambios. Luego de unos
minutos, la canalización de compilación se pasa sin advertencias, como se
muestra en la siguiente captura de pantalla:
[ 347 ]
Implementar y facilitar la integración continua utilizando Azure DevOps
5. Aquí está el resumen de los casos de prueba. Puede ver el gráfico con el
porcentaje de los casos de prueba superados y no superados:
[ 348 ]
Capítulo 11
Preparación
Usé el nuevo editor de definiciones de versión para visualizar las canalizaciones
de implementación. El editor de definiciones de versión aún continúa en versión
preliminar. Para cuando lea esto, si todavía sigue en versión preliminar, habilítelo
haciendo clic en la imagen de perfil y luego en el enlace Preview features, como se
muestra aquí:
[ 349 ]
Implementar y facilitar la integración continua utilizando Azure DevOps
Procedimiento...
Lleve a cabo los pasos siguientes:
[ 350 ]
Capítulo 11
[ 351 ]
Implementar y facilitar la integración continua utilizando Azure DevOps
5. Repase todos los valores en la página y haga clic en el botón Add para
agregar el artefacto.
6. El siguiente paso es configurar las etapas donde el paquete debe publicarse.
Haga clic en el enlace 1 phase, 1 task, como se ilustra aquí: Además, cambie
el nombre de la definición de la versión a release-def-stg:
[ 352 ]
Capítulo 11
[ 353 ]
Implementar y facilitar la integración continua utilizando Azure DevOps
9. Haga clic en el botón Save para guardar los cambios. Ahora utilice esta
definición de versión e intente crear la nueva versión. Para hacerlo, haga clic
en Create release, como vemos aquí:
[ 354 ]
Capítulo 11
[ 355 ]
Implementar y facilitar la integración continua utilizando Azure DevOps
12. Ahora se le pedirá que revise los artefactos asociados. Cuando termine, haga
clic en el botón Deploy, como vemos aquí:
[ 356 ]
Capítulo 11
[ 357 ]
Implementar y facilitar la integración continua utilizando Azure DevOps
14. Haga clic en los enlaces In Progress que aparecen en la captura de pantalla
anterior para consultar el progreso. El proceso se ejecutó con éxito, como
vemos aquí:
Funcionamiento...
En la pestaña Pipeline, creamos artefactos y un entorno llamado Staging, y los
vinculamos.
También configuramos el entorno para que Azure App Service se relacione con las
funciones de Azure que creamos en el Capítulo 4, Comprender la experiencia integrada
del desarrollador de Visual Studio Tools para Azure Functions.
[ 358 ]
Capítulo 11
Consulte también
La tarea Implementar la aplicación de función de Azure en la nube de Azure utilizando
Visual Studio del Capítulo 4, Comprender la experiencia integrada del desarrollador de
Visual Studio Tools para Azure Functions.
[ 359 ]
Implementar y facilitar la integración continua utilizando Azure DevOps
Desencadenamiento de la versión
automáticamente
En esta tarea, aprenderá a configurar la implementación continua para un entorno.
En el proyecto, puede configurar dev/staging o cualquier otro entorno de
preproducción, además de la implementación continua para agilizar el proceso de
implementación.
En general, no se recomienda configurar la implementación continua para un
entorno de producción. Sin embargo, esto depende de varios factores y requisitos.
Tenga cuidado y piense en varios escenarios antes de configurar la implementación
continua para el entorno de producción.
Preparación
Descargue e instale la herramienta Postman, si aún no lo hizo.
Procedimiento...
Lleve a cabo los pasos siguientes:
1. Las versiones están configuradas, de manera predeterminada, para insertarse
manualmente. Vamos a configurar la implementación continua. Regrese
a la pestaña Pipeline y haga clic en el desencadenador de implementación
continua, como se muestra aquí:
[ 360 ]
Capítulo 11
[ 361 ]
Implementar y facilitar la integración continua utilizando Azure DevOps
Funcionamiento...
En la pestaña Pipeline, habilitamos el desencadenador de implementación
continua.
Cada vez que se desencadena una compilación asociada con
AzureServerlessCookBook-C# Function-CI, la versión Azure Serverless
Cookbook Release se desencadena automáticamente para implementar la
compilación más reciente en el entorno designado. También vimos cómo funciona
la versión automática haciendo un cambio en el código en Visual Studio.
Frederik Vos
ISBN: 978-1-78913-096-6
ff Comprenda por qué Azure es la solución ideal para sus cargas de trabajo
de open source.
ff Domine las habilidades esenciales de Linux y aprenda a manejar el entorno
de Linux.
ff Implemente Linux en un entorno de Azure.
ff Utilice la administración de configuración para administrar Linux en Azure.
ff Administre contenedores en un entorno de Azure.
ff Mejore la seguridad de Linux y utilice los sistemas de administración
de identidades de Azure.
ff Automatice la implementación con Azure Resource Manager (ARM)
y PowerShell.
ff Emplee Ansible para administrar instancias de Linux en un entorno de nube
de Azure.
364
Otros libros que puede disfrutar
365