En este capítulo, abordaremos las siguientes recetas:
- Usar Cognitive Services para identificar caras en imágenes
- Interacciones de Azure SQL Database mediante Azure Functions
- Supervisar tweets a través de Logic Apps y notificar a los usuarios publicaciones de tweets de usuarios populares
- Integrar Logic Apps con funciones sin servidor
- Auditorías de datos de Cosmos DB mediante desencadenadores de fuente de cambios
Introducción
Uno de los principales objetivos de Azure Functions es permitir que los desarrolladores puedan centrarse exclusivamente en el desarrollo de requisitos de aplicaciones y lógica, y resumir todo lo demás.
Como desarrollador o usuario profesional, no dispones de los medios para inventar y desarrollar tus propias aplicaciones desde cero para cada una de tus necesidades empresariales. Primero tendrías que investigar los sistemas existentes y determinar si se ajustan a los requisitos de tu negocio. En muchas ocasiones, no resultaría sencillo comprender las API de otros sistemas e integrarlas, ya que las habría desarrollado otra persona.
Azure proporciona muchos conectores que puedes aprovechar para integrar tus aplicaciones empresariales con otros sistemas de manera muy sencilla.
En este capítulo, descubriremos lo fácil que es integrar los diferentes servicios que hay disponibles en el ecosistema de Azure.
Usar Cognitive Services para identificar caras en imágenes
En esta receta, aprenderás a usar la Computer Vision API para detectar caras dentro de una imagen, de tal modo que localizaremos las caras y capturaremos sus coordenadas, y las guardaremos en diferentes áreas de Almacenamiento de tablas de Azure en función del género.
Preparación
Para empezar, es necesario crear una Computer Vision API y configurar las claves de API para que Azure Functions (o cualquier otro programa) pueda tener acceso a ella mediante programación.
Debes asegurarte de que está instalado el explorador de Azure Storage y de que este se ha configurado para obtener acceso al área de almacenamiento donde vas a cargar los blobs.
Crear una nueva cuenta de Computer Vision API
Sigue estos pasos:
- Busca Computer Vision y haz clic en Crear.
- El siguiente paso es proporcionar todos los detalles para crear una cuenta de Computer Vision API. En el momento en que se redactó esta receta, la API de Computer Vision solo ofrece dos niveles de precios. Mi elección fue la opción gratuita, F0, que permite 20 llamadas a API por minuto y tiene un límite de 5000 llamadas al mes.
Ajustar la configuración de la aplicación
Sigue estos pasos:
- Una vez generada la cuenta de Computer Vision API, puedes ir a la hoja Claves y seleccionar cualquiera de las siguientes claves:

- Accede a la aplicación Azure Functions, ajusta la Configuración de la aplicación con el nombre Vision_API_Subscription_Key y usa cualquiera de las claves anteriores como valor. El runtime de Azure Functions usará esta clave para conectarse a la API de Cognitive Services y Computer Vision, y consumirla.
- Anota la ubicación en la que vas a crear el servicio Computer Vision. En mi caso, he elegido Europa occidental. Al transferir imágenes a la API de Cognitive Services, es importante asegurarse de que el punto de conexión de la API comienza con el nombre de la ubicación. Sería algo parecido a lo siguiente: https://westeurope.api.cognitive.microsoft.com/vision/ v1.0/analyze?visualFeatures=Faces&language=en.
Cómo hacerlo…
Sigue estos pasos:
- Crea una función nueva mediante una de las plantillas predeterminadas con el nombre Desencadenador de Azure Blob Storage.
- A continuación, debes introducir el nombre de la función de Azure junto con la ruta y la conexión de la cuenta de almacenamiento. Se cargará una imagen en el contenedor del desencadenador de Azure Blob Storage (imagen) (mencionado en el parámetro Ruta de la siguiente captura de pantalla) al final de esta sección:

Ten en cuenta que al crear la función, la plantilla crea un enlace de salida de tabla de almacenamiento de blobs y esto nos permite proporcionar el parámetro Nombre de tabla. Sin embargo, no se puede asignar el nombre del parámetro al crear la función. Se puede cambiar una vez la hayamos creado. Revisa todos los detalles y, a continuación, haz clic en el botón Crear para crear la Azure Function.
- Una vez creada la función, ve a la pestaña Integrar, haz clic en Nueva salida y selecciona Almacenamiento de tablas de Azure y, a continuación, haz clic en el botón Seleccionar. Proporciona los valores de los parámetros y, a continuación, haz clic en el botón Guardar, como se muestra en la siguiente captura de pantalla:

- Ahora vamos a crear otro enlace de salida de Almacenamiento de tablas de Azure para almacenar toda la información relativa a mujeres. Para ello, haz clic en el botón Nueva salida de la pestaña Integrar, selecciona Almacenamiento de tablas de Azure y haz clic en el botón Seleccionar. Esto es lo que aparece una vez proporcionados los valores de entrada:

- Después de revisar todos los detalles, haz clic en el botón Guardar para crear el enlace de salida de Almacenamiento de tablas de Azure y guardar los datos relativos a mujeres.
- Navega hasta el editor de código del método Run de la función LocateMaleFemaleFaces y, a continuación, agrega los parámetros outMaleTable y outFemaleTable. El código siguiente toma la secuencia de imágenes cargada en el blob y esta se pasa luego como entrada a Cognitive Services, que devuelve un JSON con toda la información de la cara. Una vez recibida la información de la cara, incluidas las coordenadas y los detalles de género, debemos guardar las coordenadas de la cara en el almacenamiento de tablas correspondiente utilizando los enlaces de salida de tablas:
#r «Newtonsoft.Json»
#r «Microsoft.WindowsAzure.Storage»
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);
}
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-SubscriptionKey», 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; }}
- Vamos a agregar una condición (resaltada en negrita en el código mencionado en el paso 10) para comprobar el género y, en función de este, almacenaremos la información en el almacenamiento de tablas correspondiente.
- Crea un nuevo contenedor de blobs denominado imágenes mediante el explorador de Azure Storage, como se muestra en la siguiente captura de pantalla:

- Vamos a cargar una imagen con rostros masculinos y femeninos en el contenedor denominado imágenes mediante el explorador de Azure Storage, como se muestra aquí:

- La función se desencadena en cuanto se carga una imagen. Este es el JSON que se registró en la consola de registros de la función:
{
«requestId»:»483566bc-7d4d-45c1-87e2-6f894aaa4c29″,
«metadata»:{ },
«faces»:[
{
«age»:31,
«gender»:»Female»,
«faceRectangle»:{
«left»:535,
«top»:182,
«width»:165,
«height»:165
}
},
{
«age»:33,
«gender»:»Male»,
«faceRectangle»:{
«left»:373,
«top»:182,
«width»:161,
«height»:161
}
}
]
}
Si eres un desarrollador de front-end con experiencia en HTML5 y tecnologías relacionadas con lienzos, puedes incluso dibujar cuadrados que localicen las caras en la imagen usando la información proporcionada por Cognitive Services.
11. La función también ha creado dos tablas de Almacenamiento de tablas de Azure diferentes, como se muestra aquí:

Cómo funciona…
Primero hemos creado un enlace de salida de Almacenamiento de tablas para almacenar detalles sobre todos los hombres de las fotos. Luego, hemos creado otro enlace de salida de Almacenamiento de tablas para almacenar los detalles sobre todas las mujeres.
Aunque usamos todo el código predeterminado que proporciona la plantilla de Azure Functions para almacenar todas las coordenadas de caras en una sola tabla, hemos realizado un pequeño cambio para comprobar si la persona de la foto es hombre o mujer y almacenar los datos en función del resultado.
Ten en cuenta que las API no son 100 % exactas en la identificación del género correcto. Por lo tanto, en tus entornos de producción, debes contar con un mecanismo de reserva que te permita manejar estas situaciones.
Y eso no es todo…
El código predeterminado que proporciona la plantilla invoca la Computer Vision API al pasar la imagen que hemos cargado en el almacenamiento de blobs. Las plantillas de localización de caras invocan la llamada a API pasando el parámetro visualFeatures=Faces, que devuelve información sobre lo siguiente:
- Edad
- Género
- Coordenadas de las caras de la imagen
Puedes obtener más información sobre Computer Vision API en https://docs.microsoft.com/azure/cognitive-services/ computer-vision/home.
Usa la función Environment.GetEnvironmentVariable(«KeyName») para recuperar la información almacenada en la configuración de la aplicación. En este caso, el método CallVisionAPI utiliza la función para recuperar la clave, que es esencial para realizar una solicitud a Microsoft Cognitive Services.
Es una práctica recomendada para almacenar todas las claves y otra información confidencial en la configuración de la aplicación.
ICollector e IAsyncCollector se usan para la inserción masiva de datos.
Interacciones de Azure SQL Database mediante Azure Functions
Hasta ahora, has aprendido a almacenar datos en servicios de Azure Storage, como blobs, colas y tablas. Todos estos servicios de almacenamiento son excelentes para almacenar datos no estructurados o semiestructurados. Sin embargo, es posible que necesitemos almacenar datos en sistemas de administración de bases de datos relacionales, como una Azure SQL Database.
En esta receta, aprenderás a utilizar la API de ADO.NET para conectarte a una SQL Database e insertar datos JSON en una tabla denominada EmployeeInfo.
Preparación
Ve al portal de Azure y haz lo siguiente:
- Crea un SQL Server lógico con el nombre que prefieras. Se recomienda crearlo en el mismo grupo de recursos en el que se encuentren tus Azure Functions.
- Crea una Azure SQL Database denominada Cookbookdatabase. Para ello, selecciona Base de datos en blanco en la lista desplegable Seleccionar origen de la hoja SQL Database al crear la base de datos.
- Para crear una regla de firewall para tu dirección IP, haz clic en el botón Establecer regla de firewall en la hoja Información general para que puedas conectarte a las Azure SQL Databases a través de SQL Server Management Studio (SSMS). Si no tienes SSMS, instala la versión más reciente de SSMS. La puedes descargar en https://docs.microsoft.com/sql/ssms/ download-sql-server-management-studio-ssms.
- Haz clic en el enlace Mostrar las cadenas de conexión de la base de datos en la hoja Información esencial de SQL Database, como se muestra en la siguiente captura de pantalla:

- Copia la cadena de conexión de la hoja siguiente. No olvides reemplazar las plantillas su_nombre_de_usuario y su_contraseña con tu nombre

- Abre SSMS y conéctate al servidor SQL Server lógico de Azure que creaste en los pasos anteriores.
- Una vez que conectado, crea una nueva tabla con el nombre EmployeeInfo utilizando el siguiente esquema:
CREATE TABLE [dbo].[EmployeeInfo](
[PKEmployeeId] [bigint] IDENTITY(1,1) NOT NULL,
[firstname] [varchar](50) NOT NULL,
[lastname] [varchar](50) NULL,
[email] [varchar](50) NOT NULL,
[devicelist] [varchar](max) NULL,
CONSTRAINT [PK_EmployeeInfo] PRIMARY KEY CLUSTERED
(
[PKEmployeeId] ASC
)
)
Cómo hacerlo…
Sigue estos pasos:
- Navega a la aplicación de la función, crea un nuevo desencadenador de HTTP mediante la plantilla HttpTrigger-CSharp, establece el Nivel de autorización en Anónimo.
- Navega hasta el editor de código de run.csx en la función SaveJSONToAzureSQLDatabase y reemplaza el código predeterminado por el siguiente. El código siguiente toma los datos que se pasan al desencadenador de HTTP y los inserta en la base de datos mediante la API ADO.Net:
#r «Newtonsoft.Json»
#r «System.Data»
using System.Net; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Primitives; using Newtonsoft.Json; using System.Data.SqlClient; using System.Data;
public static async Task<IActionResult> Run(HttpRequest req,
ILogger log)
{
log.LogInformation(«C# HTTP trigger function processed a request.»);
string firstname,lastname, email, devicelist;
string requestBody = await new StreamReader(req.Body).
ReadToEndAsync();
dynamic data = JsonConvert.DeserializeObject(requestBody); firstname = data.firstname; lastname = data.lastname; email = data.email; devicelist = data.devicelist;
SqlConnection con =null;
Try
{
string query = «INSERT INTO EmployeeInfo
(firstname,lastname, email, devicelist) » + «VALUES (@firstname,@ lastname, @email, @devicelist) «;
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
{
if(con!=null)
{
con.Close();
}
}
return (ActionResult)new OkObjectResult($»Successfully inserted the data.»);
}
Ten en cuenta que debes validar todos y cada uno de los parámetros de entrada. Para que resulte más sencillo, el código que valida los parámetros de entrada no está incluido. Asegúrate de validar todos los parámetros antes de guardarlos en la base de datos. También se recomienda almacenar la cadena de conexión en la Configuración de la aplicación.
3. Vamos a ejecutar el desencadenador de HTTP con los siguientes datos de prueba directamente desde la consola de prueba de Azure Functions:
{
«firstname»: «Praveen»,
«lastname»: «Kumar»,
«email»: «praveen@example.com», «devicelist»:
«[
{
‘Type’ : ‘Mobile Phone’,
‘Company’:’Microsoft’
},
{
‘Type’ : ‘Laptop’,
‘Company’:’Lenovo’
}
]»
}
Ten en cuenta que debes validar todos y cada uno de los parámetros de entrada. Para que resulte más sencillo, el código que valida los parámetros de entrada no está incluido. Asegúrate de validar todos los parámetros antes de guardarlos en la base de datos.
4. Tal como se muestra en la siguiente captura de pantalla, se ha insertado correctamente un registro:

El objetivo de esta receta era aceptar los valores de entrada del usuario y guardarlos en una base de datos relacional donde poder recuperar los datos posteriormente para fines operativos. Para ello, hemos utilizado Azure SQL Database, una oferta de base de datos relacional también conocida como base de datos como servicio (DBaaS). Hemos creado una nueva SQL Database y reglas de firewall que nos permiten conectar de forma remota desde la estación de trabajo de desarrollo local mediante SSMS. También hemos creado una tabla denominada EmployeeInfo, que se puede utilizar para guardar datos.
Hemos desarrollado un sencillo programa que utiliza la API ADO.NET, que conecta con Azure SQL Database e inserta datos en la tabla EmployeeInfo.
Supervisar tweets a través de Logic Apps y notificar a los usuarios publicaciones de tweets de usuarios populares
Uno de mis colegas, que trabaja en un proyecto de gestión de reclamaciones sociales, es responsable de supervisar los problemas que los usuarios publican en las plataformas de redes sociales, como Facebook, Twitter y otras. Se enfrentaba al problema de tener que supervisar continuamente los tweets publicados en la cuenta de Twitter de su cliente con hashtags específicos. Su trabajo principal consistía en responder rápidamente a los tweets de cuentas de usuarios con un gran número de seguidores, es decir, a usuarios con más de 50.000 seguidores. Así pues, estaba buscando una solución que supervisase de manera continua un hashtag concreto y le avisase cada vez que un usuario con más de 50.000 seguidores publicase un tweet para que su equipo respondiera rápidamente a ese usuario.
En este caso, para que resulte más sencillo, estableceremos la cifra de 200 seguidores, en lugar de 50.000.
Antes de conocer Azure Logic Apps, pensé que llevaría varias semanas estudiar, desarrollar, probar e implementar una solución de este tipo. Obviamente, se necesitaría bastante tiempo para estudiar, comprender y consumir la API de Twitter (o de cualquier otro canal social) para obtener la información necesaria y crear una solución completa que resuelva el problema.
Afortunadamente, tras conocer Logic Apps y sus conectores listos para usar, comprobé que apenas se tarda 10 minutos en diseñar una solución para el problema que tenía mi amigo.
En esta receta, aprenderás a diseñar una Logic App que se integre con Twitter (para supervisar tweets) y Gmail (para enviar correos electrónicos).
Preparación
Necesitamos lo siguiente para trabajar con esta receta:
- Una cuenta válida de Twitter
- Una cuenta válida de Gmail
Al trabajar con esta receta, tendremos que autorizar a Azure Logic Apps para acceder a tus cuentas.
Cómo hacerlo…
Vamos a llevar a cabo los siguientes pasos:
- Crear una Logic App nueva
- Diseñar la Logic App con conectores de Twitter y Gmail
- Probar la Logic App publicando los tweets con el hashtag específico
Crear una Logic App nueva
Sigue estos pasos:
- Inicia sesión en el portal de administración de Azure, busca Logic Apps y selecciona Logic App.
- En la hoja Crear aplicación lógica, una vez introducido el nombre, el grupo de recursos, la suscripción y la ubicación, haz clic en el botón Crear para crear la Logic App:

Diseñar la Logic App con conectores de Twitter y Gmail
Sigue estos pasos:
- Una vez creada la Logic App, ve al Diseñador de Logic Apps y selecciona Aplicación lógica en blanco.
- A continuación, habrá que introducir los Conectores. En la lista Conectores, haz clic en Twitter. A continuación, se te pedirá que te conectes a Twitter utilizando las credenciales de tu cuenta de Twitter. Si ya estás conectado, se mostrará directamente la lista de Desencadenadores asociados con el conector de Twitter, como se muestra en la siguiente captura de pantalla:

- Después de hacer clic en el desencadenador de Twitter, se te pedirá que proporciones el Texto de búsqueda (por ejemplo, hashtags y palabras clave) y la Frecuencia con la que deseas que la Logic App sondee los tweets. Esto es lo que se muestra una vez proporcionados los datos:

- Ahora vamos a agregar una condición nueva. Para ello, hay que hacer clic en Siguiente paso, buscar la condición y seleccionar la acción para la condición, como se muestra en la siguiente captura de pantalla:

- Una vez realizado el paso anterior, se mostrará la siguiente pantalla, donde se pueden seleccionar los valores de la condición y seleccionar lo que desearías agregar cuando la condición se establezca como true o false:

- Al hacer clic en el campo de entrada Elegir un valor, se mostrarán todos los parámetros a los que se podría agregar una condición; en este caso, debemos seleccionar Recuento de seguidores, como se muestra en la siguiente captura de pantalla:

- Una vez seleccionado el parámetro Recuento de seguidores, debes crear una condición (Recuento de seguidores mayor o igual que 200), como se muestra en la siguiente captura de pantalla:

- En la sección If true de la Condición anterior, busca la conexión de Gmail y selecciona Gmail | Enviar correo electrónico, como se muestra en la siguiente captura de pantalla:

- Se te pedirá que inicies sesión si aún no lo has hecho. Proporciona tus credenciales y autoriza a Azure Logic Apps para acceder a tu cuenta de Gmail.
- Una vez concedida la autorización, puedes enmarcar tu correo electrónico con Agregar contenido dinámico con los parámetros de Twitter, como se muestra en la siguiente captura de pantalla. Si no ves el Recuento de seguidores, haz clic en el enlace Mostrar más:

- Una vez que hayas terminado, haz clic en el botón Guardar.
Probar la funcionalidad de Logic App
Sigue estos pasos:
- Vamos a publicar un tweet en Twitter con el hashtag #AzureFunctions, como se muestra en la siguiente captura de pantalla:

- Transcurrido aproximadamente un minuto, debería activarse la Logic App.
Ahora, debemos ir a la hoja de información general de la Logic App y ver el Historial de ejecuciones:

- Todo correcto, se ha activado dos veces y he recibido los correos electrónicos. Uno de ellos se muestra en la siguiente captura de pantalla:

Has creado una nueva Logic App y has elegido el conector de Twitter para supervisar los tweets publicados con el hashtag #AzureFunctions una vez por minuto. Si hay algún tweet con ese hashtag, la aplicación comprueba si el recuento de seguidores es mayor o igual que 200. Si el recuento de seguidores cumple la condición, se crea una acción nueva con un nuevo conector de Gmail que envía un correo electrónico con el contenido dinámico que deseas enmarcar usando los parámetros del conector de Twitter.
Integrar Logic Apps con funciones sin servidor
En la receta anterior, has aprendido a integrar diferentes conectores mediante Logic Apps. En esta receta, vamos a implementar la misma solución que implementamos en la receta anterior. Para ello, moveremos simplemente la lógica condicional que comprueba el recuento de seguidores en Azure Functions.
Preparación
Antes de seguir avanzando, vamos a realizar los siguientes pasos:
- Crea una cuenta de SendGrid (si no se ha creado ya), obtén la clave de API de SendGrid y crea una clave nueva en la Configuración de la aplicación de la Function App.
- Instala Postman para probar el desencadenador de HTTP. Puedes descargar la herramienta en https://www.getpostman.com/.
Cómo hacerlo…
Sigue estos pasos:
- Crea una función nueva. Para ello, selecciona el desencadenador de HTTP y asígnale el nombre ValidateTwitterFollowerCount.
- Ve a la pestaña Integrar y agrega un nuevo enlace de salida, SendGrid a través del botón Nueva salida:

- Reemplaza el código predeterminado con lo siguiente y haz clic en Guardar. El siguiente código simplemente comprueba el recuento de seguidores y si es mayor que 200, envía un correo electrónico:
#r «Newtonsoft.Json»
#r «SendGrid» using System.Net; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Primitives; using Newtonsoft.Json;
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.»); string name = req.Query[«name»];
string requestBody = await new StreamReader(req.Body).
ReadToEndAsync();
dynamic data = JsonConvert.DeserializeObject(requestBody);
string strTweet = «»;
SendGridMessage message = new SendGridMessage(); if(data.followersCount >= 200)
{
strTweet = «Tweet Content» + data.tweettext; message.SetSubject($»{data.Name} with {data. followersCount} followers has posted a tweet»); message.SetFrom(«donotreply@example.com»); message.AddTo(«prawin2k@gmail.com»); message.AddContent(«text/html», strTweet);
}
Else
{
message = null;
}
await messages.AddAsync(message);
return (ActionResult)new OkObjectResult($»Hello»); }
- Prueba la función a través de Postman utilizando los parámetros resaltados en la siguiente captura de pantalla. En los pasos siguientes, después de integrar la función de Azure ValidateTwitterFollowerCount, todos los parámetros de entrada siguientes, como followersCount, tweettext y Name, se publicarán a través del conector de Twitter de la Logic App:

- Crea una nueva Logic App, denominada NotifywhenTweetedbyPopularUserUsingFunctions.
- Comienza diseñando la aplicación con la plantilla de Aplicación lógica en blanco, selecciona el conector de Twitter y configura Texto de búsqueda, Frecuencia e Intervalo.
- Haz clic en Nuevo paso para agregar una acción. En la sección Elegir una acción, selecciona Azure Functions como conector, como se muestra en la siguiente captura de pantalla:

- Al hacer clic en Azure Functions se enumerarán todas las aplicaciones de funciones de Azure disponibles, como se muestra en la siguiente captura de pantalla:

- Haz clic en la Function App en la que has creado la función
ValidateTwitterFollowerCount. A continuación, selecciona la función ValidateTwitterFollowerCount, como se muestra en la siguiente captura de pantalla:

- En el siguiente paso, hay que preparar la entrada JSON que se debe pasar desde la Logic App a la función de desencadenador de HTTP ValidateTwitterFollowerCount que hemos desarrollado. Ahora vamos a enmarcar la entrada JSON de la misma manera que lo hicimos al probar la función de desencadenador de HTTP mediante Postman, como se muestra en la siguiente captura de pantalla (la única diferencia es que los valores, como followersCount, Name y tweettext, son dinámicos ahora):

- Una vez que hayas revisado todos los parámetros que espera la función ValidateTwitterFollowerCount, haz clic en el botón Guardar para guardar los cambios.
- Puedes esperar unos minutos o publicar un tweet con el hashtag que has configurado en el campo de entrada Texto de búsqueda.
Y eso no es todo…
Si no ves el parámetro dinámico previsto, haz clic en el botón Ver más, como se muestra en la siguiente captura de pantalla:

En la función de Azure ValidateTwitterFollowerCount, hemos codificado de forma rígida el umbral de recuento de seguidores como 200. Es recomendable guardar estos valores como elementos configurables almacenándolos en la Configuración de la aplicación.
Consulta también
• Consulta la receta Enviar una notificación por correo electrónico al usuario final de forma dinámica en el capítulo 2, Trabajar con notificaciones mediante los servicios SendGrid y Twilio
Auditorías de datos de Cosmos DB mediante desencadenadores de fuente de cambios
Es posible que muchos de vosotros ya hayáis oído hablar de Cosmos DB, ya que se ha vuelto muy popular y muchas organizaciones la utilizan debido a las características que proporciona.
En esta receta, aprenderemos acerca de la integración de Azure Functions sin servidor con una base de datos NoSQL sin servidor en Cosmos DB. Puedes obtener más información sobre Cosmos DB en https://docs.microsoft.com/azure/ cosmos-db/introduction.
Es probable que sea necesario mantener registros de cambios de campos, atributos, documentos y otros para fines de auditoría con cierta frecuencia. En el mundo de las bases de datos relacionales, es posible que hayas visto desarrolladores que utilizan desencadenadores o procedimientos almacenados para implementar este tipo de funcionalidad de auditoría, donde se escribe código para almacenar datos en una tabla de auditoría independiente.
En esta receta, vamos a aprender lo fácil que es llevar a la práctica el caso de uso anterior y auditar las colecciones de Cosmos DB, para lo que simplemente tendremos que escribir una función simple que se desencadene siempre que se realice un cambio en un documento de una colección de Cosmos DB.
En el mundo de las bases de datos relacionales, una colección es lo mismo que una tabla y un documento es lo mismo que un registro.
Preparación
Para poder comenzar, debemos hacer primero lo siguiente:
- Crear una cuenta de Cosmos DB
- Crear una nueva colección de Cosmos DB en la que puedas almacenar datos en forma de documentos
Crear una nueva cuenta de Cosmos DB
Ve al portal de Azure y crea una cuenta de Cosmos DB nueva. Tendrás que proporcionar lo siguiente:
- Una suscripción válida y un grupo de recursos.
- Un nombre de cuenta válido. Esto creará un punto de conexión en <<nombreCuenta>>.document.azure.com.
- Una API. Establécela en SQL. De este modo, podrás escribir consultas en SQL. Puedes utilizar cualquier otra API si lo deseas.
Crear una nueva colección de Cosmos DB
Sigue estos pasos:
- Una vez creada la cuenta, tendrás que crear una base de datos nueva y una colección. Podemos crear las dos en un solo paso directamente desde el portal.
- Ve a la pestaña Información general y haz clic en el botón Agregar colección para crear una colección nueva:

- A continuación, se abrirá automáticamente la pestaña Explorador de datos, donde se te pedirá que proporciones los siguientes datos:
Nombre de campo | Valor | Comentario |
Id. de base de datos | cookbookdatabase | Se trata de un contenedor de varias colecciones de Cosmos DB. |
Id. de colección | cookbookdatacollection | Este es el nombre de la colección donde vas a almacenar los datos. |
Nombre de campo | Valor | Comentario |
Capacidad de almacenamiento | Fijo (10 GB) | En función de las cargas de trabajo de producción, es posible que necesites una capacidad ilimitada, ya que, de lo contrario, se realizarán particiones. |
Rendimiento (400-10.000 RU/s) | 400 | Esta es la capacidad de la colección de Cosmos DB. El rendimiento de las lecturas y escrituras de la colección depende del rendimiento que configures al aprovisionar la colección. |
- A continuación, haz clic en el botón Aceptar para crear la colección. Si todo ha ido bien, se mostrará algo parecido a lo siguiente en la pestaña Explorador de datos de la cuenta de Cosmos DB:

Hemos creado correctamente 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 cómo hacer que se active cada vez que se realice un cambio en la colección de Cosmos DB.
Cómo hacerlo…
Sigue estos pasos:
- Ve a la cuenta de Cosmos DB y haz clic en el menú Agregar Azure Function de la hoja Todas las configuraciones en la cuenta de Cosmos DB.
- Ahora se abrirá la hoja Agregar Azure Function, donde deberás elegir la aplicación de la función de Azure en la que te gustaría crear una nueva función (desencadenador de Cosmos DB) para que se active cada vez que se realice un cambio en la colección. Esto es lo que se muestra:

- Una vez que hayas revisado los detalles, haz clic en el botón Guardar (que se muestra en la captura de pantalla anterior) para crear la nueva función, que se activará cada vez que se realice un cambio en la colección. Ahora, iremos rápidamente a la aplicación de la función de Azure (en mi caso, es AzureFunctionCookBookV2) para ver si se ha creado la función nueva con el nombre cookbookdatacollectionTrigger. Esto es lo que aparece en la aplicación de mi función:

- Reemplaza el código predeterminado con el siguiente código del desencadenador de Azure Functions Cosmos DB y así obtendrás una lista de todos los documentos que se han actualizado. El código siguiente solo imprime el número de documentos que se han actualizado y el Id. del primer documento en la consola de registros:
#r «Microsoft.Azure.DocumentDB.Core» using System;
using System.Collections.Generic; using Microsoft.Azure.Documents;
public static void Run(IReadOnlyList<Document> input, ILogger log)
{
if (input != null && input.Count > 0)
{
log.LogInformation(«Documents modified » + input.Count); log.LogInformation(«First document Id » + input[0].Id);
}
}
- Así se habrá completado la integración de la colección de Cosmos DB y la función de Azure. Ahora vamos a agregar un documento nuevo a la colección y ver cómo se activa el desencadenador. Abre una pestaña nueva (deja la pestaña cookbookdatacollectionTrigger abierta en el explorador), ve a la colección y crea un documento nuevo. Para ello, haz clic en el botón Nuevo documento, como se muestra en la siguiente captura de pantalla:

- Una vez que hayas reemplazado el JSON predeterminado (que solo tiene un atributo Id.) con el JSON que tiene los atributos necesarios, haz clic en el botón Guardar para guardar los cambios y acceder rápidamente a la pestaña del otro navegador, donde está abierta la función de Azure, y revisar los registros para comprobar la salida de la función. Así es como se muestran mis registros justo después de agregar un valor al atributo Id. del documento. Puede que a ti te aparezca de otra forma, va a depender de la estructura JSON:

Cómo funciona…
Para integrar las Azure Functions con Cosmos DB, primero hemos creado una cuenta de Cosmos DB, a continuación, una base de datos y, dentro de esta, una colección nueva. Una vez creada la colección, la hemos integrado desde el portal de Azure. Para ello, hemos hecho clic en el botón Agregar Azure Function, que está disponible en el nivel de cuenta de Cosmos DB. Hemos elegido la Function App necesaria en la que queríamos crear un desencadenador de Cosmos DB. Una vez finalizada la integración, hemos creado un documento de muestra en la colección de Cosmos DB y, a continuación, hemos comprobado que la función se ha activado automáticamente para todos los cambios (todas las lecturas y escrituras, pero no las eliminaciones) que hemos realizado en la colección.
Y eso no es todo…
Al integrar Azure Functions para realizar un seguimiento de los cambios de Cosmos DB, se creará automáticamente una colección nueva denominada concesiones, como se muestra aquí. Ten en cuenta que esto conlleva coste adicional, ya que el coste en Cosmos DB se basa en las unidades de solicitud (RU) asignadas a cada colección:

Es importante tener en cuenta que el desencadenador de Cosmos DB no se activaría (en el momento en que se redactó la receta) para ninguna de las eliminaciones de la colección. Solo se activa para crear y actualizar los documentos de una colección. Si para ti es importante llevar un seguimiento de las eliminaciones, tendrás que realizar eliminaciones temporales, es decir, tendrás que establecer un atributo como isDeleted en true para los registros que elimine la aplicación y que estén basados en el atributo isDeleted, implementando así una lógica personalizada en el desencadenador de Cosmos DB.
La integración que hemos realizado entre Azure Functions y Cosmos DB utiliza las fuentes de cambios de Cosmos DB. Puedes obtener más información sobre fuentes de cambios aquí: https://docs.microsoft.com/azure/cosmos-db/change-feed.
No olvides eliminar la cuenta de Cosmos DB y las colecciones asociadas si crees que no vas a volver a utilizarlas, ya que las colecciones se cobran en función de las RU asignadas aunque no las estés utilizando de manera activa.
Si no puedes ejecutar esta función de Azure o te aparece un mensaje de error indicando que las extensiones de Cosmos DB no están instaladas, intenta crear un nuevo desencadenador de Cosmos DB, que solicitará la instalación.