Azure function trigger con CosmosDb y SqlServer
En este post voy a explicar como implementar una funcion de azure a modo de trigger para conectar una base de datos CosmosDb con otra base de datos SQL Server.
A partir de aquí me referire a cualquier base de datos como BBDD para abreviar.
El objetivo de este post es hacer una BBDD en CosmosDb con un trigger que reinserte los datos de personas que metamos en nuestra BBDD Sql Server.
Que vamos a utilizar
- Necesitamos como prerrequisito una BBDD SQL Server en Azure
- Tambien necesitamos tener un grupo de recursos y una cuenta de storage en azure
- Una BBDD CosmosDb en Azure
- Una Function App que funcionara como trigger de la BBDD de CosmosDb
!Empezemos¡, CosmosDb
Lo primero que haremos será crear BBDD CosmosDb desde nuestro portal de Azure, así que dirijamonos al portal y creemos un nuevo recurso.
Estas son mis opciones para crear la BBDD Cosmos
- Suscripción de Azure para estudiantes
- Mi grupo de recursos es «Recursos Tajamar»
- La BBDD se llamará «postazurefunctions» todo en minúscula
- En api, elegiremos CORE (SQL)
- La region al Oeste de Europa
Le daremos a revisar y crear, y cuando compruebe que todo esta correcto clickaremos en la opcion de Crear
Ahora la Function App
Vamos a crear una nueva Function App para almacenar aqui nuestro trigger.
Nuevamente, desde el portal de azure creamos un nuevo recurso.
Y la crearemos con estas opciones:
- Nombre «posttrigger».
- Suscripción Azure para estudiantes.
- Grupo de recursos existente «RecursosTajamar»b
- OS: Windows.
- Plan de consumo, de esta forma azure solo nos cobrará por las peticiones realizadas a la funcion.
- Ubicación Oeste de Europa.
- Pila de ejecución .NET.
- Storage existente «storagetajamarasr» en mi caso.
- Y yo, personalmente, he desabilitado el application insights que viene por defecto.
Tras crear la function app, seleccionamos la opcion «En el portal» para escoger un entorno de desarrollo.
Escogemos la opción Más plantillas, y escogemos Azure Cosmos DB Trigger
Y por ultimo nos va a pedir que instalemos la extensión de Microsoft.Azure.WebJobs.Extensions.CosmosDb.
Ahora nos podemos ir a estirar las piernas o a tomarnos un café, porque va a tardar un rato en instalar la extensión.
Creando el Trigger
Esta es una forma en la que podemos crear nuestro trigger:
- Nombre: CosmosPostTrigger
- Colección: People
- BBDD: People_DDBB
- Nombre de la colección de concesiones PeopleCollection
- Y para la conexion de la cuenta, eleccionarenos «nuevo» y escogeremos la BBDD que hemos creado con anterioridad
Y como resultado, si accedemos a nuestra BBDD Cosmos, veremos que se ha añadido de forma automática una nueva coleccion en el explorador de datos.
Colecciones
Aprovechando que estamos en la BBDD de Cosmos, vamos a crear una nueva coleccion.
En esta coleccion será donde insertaremos la información de la BBDD.
Y la podemos crear así:
!Importante¡ la información de esta colección debe coincidir con la que hemos puesto en el trigger.
- Database id existente: People_DDBB
- Collection id: People
- Partition key: /people. Importante que sea en minúscula
EN SQL Server
Necesitamos una tabla espejo para almacenar los datos e personas, así que en nuestra BBDD SQL en azure nos crearemos una tabla «PERSON» con estos campos:
CREATE TABLE PERSON
(
id NVARCHAR(50),
PNAME NVARCHAR(50),
PLASTNAME NVARCHAR(50),
AGE INT
)
Y finalmente, configuremos nuestro trigger
Si queremos alcanzar nuestro objetivo necesitamos dos cosas:
- Código en nuestra función para que inserte registros en SQL Server.
- Las dependencias para utilizar este código.
Para añadir las dependencias que necesitamos a nuestra función necesitamos crear un archivo project.json
E introduciremos dentro este codigo para tener nuestras dependencias insertadas.
{
"frameworks": {
"net46":{
"dependencies": {
"System.Data.SqlClient":"4.6.0",
"Newtonsoft.Json":"12.0.1"
}
}
}
}
Y finalmente en el archivo run.csxintroducimos el código que hace funcionar a nuestro trigger
#r "Microsoft.Azure.DocumentDB.Core"
#r "System.Data.SqlClient"
#r "Newtonsoft.Json"
using System;
using System.Collections.Generic;
using Microsoft.Azure.Documents;
using System.Data.SqlClient;
using Newtonsoft.Json;
public static void Run(IReadOnlyList<Document> input, ILogger log)
{
if (input != null && input.Count > 0)
{
var data = JsonConvert.SerializeObject(input);
log.LogInformation("New person: " + data);
List<Person> people =
JsonConvert.DeserializeObject<List<Person>>(data);
log.LogInformation("Person added: " + people[0].PNAME + " " + people[0].PLASTNAME);
String response = InsertPersonSQL(people[0]);
log.LogInformation(response);
log.LogInformation("Documents modified " + input.Count);
log.LogInformation("First document Id " + input[0].Id);
}
}
public static string InsertPersonSQL(Person p)
{
String cnnString = "[******TU CADENA DE CONEXION******]";
using (SqlConnection cn = new SqlConnection(cnnString))
{
cn.Open();
String sql = "INSERT INTO PERSON VALUES ('" +
p.id + "','" +
p.PNAME + "','" +
p.PLASTNAME + "'," +
p.AGE +")";
using (SqlCommand com = new SqlCommand(sql, cn))
{
int affected = com.ExecuteNonQuery();
return "Affected registers: " + affected;
}
}
}
public class Person{
public String id {get;set;}
public String PNAME {get;set;}
public String PLASTNAME {get;set;}
public int AGE {get;set;}
}
Que hace nuestro código
Tenemos una clase Person con las propierdades que deseamos almacenar
Un método InsertPersonSql que inserta a las personas en la BBDD SQL Server
Y el método Run que se ejecuta al ser llamado el trigger, serializa en forma de json la información, convierte esta información en una lista de personas y llama a la funcion para insertar a la persona en la BBDD.
Ademas ejecuta varias tareas de loggin para apreciar el resultado de la operación.
Ahora, probemos que funciona
Abramos nuestra BBDD CosmosDb en otra pestaña mientras tenemos la del trigger abierta para ver los resultados.
Vamos a crear un nuevo documento en la colección People. Insertaremos este nuevo documento:
{
"id": "1",
"PNAME": "ANDRES",
"PLASTNAME": "SANCHEZ",
"AGE": 23
}
Y ahora podemos observar que el trigger se ha activado
Y que en nuestra tabla de SQL Server tenemos un nuevo registro
Autor: Andrés Sánchez Robleño
Curso: Microsoft MCSA Web Applications + Microsoft MCSD App Builder + Xamarin
Centro: Tajamar
Año académico: 2018-2019
LinkedIn: https://es.linkedin.com/in/andrés-sánchez-robleño-7a5863162