Conexión de Azure Functions a Azure Cosmos DB mediante Visual Studio Code
Azure Functions le permite conectar servicios de Azure y otros recursos a funciones sin tener que escribir su propio código de integración. Estos enlaces, que representan la entrada y la salida, se declaran dentro de la definición de función. Los datos de los enlaces se proporcionan a la función como parámetros. Un desencadenador es un tipo especial de enlace de entrada. Si bien una función tiene un único desencadenador, puede tener varios enlaces de entrada y salida. Para más información, consulte Conceptos básicos sobre los enlaces y desencadenadores de Azure Functions.
En este artículo se muestra cómo usar Visual Studio Code para conectar Microsoft Azure Cosmos DB a la función que creó en el artículo de inicio rápido anterior. El enlace de salida que se agrega a esta función escribe datos de la solicitud HTTP en un documento JSON almacenado en un contenedor de Azure Cosmos DB.
Antes de empezar, debe completar el Inicio rápido: Creación de una función de C# en Azure mediante Visual Studio Code. Si ya ha limpiado los recursos al final de ese artículo, vuelva a recorrer los pasos para crear de nuevo la aplicación de función y los recursos relacionados en Azure.
Antes de empezar, debe completar el Inicio rápido: Creación de una función de JavaScript en Azure mediante Visual Studio Code. Si ya ha limpiado los recursos al final de ese artículo, vuelva a recorrer los pasos para crear de nuevo la aplicación de función y los recursos relacionados en Azure.
Configurar su entorno
Antes de empezar, asegúrese de instalar la extensión Azure Databases para Visual Studio Code.
Creación de una cuenta de Azure Cosmos DB
Importante
Azure Cosmos DB sin servidor ahora está disponible con carácter general. Este modo basado en el consumo hace que Azure Cosmos DB sea una opción segura para las cargas de trabajo sin servidor. Para usar Azure Cosmos DB en modo sin servidor, elija Sin servidor en Capacity mode (Modo de capacidad) al crear la cuenta.
En Visual Studio Code, haga clic con el botón derecho en la suscripción de Azure en la que creó la aplicación de funciones en el artículo anterior y seleccione Crear servidor... .
Escriba la siguiente información cuando se le indique:
Seleccionar un servidor de bases de datos de Azure: elija
Core (SQL)para crear una base de datos de documentos en la que se puedan realizar consultas mediante una sintaxis de SQL. Más información sobre la SQL API de Azure Cosmos DB.Nombre de cuenta: escriba un nombre único para identificar la cuenta de Azure Cosmos DB. El nombre de la cuenta solo puede utilizar letras minúsculas, números y guiones (-), y debe tener entre 3 y 31 caracteres de longitud.
Seleccionar un modelo de capacidad: seleccione servidor para crear una cuenta en modo sin servidor. Seleccione Provisioned throughput (Rendimiento aprovisionado) para crear una cuenta en modo de rendimiento aprovisionado. Se recomienda elegir Sin servidor si va a empezar a trabajar con Azure Cosmos DB.
Seleccionar un grupo de recursos para los nuevos recursos: elija el grupo de recursos en el que creó la aplicación de funciones en el artículo anterior.
Seleccionar una ubicación para los nuevos recursos: seleccione una ubicación geográfica para hospedar la cuenta de Azure Cosmos DB. Use la ubicación que esté más cercana a usted o a los usuarios para obtener el acceso más rápido a los datos.
Creación de un contenedor y una base de datos de Azure Cosmos DB
Una vez creada la nueva cuenta de Azure Cosmos DB, haga clic con el botón derecho en su nombre y seleccione Crear base de datos... .
Cuando se le solicite, escriba
my-databasecomo Nombre de la base de datos.Una vez creada la base de datos, haga clic con el botón derecho en su nombre y seleccione Crear colección... .
Escriba la siguiente información cuando se le indique:
Escriba un identificador para la colección:
my-containerEscriba la clave de partición de la colección:
id
Actualización de la configuración de la aplicación de funciones
En el artículo del inicio rápido anterior, creó una aplicación de funciones en Azure. En este artículo, se actualiza una instancia de Function App para escribir documentos JSON en el contenedor de Azure Cosmos DB que ha creado anteriormente. Para conectarse a una cuenta de Azure Cosmos DB, debe agregar su cadena de conexión a la configuración de la aplicación. Después, descargue la nueva configuración en el archivo local.settings.json para que pueda conectarse a su cuenta de Azure Cosmos DB cuando realice la ejecución en un entorno local.
En Visual Studio Code, haga clic con el botón derecho en la cuenta de Azure Cosmos DB y seleccione Copiar cadena de conexión.
Presione F1 para abrir la paleta de comandos y busque y ejecute el comando
Azure Functions: Add New Setting....Elija la aplicación de funciones que creó en el artículo anterior. Escriba la siguiente información cuando se le indique:
Escriba el nombre de la nueva configuración de la aplicación: escriba
CosmosDbConnectionString.Escriba el valor de "CosmosDbConnectionString" : pegue la cadena de conexión de la cuenta de Azure Cosmos DB que copió anteriormente.
Vuelva a presionar F1 para abrir la paleta de comandos y busque y ejecute el comando
Azure Functions: Download Remote Settings....Elija la aplicación de funciones que creó en el artículo anterior. Seleccione Sí a todo para sobrescribir la configuración local existente.
Registro de extensiones de enlace
Dado que va a utilizar un enlace de salida de Azure Cosmos DB, para poder ejecutar el proyecto debe tener instalada la extensión de enlaces correspondiente.
A excepción de los desencadenadores HTTP y el temporizador, los enlaces se implementan como paquetes de extensión. Ejecute el siguiente comando dotnet add package en la ventana Terminal para agregar el paquete de extensión de Storage al proyecto.
dotnet add package Microsoft.Azure.WebJobs.Extensions.CosmosDB
El proyecto se ha configurado para usar conjuntos de extensiones, que instalan automáticamente un conjunto predefinido de paquetes de extensiones.
El uso de conjuntos de extensiones se habilita en el archivo host.json en la raíz del proyecto, que tiene un aspecto similar al siguiente:
{
"version": "2.0",
"extensionBundle": {
"id": "Microsoft.Azure.Functions.ExtensionBundle",
"version": "[1.*, 2.0.0)"
}
}
Ya puede agregar el enlace de salida de Azure Cosmos DB a su proyecto.
Adición de un enlace de salida
En Functions, para cada tipo de enlace es necesario definir los elementos direction, type y un valor único de name en el archivo function.json. La manera de definir estos atributos depende del lenguaje de la aplicación de funciones.
En un proyecto de biblioteca de clases de C#, los enlaces se definen como atributos de enlace en el método de función. Después se genera automáticamente el archivo function.json, que necesita Functions, en función de estos atributos.
Abra el archivo de proyecto HttpExample.cs y agregue el parámetro siguiente a la definición del método Run:
[CosmosDB(
databaseName: "my-database",
collectionName: "my-container",
ConnectionStringSetting = "CosmosDbConnectionString")]IAsyncCollector<dynamic> documentsOut,
El parámetro documentsOut es del tipo IAsyncCollector<T>, que representa una colección de documentos JSON que se escribirán en el contenedor de Azure Cosmos DB cuando finalice la función. Atributos específicos especifica el nombre del contenedor y el nombre de su base de datos primaria. La cadena de conexión de la cuenta de Azure Cosmos DB la establece ConnectionStringSettingAttribute.
La definición del método Run debe ahora parecerse a la siguiente:
[FunctionName("HttpExample")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
[CosmosDB(
databaseName: "my-database",
collectionName: "my-container",
ConnectionStringSetting = "CosmosDbConnectionString")]IAsyncCollector<dynamic> documentsOut,
ILogger log)
Los atributos de enlace se definen directamente en el archivo function.json. Según el tipo de enlace, pueden ser necesarias propiedades adicionales. La configuración de salida de Azure Cosmos DB describe los campos necesarios para un enlace de salida de Azure Cosmos DB. La extensión facilita la incorporación de enlaces al archivo function.json.
Para crear un enlace, haga clic con el botón derecho (Ctrl + clic en macOS) en el archivo function.json de la carpeta HttpTrigger y elija Agregar enlace... Siga las indicaciones para definir las siguientes propiedades de enlace para el nuevo enlace:
| Prompt | Value | Descripción |
|---|---|---|
| Select binding direction (Seleccionar dirección de enlace) | out |
El enlace es un enlace de salida. |
| Select binding with direction "out" (Seleccionar enlace con dirección de salida) | Azure Cosmos DB |
El enlace es de Azure Cosmos DB. |
| The name used to identify this binding in your code (Nombre identificativo del enlace en el código) | outputDocument |
Nombre que identifica el parámetro de enlace al que se hace referencia en el código. |
| La base de datos de Cosmos DB en la que se escribirán los datos | my-database |
El nombre de la base de datos de Azure Cosmos DB que contiene el contenedor de destino. |
| Colección de bases de datos en la que se escribirán los datos | my-container |
El nombre del contenedor de Azure Cosmos DB en que se escribirán los documentos JSON. |
| Si es true, crea la base de datos y la colección de Cosmos DB | false |
El contenedor y la base de datos de destino ya existen. |
| Select setting from "local.setting.json" (Seleccionar configuración de "local.setting.json") | CosmosDbConnectionString |
El nombre de una configuración de la aplicación que contiene la cadena de conexión de la cuenta de Azure Cosmos DB. |
| Clave de partición (opcional) | déjelo en blanco | Solo se requiere cuando el enlace de salida crea el contenedor. |
| Rendimiento de la colección (opcional) | déjelo en blanco | Solo se requiere cuando el enlace de salida crea el contenedor. |
Se agrega un enlace a la matriz bindings en function.json, que debería ser similar al siguiente:
{
"type": "cosmosDB",
"direction": "out",
"name": "outputDocument",
"databaseName": "my-database",
"collectionName": "my-container",
"createIfNotExists": "false",
"connectionStringSetting": "CosmosDbConnectionString"
}
Adición de código que utilice el enlace de salida
Agregue código que use el objeto de enlace de salida documentsOut para crear un documento JSON. Agregue este código antes de la devolución del método.
if (!string.IsNullOrEmpty(name))
{
// Add a JSON document to the output container.
await documentsOut.AddAsync(new
{
// create a random ID
id = System.Guid.NewGuid().ToString(),
name = name
});
}
En este momento, la función debe tener el aspecto siguiente:
[FunctionName("HttpExample")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
[CosmosDB(
databaseName: "my-database",
collectionName: "my-container",
ConnectionStringSetting = "CosmosDbConnectionString")]IAsyncCollector<dynamic> documentsOut,
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);
name = name ?? data?.name;
if (!string.IsNullOrEmpty(name))
{
// Add a JSON document to the output container.
await documentsOut.AddAsync(new
{
// create a random ID
id = System.Guid.NewGuid().ToString(),
name = name
});
}
string responseMessage = string.IsNullOrEmpty(name)
? "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response."
: $"Hello, {name}. This HTTP triggered function executed successfully.";
return new OkObjectResult(responseMessage);
}
Agregue código que use el objeto de enlace de salida outputDocument en context.bindings para crear un documento JSON. Agregue este código antes de la instrucción context.res.
if (name) {
context.bindings.outputDocument = JSON.stringify({
// create a random ID
id: new Date().toISOString() + Math.random().toString().substr(2,8),
name: name
});
}
En este momento, la función debe tener el aspecto siguiente:
module.exports = async function (context, req) {
context.log('JavaScript HTTP trigger function processed a request.');
const name = (req.query.name || (req.body && req.body.name));
const responseMessage = name
? "Hello, " + name + ". This HTTP triggered function executed successfully."
: "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response.";
if (name) {
context.bindings.outputDocument = JSON.stringify({
// create a random ID
id: new Date().toISOString() + Math.random().toString().substr(2,8),
name: name
});
}
context.res = {
// status: 200, /* Defaults to 200 */
body: responseMessage
};
}
Ejecución local de la función
Como en el artículo anterior, presione F5 para iniciar el proyecto de aplicación de función y Core Tools.
Mientras se ejecuta Core Tools, vaya al área de Azure: Área Functions. En Functions, expanda Proyecto local > Functions. Haga clic con el botón derecho (Ctrl + clic en Mac) en la función
HttpExampley elija Execute Function Now... (Ejecutar la función ahora...).
En Enter request body (Especificar el cuerpo de la solicitud) verá el valor del cuerpo del mensaje de solicitud de
{ "name": "Azure" }. Presione Entrar para enviar este mensaje de solicitud a la función.Una vez que se haya devuelto una respuesta, presione Ctrl + C para detener Core Tools.
Comprobación de que se ha creado un documento JSON
En Azure Portal, vuelva a su cuenta de Azure Cosmos DB y seleccione Explorador de datos.
Expanda la base de datos y el contenedor, y seleccione Elementos para enumerar los documentos creados en el contenedor.
Compruebe que el enlace de salida ha creado un documento JSON.
Reimplementación y comprobación de la aplicación actualizada
En Visual Studio Code, presione F1 para abrir la paleta de comandos. En la paleta de comandos, busque y seleccione
Azure Functions: Deploy to function app....Elija la aplicación de funciones que creó en el primer artículo. Dado que va a volver a implementar el proyecto en la misma aplicación, seleccione Implementar para descartar la advertencia sobre la sobrescritura de archivos.
Una vez finalizada la implementación, puede volver a usar la característica Execute Function Now... (Ejecutar la función ahora...) para desencadenar la función en Azure.
Vuelva a comprobar los documentos creados en el contenedor de Azure Cosmos DB para tener la certeza de que el enlace de salida vuelve a generar un nuevo documento JSON.
Limpieza de recursos
En Azure, los recursos son aplicaciones de funciones, funciones o cuentas de almacenamiento, entre otros. Se agrupan en grupos de recursos y se puede eliminar todo el contenido de un grupo si este se elimina.
Ha creado recursos para completar estas guías de inicio rápido. Se le pueden facturar por estos recursos, dependiendo del estado de la cuentade los y precios de los servicios. Si ya no necesita los recursos, aquí se indica cómo eliminarlos:
En Visual Studio Code, presione F1 para abrir la paleta de comandos. En la paleta de comandos, busque y seleccione
Azure Functions: Open in portal.Elija una aplicación de funciones y presione Entrar. La página de la aplicación de funciones se abre en Azure Portal.
En la pestaña Información general, seleccione el vínculo con nombre junto a Grupo de recursos.
En la página Grupo de recursos, revise la lista de recursos incluidos y compruebe que son los que desea eliminar.
Seleccione Eliminar grupo de recursos y siga las instrucciones.
El proceso de eliminación tardará un par de minutos. Cuando termine, aparece una notificación durante unos segundos. También puede seleccionar el icono de campana en la parte superior de la página para ver la notificación.
Pasos siguientes
Ha actualizado la función desencadenada por HTTP para escribir documentos JSON en un contenedor de Azure Cosmos DB. Ahora, puede obtener más información sobre el desarrollo de Functions mediante Visual Studio Code: