Azure Cosmos DB associação de saída para Azure Functions 2.x e superior

A associação de saída Azure Cosmos DB permite que você escreva um novo documento em um banco de dados Azure Cosmos DB usando a API do SQL.

Para obter informações sobre a instalação e detalhes de configuração, confira a visão geral.

Importante

Este artigo usa guias para dar suporte a várias versões do modelo de programação Node.js. O modelo v4 normalmente está disponível e foi projetado para oferecer uma experiência mais flexível e intuitiva para desenvolvedores de JavaScript e TypeScript. Para obter mais detalhes sobre como o modelo v4 funciona, consulte o Azure Functions Node.js guia do desenvolvedor. Para saber mais sobre as diferenças entre os modelos v3 e a v4, consulte o Guia de migração.

Azure Functions dá suporte a dois modelos de programação para Python. A maneira como você define suas associações depende do modelo de programação escolhido.

O modelo de programação Python v2 permite definir associações usando decoradores diretamente em seu código de função Python. Para obter mais informações, consulte o guia do desenvolvedor Python.

Este artigo dá suporte a ambos os modelos de programação.

A função C# pode ser criada por meio de um dos seguintes modos C#:

  • Modelo de trabalho isolado: função C# compilada executada em um processo de trabalho que está isolado do runtime. O processo de trabalho isolado é necessário para dar suporte a funções C# em execução em versões LTS e não LTS .NET e no .NET Framework. As extensões para funções de processo de trabalho isoladas usam namespaces Microsoft.Azure.Functions.Worker.Extensions.*.
  • Modelo em processo: função C# compilada no mesmo processo que o runtime do Functions. Em uma variação desse modelo, o Functions pode ser executado usando scripts C#, que é compatível principalmente com a edição do portal C#. As extensões para funções em processo usam namespaces Microsoft.Azure.WebJobs.Extensions.*.

Exemplo

A menos que indicado de outra forma, os exemplos neste artigo têm como destino a versão 3.x da extensão Azure Cosmos DB. Para uso com a extensão versão 4.x, você precisa substituir a cadeia de caracteres collection nos nomes de propriedade e atributo por container e connection_string_setting com connection.

O suporte do Go não está disponível para essa ligação no momento.

O código a seguir define um tipo MyDocument:

No exemplo a seguir, o tipo de retorno é IReadOnlyList<T>, que é uma lista modificada de documentos do parâmetro de associação de gatilho:

Gatilho de fila, salva a mensagem ao banco de dados por meio do valor de retorno

O exemplo a seguir mostra uma função Java que adiciona um documento a um banco de dados com dados de uma mensagem no Armazenamento de Filas.

@FunctionName("getItem")
@CosmosDBOutput(name = "database",
  databaseName = "ToDoList",
  collectionName = "Items",
  connectionStringSetting = "AzureCosmosDBConnection")
public String cosmosDbQueryById(
    @QueueTrigger(name = "msg",
      queueName = "myqueue-items",
      connection = "AzureWebJobsStorage")
    String message,
    final ExecutionContext context)  {
     return "{ id: \"" + System.currentTimeMillis() + "\", Description: " + message + " }";
   }

Gatilho HTTP, salva um documento ao banco de dados por meio do valor de retorno

O exemplo a seguir mostra uma função Java cuja assinatura é anotada com @CosmosDBOutput e tem o valor retornado do tipo String. O documento JSON retornado pela função é gravado automaticamente na coleção de Azure Cosmos DB correspondente.

    @FunctionName("WriteOneDoc")
    @CosmosDBOutput(name = "database",
      databaseName = "ToDoList",
      collectionName = "Items",
      connectionStringSetting = "Cosmos_DB_Connection_String")
    public String run(
            @HttpTrigger(name = "req",
              methods = {HttpMethod.GET, HttpMethod.POST},
              authLevel = AuthorizationLevel.ANONYMOUS)
            HttpRequestMessage<Optional<String>> request,
            final ExecutionContext context) {

        // Item list
        context.getLogger().info("Parameters are: " + request.getQueryParameters());

        // Parse query parameter
        String query = request.getQueryParameters().get("desc");
        String name = request.getBody().orElse(query);

        // Generate random ID
        final int id = Math.abs(new Random().nextInt());

        // Generate document
        final String jsonDocument = "{\"id\":\"" + id + "\", " +
                                    "\"description\": \"" + name + "\"}";

        context.getLogger().info("Document to be saved: " + jsonDocument);

        return jsonDocument;
    }

Gatilho HTTP, salva um documento ao banco de dados por meio do valor de OutputBinding

O exemplo a seguir mostra uma função Java que grava um documento para Azure Cosmos DB por meio de um parâmetro de saída OutputBinding<T>. Neste exemplo, o parâmetro outputItem precisa ser anotado com @CosmosDBOutput, não a assinatura de função. Usar OutputBinding<T> permite que sua função aproveite a associação para gravar o documento em Azure Cosmos DB ao mesmo tempo em que permite retornar um valor diferente para o chamador de função, como um documento JSON ou XML.

    @FunctionName("WriteOneDocOutputBinding")
    public HttpResponseMessage run(
            @HttpTrigger(name = "req",
              methods = {HttpMethod.GET, HttpMethod.POST},
              authLevel = AuthorizationLevel.ANONYMOUS)
            HttpRequestMessage<Optional<String>> request,
            @CosmosDBOutput(name = "database",
              databaseName = "ToDoList",
              collectionName = "Items",
              connectionStringSetting = "Cosmos_DB_Connection_String")
            OutputBinding<String> outputItem,
            final ExecutionContext context) {

        // Parse query parameter
        String query = request.getQueryParameters().get("desc");
        String name = request.getBody().orElse(query);

        // Item list
        context.getLogger().info("Parameters are: " + request.getQueryParameters());

        // Generate random ID
        final int id = Math.abs(new Random().nextInt());

        // Generate document
        final String jsonDocument = "{\"id\":\"" + id + "\", " +
                                    "\"description\": \"" + name + "\"}";

        context.getLogger().info("Document to be saved: " + jsonDocument);

        // Set outputItem's value to the JSON document to be saved
        outputItem.setValue(jsonDocument);

        // return a different document to the browser or calling client.
        return request.createResponseBuilder(HttpStatus.OK)
                      .body("Document created successfully.")
                      .build();
    }

Gatilho HTTP, salva vários documentos ao banco de dados por meio do valor de OutputBinding

O exemplo a seguir mostra uma função Java que grava vários documentos para Azure Cosmos DB por meio de um parâmetro de saída OutputBinding<T>. Neste exemplo, o parâmetro outputItem precisa ser anotado com @CosmosDBOutput, não a assinatura de função. O parâmetro de saída outputItem tem uma lista de objetos ToDoItem como seu tipo de parâmetro de modelo. Usar OutputBinding<T> permite que sua função aproveite a associação para gravar os documentos em Azure Cosmos DB, permitindo também retornar um valor diferente para o chamador de função, como um documento JSON ou XML.

    @FunctionName("WriteMultipleDocsOutputBinding")
    public HttpResponseMessage run(
            @HttpTrigger(name = "req",
              methods = {HttpMethod.GET, HttpMethod.POST},
              authLevel = AuthorizationLevel.ANONYMOUS)
            HttpRequestMessage<Optional<String>> request,
            @CosmosDBOutput(name = "database",
              databaseName = "ToDoList",
              collectionName = "Items",
              connectionStringSetting = "Cosmos_DB_Connection_String")
            OutputBinding<List<ToDoItem>> outputItem,
            final ExecutionContext context) {

        // Parse query parameter
        String query = request.getQueryParameters().get("desc");
        String name = request.getBody().orElse(query);

        // Item list
        context.getLogger().info("Parameters are: " + request.getQueryParameters());

        // Generate documents
        List<ToDoItem> items = new ArrayList<>();

        for (int i = 0; i < 5; i ++) {
          // Generate random ID
          final int id = Math.abs(new Random().nextInt());

          // Create ToDoItem
          ToDoItem item = new ToDoItem(String.valueOf(id), name);

          items.add(item);
        }

        // Set outputItem's value to the list of POJOs to be saved
        outputItem.setValue(items);
        context.getLogger().info("Document to be saved: " + items);

        // return a different document to the browser or calling client.
        return request.createResponseBuilder(HttpStatus.OK)
                      .body("Documents created successfully.")
                      .build();
    }

Na biblioteca Java functions runtime, use a anotação @CosmosDBOutput em parâmetros gravados em Azure Cosmos DB. O tipo de parâmetro de anotação deve ser OutputBinding<T>, em que T é um tipo de Java nativo ou um POJO.

O exemplo a seguir mostra uma função TypeScript disparada por filas de armazenamento para uma fila que recebe JSON no seguinte formato:

{
    "name": "John Henry",
    "employeeId": "123456",
    "address": "A town nearby"
}

A função cria Azure Cosmos DB documentos no seguinte formato para cada registro:

{
    "id": "John Henry-123456",
    "name": "John Henry",
    "employeeId": "123456",
    "address": "A town nearby"
}

Este é o código TypeScript:

Para gerar vários documentos, retorne uma matriz em vez de um único objeto. Por exemplo:

O exemplo a seguir mostra uma função JavaScript disparada por filas de armazenamento para uma fila que recebe JSON no seguinte formato:

{
    "name": "John Henry",
    "employeeId": "123456",
    "address": "A town nearby"
}

A função cria Azure Cosmos DB documentos no seguinte formato para cada registro:

{
    "id": "John Henry-123456",
    "name": "John Henry",
    "employeeId": "123456",
    "address": "A town nearby"
}

Aqui está o código JavaScript:

Para gerar vários documentos, retorne uma matriz em vez de um único objeto. Por exemplo:

O exemplo a seguir mostra como gravar dados em Azure Cosmos DB usando uma associação de saída. A associação é declarada no arquivo de configuração da função (functions.json) e usa dados de uma mensagem de fila e grava em um documento Azure Cosmos DB.

{ 
  "name": "EmployeeDocument",
  "type": "cosmosDB",
  "databaseName": "MyDatabase",
  "collectionName": "MyCollection",
  "createIfNotExists": true,
  "connectionStringSetting": "MyStorageConnectionAppSetting",
  "direction": "out" 
} 

No arquivo run.ps1, o objeto retornado da função é mapeado para um objeto EmployeeDocument, que é persistido no banco de dados.

param($QueueItem, $TriggerMetadata) 

Push-OutputBinding -Name EmployeeDocument -Value @{ 
    id = $QueueItem.name + '-' + $QueueItem.employeeId 
    name = $QueueItem.name 
    employeeId = $QueueItem.employeeId 
    address = $QueueItem.address 
} 

O exemplo a seguir demonstra como gravar um documento em um banco de dados Azure Cosmos DB como a saída de uma função. O exemplo depende se você usa o v1 ou v2 Python modelo de programação.

import logging
import azure.functions as func

app = func.FunctionApp()

@app.route()
@app.cosmos_db_output(arg_name="documents", 
                      database_name="DB_NAME",
                      collection_name="COLLECTION_NAME",
                      create_if_not_exists=True,
                      connection_string_setting="CONNECTION_SETTING")
def main(req: func.HttpRequest, documents: func.Out[func.Document]) -> func.HttpResponse:
    request_body = req.get_body()
    documents.set(func.Document.from_json(request_body))
    return 'OK'

Atributos

As bibliotecas C# em processo e de processo de trabalho isolado usam atributos para definir a função. Em vez disso, o script C# usa um arquivo de configuração function.json, conforme descrito no guia de script C#.

Propriedade de atributo Descrição
Conexão O nome de uma coleção de configurações ou configuração de aplicativo que especifica como se conectar à conta Azure Cosmos DB que está sendo monitorada. Para mais informações, consulte as Conexões.
DatabaseName O nome do banco de dados Azure Cosmos DB com o contêiner sendo monitorado.
ContainerName O nome do contêiner que está sendo monitorado.
CreateIfNotExists É um valor booliano para indicar se o contêiner será criado caso não exista. O padrão é false, porque os contêineres são criados com a taxa de transferência reservada, o que tem implicações de preço. Para saber mais, confira a página de preço.
PartitionKey Quando CreateIfNotExists for true, ele definirá o caminho da chave de partição para o contêiner criado. Pode incluir parâmetros de associação.
ContainerThroughput Quando CreateIfNotExists for true, ele definirá a taxa de transferência do contêiner criado.
PreferredLocations (Opcional) Define locais preferenciais (regiões) para contas de banco de dados replicadas geograficamente no serviço Azure Cosmos DB. Os valores devem ser separados por vírgulas. Por exemplo, East US,South Central US,North Europe.

Decoradores

Aplica somente para o modelo de programação Python v2.

Para Python funções v2 definidas usando um decorador, as seguintes propriedades no cosmos_db_output:

Propriedade Descrição
arg_name O nome da variável usado no código de função que representa a lista de documentos com alterações.
database_name O nome do banco de dados Azure Cosmos DB com o contêiner sendo monitorado.
container_name O nome do contêiner de Azure Cosmos DB que está sendo monitorado.
create_if_not_exists Um valor Booliano que indica se o banco de dados e a coleção devem ser criados se eles não existirem.
connection_string_setting O cadeia de conexão do Azure Cosmos DB que está sendo monitorado.

Para Python funções definidas usando function.json, consulte a seção Configuration.

Anotações

Na biblioteca Java functions runtime, use a anotação @CosmosDBOutput em parâmetros que gravam em Azure Cosmos DB. Essa anotação dá suporte às seguintes propriedades:

Configuração

Aplica somente para o modelo de programação Python v1.

A tabela a seguir explica as propriedades que você pode definir no objeto options passado para o método output.cosmosDB(). As propriedades type, direction e name não se aplicam ao modelo v4.

A tabela a seguir explica as propriedades de configuração de associação que você define no arquivo function.json. Essas propriedades se diferenciam pela versão da extensão:

Propriedade function.json Descrição
conexão O nome de uma coleção de configurações ou configuração de aplicativo que especifica como se conectar à conta Azure Cosmos DB que está sendo monitorada. Para mais informações, consulte as Conexões.
databaseName O nome do banco de dados Azure Cosmos DB com o contêiner sendo monitorado.
containerName O nome do contêiner que está sendo monitorado.
createIfNotExists É um valor booliano para indicar se o contêiner será criado caso não exista. O padrão é false, porque os contêineres são criados com a taxa de transferência reservada, o que tem implicações de preço. Para saber mais, confira a página de preço.
partitionKey Quando createIfNotExists for true, ele definirá o caminho da chave de partição para o contêiner criado. Pode incluir parâmetros de associação.
containerThroughput Quando createIfNotExists for true, ele definirá a taxa de transferência do contêiner criado.
preferredLocations (Opcional) Define locais preferenciais (regiões) para contas de banco de dados replicadas geograficamente no serviço Azure Cosmos DB. Os valores devem ser separados por vírgulas. Por exemplo, East US,South Central US,North Europe.

Consulte a Seção de exemplo para obter exemplos completos.

Uso

Por padrão, quando você grava no parâmetro de saída em sua função, um documento é criado no banco de dados. Você deve especificar a ID do documento de saída especificando a propriedade id no objeto JSON passado para o parâmetro de saída.

Observação

Ao especificar a ID de um documento existente, ela é substituída pelo novo documento de saída.

O parâmetro de função de saída deve ser definido como func.Out[func.Document]. Consulte o exemplo de saída para obter detalhes.

Os tipos específicos com suporte pela associação de saída do Cosmos DB dependem da versão de runtime do Functions, da versão do pacote de extensão e da modalidade de C# usada.

Quando você desejar que a função seja gravada em um único documento, a associação de saída do Cosmos DB poderá ser associada aos seguintes tipos:

Tipo Descrição
Tipos serializáveis JSON Um objeto que representa o conteúdo JSON de um documento. O Functions tenta serializar um tipo de objeto CLR básico (POCO) em dados JSON.

Quando você desejar que a função seja gravada em vários documentos, a associação de saída do Cosmos DB poderá ser associada aos seguintes tipos:

Tipo Descrição
T[] em que T é um tipo serializável por JSON Uma matriz que contém vários documentos. Cada entrada representa um documento.

Para outros cenários de saída, crie e use um CosmosClient com outros tipos de Microsoft.Azure. Cosmos diretamente. Consulte Register Azure clientes para obter um exemplo de como usar a injeção de dependência para criar um tipo de cliente do SDK do Azure.

conexões

As connection propriedades e leaseConnection são definidas como chaves nas configurações de aplicação que retornam valores usados pelo runtime de Funções para se conectar aos endpoints da conta do Azure Cosmos DB usados pela extensão. O valor dessas configurações de propriedade depende do tipo de conexão:

  • Conexão de identidade gerenciada: A connection propriedade é <CONNECTION_NAME_PREFIX> compartilhada por um grupo de configurações que, juntas, definem uma conexão baseada em identidade com a conta. Para mais informações, veja Definir conexões de identidade.
  • Referência Key Vault: A connection configuração de propriedade retorna uma referência ao Azure Key Vault para o local onde a cadeia de conexão é mantida centralmente. Para mais informações, veja Definir conexões do Key Vault.
  • Referência de App Configuration: A connection configuração de propriedade retorna uma referência ao Configuração de Aplicativos do Azure que retorna uma cadeia de conexão ou uma referência ao Key Vault. Para mais informações, veja Configuração de Aplicativos do Azure no artigo de conexões.
  • Connection string: A connection configuração de propriedade retorna a cadeia de conexão real da conta. Como a cadeia de conexão contém chaves secretas compartilhadas, você deve considerar usar uma conexão de identidade gerenciada, sempre que possível. Para mais informações, veja Definir conexões.

Para saber mais sobre conexões de bindings, veja Gerenciar conexão no Azure Functions. Para obter uma cadeia de conexão, navegue até sua conta do Azure Cosmos DB, selecione Chaves e então copie os valores PRIMARY CONNECTION STRING ou SECONDARY CONNECTION STRING. Essas strings de conexão contêm chaves secretas compartilhadas e devem ser mantidas seguras.

Em versões anteriores da extensão, as propriedades de conexão eram nomeadas connectionStringSetting e leaseConnectionStringSetting.

Exceções e códigos de retorno

Associação Referência
Azure Cosmos DB códigos de status HTTP para Azure Cosmos DB

Próximas etapas