Use conectores gerenciados no Azure Functions

Ao usar conectores gerenciados, suas funções podem reagir a eventos e operações de chamada em serviços como Microsoft 365, Microsoft Teams, SharePoint e muitos sistemas de terceiros sem precisar escrever código de configuração de webhook ou gerenciar tokens OAuth. O Azure Functions se integra ao Azure Connector Namespace para fornecer um gatilho e um SDK que permitem que você se concentre na lógica de negócios, enquanto o Azure Connector Namespace cuida de webhooks, autenticação e novas tentativas.

Note

A integração do namespace do Azure Connector para Azure Functions está atualmente em pré-visualização pública. Recursos, nomes de configuração e suporte para conectores gerenciados específicos podem mudar antes da disponibilidade geral (GA). O uso desse recurso está sujeito aos termos de uso complementares para versões prévias do Microsoft Azure.

Atualmente, apenas stacks de linguagens C#, Node.jse Python são suportados.

Como os conectores aprimoram Funções

Um namespace de conectores adiciona duas capacidades ao modelo de programação de Funções:

  • Gatilhos de conector
    Uma função é executada quando ocorre um evento em um serviço externo, como um novo e-mail no Microsoft 365, um arquivo adicionado ao SharePoint ou uma mensagem postada no Teams. O runtime expõe uma associação connectorTrigger que recebe callbacks de webhook do namespace do conector.
  • Ações do Connector SDK
    O código da sua função invoca operações de conectores por meio de clientes do SDK. O SDK cobre conectores gerenciados como Microsoft 365 Outlook, Microsoft 365 Users, Teams, SharePoint e OneDrive. Conectores gerenciados que ainda não possuem modelos SDK podem ser chamados como endpoints HTTP.

Você pode usar conectores gerenciados junto com gatilhos e vinculações clássicas de Funções, como HTTP, timer, queue, Barramento de Serviço, Event Grid e Durable Functions.

Visualizar disponibilidade

Dimensão Disponibilidade
Região de namespace do conector Centro-Oeste dos EUA (westcentralus).
O aplicativo de funções pode estar em qualquer região suportada.
Idiomas .NET 10/.NET 8 isolados, Python 3.13+, Node.js 22+ (JS/TS). Java, PowerShell e Go não são suportados.
Planos de hospedagem Flex Consumption (recomendado), Premium, Dedicado e Apps de Container.
Preços Preço de funções padrão: sem preço extra para gatilho de conector/SDK durante a versão preliminar.
O namespace do conector tem cobrança separada.

Quando usar conectores

Use conectores quando suas funções precisam interagir principalmente com serviços externos, em vez de rodar lógica personalizada complexa. Considere estas maneiras de usar conectores gerenciados em seus aplicativos de função:

  • Reagir a eventos externos
    Seu app deve lidar com eventos gerados por serviços conectados externamente (novos e-mails, convites de calendário, arquivos, itens da lista, atividade do Teams), mas você não quer gastar esforço codificando registros de webhooks, validação de handshake e atualizações OAuth. Considere um caso em que sua função é executada para processar novos e-mails entregues em uma pasta Office 365 Outlook monitorada, classifica a mensagem, chama a Conector do Office 365 para enriquecimento e sinaliza ou move o e-mail. Todo esse trabalho distribuído é feito pelo aplicativo sem jamais se preocupar com tokens de atualização, manipulados pelo namespace do conector.

  • Substituir clientes de serviço personalizados
    O código da sua função já chama APIs do Microsoft 365 ou de terceiros por meio de clientes HTTP personalizados, o que exige que você gerencie segredos, escopos e políticas de repetição em várias conexões, o que pode rapidamente se transformar em um ônus de manutenção. Você pode, em vez disso, usar os clientes tipados nos SDKs de conectores diretamente no seu código de função e deixar os conectores gerenciados cuidarem das conexões sozinhos.

  • Aproveite uma implantação de aplicativo existente
    Você já construiu um projeto de aplicativo de funções orientado a eventos com pipeline de implantação e ferramentas de monitoramento. Você pode usar conectores gerenciados para adicionar uma nova função externa baseada em gatilhos de serviço no mesmo projeto e aproveitar a infraestrutura existente. Por exemplo, um aplicativo de funções que antes dependia de filas de mensagens ou Logic Apps agora pode reagir diretamente à atividade do Teams e se conectar ao Office 365 para verificações dentro da organização e consultas de gerenciadores.

  • Fluxos de trabalho autônomos
    Você está criando fluxos de trabalho nos quais uma função recebe um evento, raciocina com um modelo de IA e, em seguida, executa ações em um serviço externo por meio de uma operação de conector. Você pode aproveitar o runtime de agentes sem servidor para programar o fluxo de trabalho de agente, e ainda aproveitar gatilhos baseados no conector gerenciados e os SDKs de conector gerenciados.

  • Controle centrado no código com integração gerenciada
    Você quer conectores gerenciados para simplificar a comunicação de entrada e saída com um serviço externo, mas prefere um modelo de programação centrado em código e controle total sobre a orquestração, incluindo ramificações, o gerenciamento da autenticação entre as etapas e a reutilização das suas bibliotecas existentes.

    Dica

    Quando a carga de trabalho é pura orquestração entre conectores, sem código personalizado, o Logic Apps Standard continua sendo a escolha mais simples. Para mais informações, veja Relação com outras opções de integração com o Azure.

Relação com outras opções de integração Azure

Conectores gerenciados no Azure Functions são aditivos. A escolha certa depende de quanto código personalizado a carga de trabalho exige e se a equipe prefere um designer visual ou código.

Opção Mais adequado para... Você recebe...
Logic Apps Standard Orquestrar um fluxo de trabalho entre conectores; a equipe prefere um designer visual; Pouco código personalizado entre as etapas. Designer de baixo código para o mesmo ecossistema de conectores.
Azure Functions com conectores gerenciados Entre as experiências de código primeiro estão ramificação personalizada, bibliotecas em processo, outras associações e chamadas de modelo de IA entre gatilho e ação. Criação em .NET, Python ou Node.js; implantação e monitoramento de funções; sem código de webhook ou OAuth para serviços externos.
Gatilhos HTTP com SDKs de serviço Casos em que não existe um conector gerenciado para o serviço alvo ou você precisa de controles em nível de protocolo que não são fornecidos pelo conector. Controle total sobre autenticação, novas tentativas e validação de webhook; sem requisitos para um namespace de conectores.

Um único aplicativo de funções pode combinar todos os três padrões. Você pode adicionar um gatilho de conector a um aplicativo existente acionado por HTTP e adotar clientes SDK de forma incremental.

Pacotes e pré-requisitos

Cada linguagem compatível tem um pequeno conjunto de pacotes que incluem a associação de gatilho e os clientes de SDK do conector.

O pacote de extensão do trabalhador envia a associação de gatilho do conector. Os pacotes Azure.Connectors.Sdk.* (um por conector) acompanham payloads tipados e clientes do SDK.

dotnet add package Microsoft.Azure.Functions.Worker.Extensions.Connector --prerelease
dotnet add package Azure.Connectors.Sdk --prerelease

Para o worker isolado do .NET, use net8.0 ou net10.0 e a versão mais recente do worker do Functions.

O Python usa o pacote de extensões de versão preliminar para carregar o vínculo de gatilho e o pacote azurefunctions-extensions-connectors para modelos tipados do Office 365. Adicione o pacote a host.json:

{
    "version": "2.0",
    "extensionBundle": {
        "id": "Microsoft.Azure.Functions.ExtensionBundle.Preview",
        "version": "[4.42.0, 5.0.0)"
    }
}

Instale os pacotes de runtime e de extensão:

pip install "azure-functions>=2.2.0b4"
pip install azurefunctions-extensions-connectors

O decorador @app.connector_trigger funciona com todos os tipos de conectores gerenciados. Os modelos de payload tipados estão sendo ativamente desenvolvidos e adicionados por meio do pacote azurefunctions-extensions-connectors. Para conectores gerenciados sem modelos tipados, trate a carga útil como uma string.

Node.js usa o pacote de extensões experimental para carregar a vinculação de gatilho. Adicione o pacote a host.json:

{
    "version": "2.0",
    "extensionBundle": {
        "id": "Microsoft.Azure.Functions.ExtensionBundle.Preview",
        "version": "[4.42.0, 5.0.0)"
    }
}

Instale a biblioteca de funções e os pacotes do conector:

npm install @azure/functions
npm install @azure/functions-extensions-connectors
npm install @azure/connectors

Use os pontos de entrada digitados em @azure/functions-extensions-connectors (por exemplo, connectors.office365.onNewEmail) quando existem modelos digitados. Use app.connectorTrigger de @azure/functions para qualquer conector gerenciado quando você quiser o payload bruto.

não há suporte para Java e PowerShell na versão prévia pública. Veja a disponibilidade do Preview para a lista atual de runtimes suportados.

Gatilhos baseados em conectores

Um gatilho baseado em conector gerenciado executa a função quando ocorre um evento no serviço conectado. O namespace do conector entrega o evento ao aplicativo de função via HTTPS usando o ponto de extremidade de webhook da extensão do conector:

POST /runtime/webhooks/connector?functionName={FunctionName}&code={connector_extension_key}

{FunctionName} Corresponde ao nome do seu [Function] atributo. {connector_extension_key} é o valor de uma chave do sistema que você recupera executando:

{FunctionName} corresponde ao nome no decorador @app.function_name. {connector_extension_key} é o valor de uma chave do sistema que você recupera executando:

{FunctionName} corresponde ao nome usado no registro do gatilho. {connector_extension_key} é o valor de uma chave do sistema que você recupera executando:

az functionapp keys list \
    --resource-group <resource-group> \
    --name <function-app> \
    --query "systemKeys.connector_extension" \
    --output tsv

A configuração do gatilho no namespace do conector armazena essa URL de retorno de chamada e envia a chave do sistema em cada retorno de chamada. O runtime Functions valida a chave antes de executar sua função. Para uma configuração sem usar segredos compartilhados, você pode colocar a autenticação interna do Serviço de Aplicativo à frente do aplicativo de funções e validar um token de identidade gerenciada do namespace do conector. Veja exemplo .NET: autenticação embutida com identidade gerenciada para o padrão completo.

Dica

Use o plano Flex Consumption para funções acionadas por conector durante a versão prévia. O Consumo Flexível oferece suporte ao dimensionamento por instância e à identidade gerenciada, alinhados ao modelo de autenticação da plataforma de conectores.

As cargas de solicitação carregam o corpo do evento mais um conjunto de x-ms-* cabeçalhos que identificam a configuração do gatilho, a conexão, o tipo de evento e uma ID de correlação. Quando o conector gerenciado tem um modelo SDK, o runtime desserializa diretamente o payload nesse modelo. Para conectores gerenciados sem SDKs de cliente, sua função recebe o corpo JSON bruto.

O exemplo a seguir mostra uma função que é acionada quando um novo email chega em uma caixa de correio Office 365 Outlook. O registro do gatilho é por idioma; a configuração do gatilho no namespace do conector é a mesma em todos os casos.

using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Extensions.Connector;
using Azure.Connectors.Sdk.Office365.Models;
using Microsoft.Extensions.Logging;

public class OnNewEmail
{
    private readonly ILogger<OnNewEmail> _logger;

    public OnNewEmail(ILogger<OnNewEmail> logger) => _logger = logger;

    [Function("OnNewEmail")]
    public IActionResult Run(
        [ConnectorTrigger()] Office365OnNewEmailTriggerPayload payload)
    {
        var emails = payload?.Body?.Value ?? [];
        foreach (var email in emails)
        {
            _logger.LogInformation(
                "Received email from {From} with subject '{Subject}'.",
                email.From, email.Subject);
        }

        return new OkResult();
    }
}

O modelo Office365OnNewEmailTriggerPayload e outros tipos de payload de operação vêm de Azure.Connectors.Sdk.Office365.Models. Para o mapeamento completo de operação para payload, consulte Mapeamento de assinaturas de operações para o Azure Functions.

import azure.functions as func
import json
import logging

app = func.FunctionApp()

@app.function_name(name="OnNewEmail")
@app.connector_trigger(arg_name="payload")
def on_new_email(payload: str) -> None:
    data = json.loads(payload)
    emails = data.get("body", {}).get("value", [])
    for email in emails:
        logging.info(
            "Received email from %s with subject '%s'.",
            email.get("from"), email.get("subject"))

Especificamente para a operação do Office 365 OnNewEmailV3, você pode usar o decorador tipado de azurefunctions-extensions-connectors:

import azure.functions as func
import azurefunctions.extensions.connectors.office365 as office365
import logging

app = func.FunctionApp()

@app.function_name(name="OnNewEmail")
@app.connector_trigger(arg_name="email")
def on_new_email(email: office365.ClientReceiveMessage) -> None:
    logging.info(
        "Received email from %s with subject '%s'.",
        email.from_, email.subject)
import { InvocationContext } from '@azure/functions';
import {
    connectors,
    EmailTriggerContext,
} from '@azure/functions-extensions-connectors';

connectors.office365.onNewEmail('OnNewEmail', {
    handler: async (
        context: EmailTriggerContext,
        invocationContext: InvocationContext,
    ) => {
        for (const email of context.emails) {
            invocationContext.log(
                `Received email from '${email.from}' with subject '${email.subject}'.`,
            );
        }
    },
});

Para qualquer conector que ainda não tenha um ponto de entrada tipado, use o genérico app.connectorTrigger de @azure/functions:

import { app, InvocationContext } from '@azure/functions';

app.connectorTrigger('OnNewItem', {
    handler: async (payload: unknown, context: InvocationContext) => {
        const data = typeof payload === 'string' ? JSON.parse(payload) : payload;
        const items: Record<string, unknown>[] = (data as any)?.body?.value ?? [];
        for (const item of items) {
            context.log(`Item ID: ${item.Id}`);
        }
    },
});

O gatilho do conector não está disponível neste idioma para a versão preliminar pública.

Você cria a configuração do gatilho no namespace do conector usando a CLI do Azure, ARM ou Bicep. Essa etapa faz parte da plataforma de conectores e está documentada no conjunto de conteúdo de conectores. O Functions não vem com seus próprios comandos de configuração para registro de gatilhos.

Autentique suas funções em um namespace de conectores

Note

Esta seção aborda a autenticação entre o namespace do conector e seu aplicativo de função. Para saber como o namespace dos conectores se autentica para serviços upstream (Microsoft 365, Teams, SharePoint), veja a visão geral dos conectores do Azure.

O modelo padrão de autenticação usa uma chave de sistema compartilhada (connector_extension) que o namespace do conector apresenta em cada callback. No entanto, o escopo das chaves compartilhadas não pode ser definido por gatilho e exige rodízio coordenado entre o aplicativo de funções e o namespace do conector. Para cargas de trabalho de produção, use em vez disso a autenticação integrada do App Service (também chamada de Easy Auth) com uma identidade gerenciada.

Nesse padrão, o namespace do conector usa a própria identidade gerenciada atribuída pelo usuário ou pelo sistema para solicitar um token do Entra ID para cada retorno de chamada. O aplicativo de funções valida esse token, incluindo o público-alvo, o emissor e a ID do objeto do chamador antes que qualquer solicitação chegue ao host do Functions. Sem chaves compartilhadas, sem segredos do cliente, em qualquer lugar.

Para um exemplo de funcionamento de ponta a ponta, veja este repositório: functions-connectors-net-builtinauth.

Configuração do aplicativo de funções

A autenticação interna é executada no limite de trabalho do Serviço de Aplicativo, antes que o runtime do Functions obtenha a solicitação. Você o configura por meio da authsettingsV2 propriedade ARM ou equivalente em Bicep.

Setting Purpose
requireAuthentication: true Rejeita qualquer solicitação sem um token válido (retorna 401).
identityProviders.azureActiveDirectory.enabled: true Valida tokens do Entra ID.
registration.clientId O ID do aplicativo (cliente) do registro de aplicativo do Entra em relação ao qual a autenticação integrada valida os tokens.
registration.openIdIssuer A URL do emissor do seu locatário: https://login.microsoftonline.com/{tenantId}/v2.0.
validation.allowedAudiences O ID do cliente e o URI de identificador do aplicativo Entra. Os tokens devem conter um destes públicos na reclamação aud.
validation.defaultAuthorizationPolicy.allowedPrincipals.identities Os IDs de objeto (entidade) das identidades gerenciadas autorizadas a chamar a função. Apenas a identidade gerenciada do namespace do conector deve ser listada aqui. Qualquer token com uma declaração oid diferente recebe um erro 403.

O aplicativo de funções também precisa de uma identidade gerenciada atribuída pelo usuário federada ao registro do aplicativo Entra. A autenticação interna usa essa FIC ( credencial de identidade federada ) para criar declarações de cliente para o aplicativo Entra sem armazenar um segredo do cliente. O padrão bicep define clientSecretSettingName como uma configuração de aplicativo que contém a ID do cliente do MI atribuída pelo usuário, informando a autenticação interna para usar FIC em vez de um segredo.

Como a autenticação interna já valida todas as solicitações, você pode desativar a verificação redundante da chave do sistema em host.json, que teria a seguinte aparência neste fragmento JSON:

{
    ...
    "extensions": {
        "connector": {
            "system": {
                "webhookAuthorizationLevel": "Anonymous"
            }
        }
    }
}

Configuração do namespace do conector

O namespace do conector deve ter uma identidade gerenciada atribuída pelo sistema ou pelo usuário habilitada e anexada. Ao criar a configuração do trigger, especifique authentication.type = ManagedServiceIdentity e authentication.identity = <resource-id-of-managed-identity> para uma identidade atribuída pelo usuário ou omita identity uma identidade atribuída pelo sistema. Também especifique authentication.audience = <entra-app-client-id> para que o runtime do conector saiba qual público solicitar no token.

O runtime do conector usa essa identidade gerenciada para gerar um token do Entra ID em cada retorno de chamada. Nesse token, iss (emissor) é o locatário, aud (audiência) é a ID do cliente do aplicativo Entra e oid (ID do objeto) é a ID principal da identidade. A autenticação interna valida os três.

O recurso de namespace do conector também precisa de acesso à conexão, como uma conexão office365. Conceda esse acesso por meio de uma política de acesso que lista o ID principal da identidade gerenciada. O arquivo bicep de exemplo mostra a configuração completa tanto para a identidade do namespace quanto para a política de acesso à conexão.

O que é imposto

A autenticação integrada valida tokens na ordem:

  1. Presença de token – token ausente ou expirado → 401
  2. Assinatura - verificada com base no JWKS do emissor para seu locatário
  3. iss (emissor) – Deve corresponder openIdIssuer
  4. aud (audiência) – deve estar em allowedAudiences
  5. oid (ID da entidade/objeto) - deve corresponder a uma das identidades em allowedPrincipals.identities. Qualquer outra identidade → 403

Como essa verificação é executada na borda do Serviço de Aplicativo, o código da função jamais vê uma solicitação que não tenha vindo da identidade gerenciada do namespace do conector. Você não precisa de nenhum código de aplicação para a verificação de acesso.

Fluxo de autenticação

┌─────────────────────────────────────────────────────────────────┐
│  Connector namespace  (westcentralus)                           │
│  • System-assigned or user-assigned managed identity enabled    │
│  • Trigger config: authentication.type = ManagedServiceIdentity │
│                    authentication.audience = <Entra app ID>     │
│                    callbackUrl = https://<func>/runtime/…       │
└────────────────────────┬───────────────────────────────────────┘
                         │
                         │  POST callbackUrl
                         │  Authorization: Bearer <AAD token>
                         │     iss = your tenant
                         │     aud = Entra app clientId
                         │     oid = managed identity principalId
                         ▼
┌──────────────────────────────────────────────────────────────┐
│  Function App  (any region)                                  │
│                                                              │
│   ┌──────────────────────────────────────────────────────┐   │
│   │ Built-in authentication  (App Service edge)          │   │
│   │   • Validates signature, iss, aud, exp               │   │
│   │   • Checks oid ∈ allowedPrincipals.identities        │   │
│   │   → No token  → 401                                  │   │
│   │   → Wrong oid → 403                                  │   │
│   └────────────────────┬─────────────────────────────────┘   │
│                        │ pass                                │
│                        ▼                                     │
│   ┌──────────────────────────────────────────────────────┐   │
│   │ /runtime/webhooks/connector                          │   │
│   │   (webhookAuthorizationLevel = Anonymous)            │   │
│   └────────────────────┬─────────────────────────────────┘   │
│                        ▼                                     │
│   ┌──────────────────────────────────────────────────────┐   │
│   │ Your function(payload)                               │   │
│   └──────────────────────────────────────────────────────┘   │
└──────────────────────────────────────────────────────────────┘
                         ▲
                         │ FIC (federated identity credential)
         ┌───────────────┴────────────────┐
         │  Entra app registration         │
         │  (federated to function-app MI) │
         └─────────────────────────────────┘

Usando conectores em seu código

O SDK do conector permite que sua função chame operações do conector como ações de saída. A superfície cliente usa o mesmo conector gerenciado subjacente no namespace do conector que dispara o uso, logo, um único conector gerenciado pode alimentar tanto os gatilhos de entrada quanto as chamadas de saída para a mesma conta de serviço.

Em .NET, cada conector envia um cliente tipado (por exemplo, Office365Client, Office365UsersClient, TeamsClient) em Azure.Connectors.Sdk.{Service}. O construtor cliente recebe a URL de runtime da conexão e uma credencial.

O padrão a seguir é do exemplo do Teams para pesquisa de usuário por email de ponta a ponta:

using Azure.Core;
using Azure.Identity;
using Azure.Connectors.Sdk.Office365;
using Azure.Connectors.Sdk.Office365Users;
using Azure.Connectors.Sdk.Teams;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

var credential = new DefaultAzureCredential(new DefaultAzureCredentialOptions
{
    ManagedIdentityClientId = Environment.GetEnvironmentVariable("AZURE_CLIENT_ID")
});

var host = new HostBuilder()
    .ConfigureFunctionsWebApplication()
    .ConfigureServices(services =>
    {
        services.AddSingleton<TokenCredential>(credential);

        services.AddSingleton(sp => new Office365Client(
            new Uri(Environment.GetEnvironmentVariable("OFFICE365_CONNECTION_RUNTIME_URL")!),
            sp.GetRequiredService<TokenCredential>()));

        services.AddSingleton(sp => new Office365UsersClient(
            new Uri(Environment.GetEnvironmentVariable("OFFICE365USERS_CONNECTION_RUNTIME_URL")!),
            sp.GetRequiredService<TokenCredential>()));

        services.AddSingleton(sp => new TeamsClient(
            new Uri(Environment.GetEnvironmentVariable("TEAMS_CONNECTION_RUNTIME_URL")!),
            sp.GetRequiredService<TokenCredential>()));
    })
    .Build();

host.Run();

As configurações de *_CONNECTION_RUNTIME_URL apontam para o ponto de extremidade de runtime por conexão no namespace do conector. Injete os clientes na sua função e chame métodos tipados, como UserProfileAsync, GetEmailsAsync ou FlagAsync. Você também pode chamar clientes do SDK de gatilhos não conectores (por exemplo, um gatilho HTTP que é colocado no Teams).

Em Python, instale azure-connectors para clientes tipados (por exemplo, office365, teams, office365Users). Os clientes aceitam a URL de runtime por conexão e uma credencial. A cobertura de ação do SDK está se expandindo.

Em Node.js, instale @azure/connectors para clientes tipados (por exemplo, office365, teams, office365Users). Os clientes aceitam a URL de runtime por conexão e uma credencial. A cobertura de ação do SDK está se expandindo.

O SDK do conector não está disponível nesses idiomas na versão preliminar pública.