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.

  1. 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... .

    Creación de una nueva cuenta de Azure Cosmos DB desde Visual Studio Code

  2. 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

  1. 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... .

    Creación de una nueva base de datos de Azure Cosmos DB desde Visual Studio Code

  2. Cuando se le solicite, escriba my-database como Nombre de la base de datos.

  3. Una vez creada la base de datos, haga clic con el botón derecho en su nombre y seleccione Crear colección... .

    Creación de un nuevo contenedor de Azure Cosmos DB desde Visual Studio Code

  4. Escriba la siguiente información cuando se le indique:

    • Escriba un identificador para la colección: my-container

    • Escriba 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.

  1. 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.

    Copia de la cadena de conexión de Azure Cosmos DB

  2. Presione F1 para abrir la paleta de comandos y busque y ejecute el comando Azure Functions: Add New Setting....

  3. 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.

  4. Vuelva a presionar F1 para abrir la paleta de comandos y busque y ejecute el comando Azure Functions: Download Remote Settings....

  5. 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

  1. Como en el artículo anterior, presione F5 para iniciar el proyecto de aplicación de función y Core Tools.

  2. 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 HttpExample y elija Execute Function Now... (Ejecutar la función ahora...).

    Ejecutar la función ahora desde Visual Studio Code

  3. 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.

  4. 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

  1. En Azure Portal, vuelva a su cuenta de Azure Cosmos DB y seleccione Explorador de datos.

  2. Expanda la base de datos y el contenedor, y seleccione Elementos para enumerar los documentos creados en el contenedor.

  3. Compruebe que el enlace de salida ha creado un documento JSON.

    Comprobando que se ha creado un documento en el contenedor de Azure Cosmos DB

Reimplementación y comprobación de la aplicación actualizada

  1. 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....

  2. 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.

  3. 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.

  4. 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:

  1. 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.

  2. Elija una aplicación de funciones y presione Entrar. La página de la aplicación de funciones se abre en Azure Portal.

  3. En la pestaña Información general, seleccione el vínculo con nombre junto a Grupo de recursos.

    Seleccione el grupo de recursos que se va a eliminar de la página de la aplicación de funciones.

  4. En la página Grupo de recursos, revise la lista de recursos incluidos y compruebe que son los que desea eliminar.

  5. 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: