Azure Functions: Cosmos DB Output Bindings

Effortlessly write data to Azure Cosmos DB from your Azure Functions.

Introduction

Azure Functions provide powerful output bindings for Azure Cosmos DB, enabling you to easily persist data generated by your functions into your NoSQL databases. This simplifies your application development by abstracting away the complexities of database interactions.

The Cosmos DB output binding allows your function to write documents to a specified Cosmos DB collection. You can configure this binding to insert new documents or update existing ones based on your function's logic.

How It Works

When you define a Cosmos DB output binding in your function's configuration, you specify:

Within your function code, you can then reference this binding to send data. The binding handles the creation of the document in Cosmos DB.

Configuration

You can configure Cosmos DB output bindings in your function.json file (for JavaScript, C#, Python, etc.) or via attributes in your code (for C#).

Example function.json Configuration

{
  "bindings": [
    {
      "name": "req",
      "type": "httpTrigger",
      "direction": "in",
      "methods": [
        "post"
      ]
    },
    {
      "name": "outputDocument",
      "type": "cosmosDB",
      "direction": "out",
      "databaseName": "MyDatabase",
      "collectionName": "MyCollection",
      "connectionStringSetting": "CosmosDBConnection"
    },
    {
      "name": "res",
      "type": "http",
      "direction": "out"
    }
  ]
}
                

C# Attribute Configuration Example

[FunctionName("ProcessAndSaveData")]
public static void ProcessAndSaveData(
    [HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequest req,
    [CosmosDB(
        databaseName: "MyDatabase",
        collectionName: "MyCollection",
        ConnectionStringSetting = "CosmosDBConnection")] out dynamic outputDocument)
{
    // ... function logic to populate outputDocument ...
}
                

Usage in Function Code

Once configured, you can easily write data to Cosmos DB.

JavaScript Example

module.exports = async function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');

    const newItem = {
        id: require('uuid').v4(),
        name: req.body.name,
        value: req.body.value,
        timestamp: new Date().toISOString()
    };

    context.bindings.outputDocument = newItem;

    context.res = {
        status: 201,
        body: "Item added to Cosmos DB"
    };
};
                

C# Example

using Microsoft.AspNetCore.Http;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Extensions.Logging;

public static class CosmosDbOutputFunction
{
    [FunctionName("SaveToCosmosDb")]
    public static void SaveToCosmosDb(
        [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequest req,
        [CosmosDB(
            databaseName: "MyDatabase",
            collectionName: "MyCollection",
            ConnectionStringSetting = "CosmosDBConnection")] out dynamic outputDocument,
        ILogger log)
    {
        log.LogInformation("C# HTTP trigger function processed a request to save to Cosmos DB.");

        string requestBody = new StreamReader(req.Body).ReadToEnd();
        // Assuming requestBody is JSON representing the document
        var newItem = Newtonsoft.Json.JsonConvert.DeserializeObject(requestBody);

        // Ensure an ID is present for Cosmos DB
        if (newItem.id == null) {
            newItem.id = System.Guid.NewGuid().ToString();
        }
        newItem.processedTimestamp = DateTime.UtcNow.ToString("o");

        outputDocument = newItem;

        log.LogInformation($"Document with ID '{newItem.id}' prepared for Cosmos DB.");
    }
}
                

Key Considerations