Partilhar via


Hubs de Eventos do Azure output binding for Funções do Azure

Este artigo explica como trabalhar com fixações Hubs de Eventos do Azure para Funções do Azure. O Funções do Azure suporta ligações de gatilho e saída para Event Hubs.

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

Use a associação de saída Hubs de Eventos para gravar eventos em um fluxo de eventos. Para escrever eventos em um hub de eventos, é preciso ter permissão de envio para ele.

Verifique se as referências de pacote necessárias estão em vigor antes de tentar implementar uma ligação de saída.

Importante

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

O Funções do Azure suporta dois modelos de programação para Python. A maneira como você define suas ligações depende do modelo de programação escolhido.

O modelo de programação Python v2 permite-te definir bindings usando decoradores diretamente no teu código de função Python. Para mais informações, consulte o guia para desenvolvedores Python.

Este artigo suporta ambos os modelos de programação.

Exemplo

O exemplo a seguir mostra uma função C# que grava uma cadeia de caracteres de mensagem em um hub de eventos, usando o valor de retorno do método como saída:

[Function(nameof(EventHubFunction))]
[FixedDelayRetry(5, "00:00:10")]
[EventHubOutput("dest", Connection = "EventHubConnection")]
public string EventHubFunction(
    [EventHubTrigger("src", Connection = "EventHubConnection")] string[] input,
    FunctionContext context)
{
    _logger.LogInformation("First Event Hubs triggered message: {msg}", input[0]);

    var message = $"Output message created at {DateTime.Now}";
    return message;
}

O exemplo a seguir mostra uma função TypeScript acionada por temporizador que envia uma única mensagem para um hub de eventos:

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

export async function timerTrigger1(myTimer: Timer, context: InvocationContext): Promise<string> {
    const timeStamp = new Date().toISOString();
    return `Message created at: ${timeStamp}`;
}

app.timer('timerTrigger1', {
    schedule: '0 */5 * * * *',
    return: output.eventHub({
        eventHubName: 'myeventhub',
        connection: 'MyEventHubSendAppSetting',
    }),
    handler: timerTrigger1,
});

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

const timeStamp = new Date().toISOString();
const message = `Message created at: ${timeStamp}`;
return [`1: ${message}`, `2: ${message}`];

O exemplo a seguir mostra uma função JavaScript acionada por temporizador que envia uma única mensagem para um hub de eventos:

const { app, output } = require('@azure/functions');

const eventHubOutput = output.eventHub({
    eventHubName: 'myeventhub',
    connection: 'MyEventHubSendAppSetting',
});

app.timer('timerTrigger1', {
    schedule: '0 */5 * * * *',
    return: eventHubOutput,
    handler: (myTimer, context) => {
        const timeStamp = new Date().toISOString();
        return `Message created at: ${timeStamp}`;
    },
});

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

const timeStamp = new Date().toISOString();
const message = `Message created at: ${timeStamp}`;
return [`1: ${message}`, `2: ${message}`];

Exemplos completos do PowerShell estão pendentes.

O exemplo seguinte mostra uma ligação de gatilho no hub de eventos e uma função Python que utiliza a ligação. A função grava uma mensagem em um hub de eventos. O exemplo depende se usas o modelo de programação Python v1 ou v2.

import logging
import azure.functions as func

app = func.FunctionApp()

@app.function_name(name="eventhub_output")
@app.route(route="eventhub_output")
@app.event_hub_output(arg_name="event",
                      event_hub_name="<EVENT_HUB_NAME>",
                      connection="<CONNECTION_SETTING>")
def eventhub_output(req: func.HttpRequest, event: func.Out[str]):
    body = req.get_body()
    if body is not None:
        event.set(body.decode('utf-8'))
    else:    
        logging.info('req body is none')
    return 'ok'

Aqui está código em Python que envia múltiplas mensagens:

import logging
import azure.functions as func
from typing import List

app = func.FunctionApp()

@app.function_name(name="eventhub_output")
@app.route(route="eventhub_output")
@app.event_hub_output(arg_name="event",
                      event_hub_name="<EVENT_HUB_NAME>",
                      connection="<CONNECTION_SETTING>")

def eventhub_output(req: func.HttpRequest, event: func.Out[List[str]]) -> func.HttpResponse:
    my_messages=["message1", "message2","message3"]
    event.set(my_messages)
    return func.HttpResponse(f"Messages sent")

O exemplo seguinte mostra uma função Java que escreve uma mensagem contendo o tempo atual num hub de eventos.

@FunctionName("sendTime")
@EventHubOutput(name = "event", eventHubName = "samples-workitems", connection = "AzureEventHubConnection")
public String sendTime(
   @TimerTrigger(name = "sendTimeTrigger", schedule = "0 */5 * * * *") String timerInfo)  {
     return LocalDateTime.now().toString();
 }

Na biblioteca de runtime de funções Java, use a anotação @EventHubOutput nos parâmetros cujo valor seria publicado nos Event Hubs. O parâmetro deve ser do tipo OutputBinding<T> , onde T é um POJO ou qualquer tipo nativo Java.

Atributos

As bibliotecas C# do processo de trabalho em processo e isoladas usam o atributo para configurar a ligação. Em vez disso, o script C# usa um arquivo de configuração function.json, conforme descrito no guia de script C#.

Use o [EventHubOutputAttribute] para definir uma ligação de saída para um hub de eventos, que suporta as seguintes propriedades.

Parâmetros Descrição
EventHubName O nome do hub de eventos. Quando o nome do hub de eventos também está presente na cadeia de ligação, esse valor sobrepõe-se a esta propriedade em tempo de execução.
Ligação O nome de uma configuração de aplicativo ou coleção de configurações que especifica como se conectar a Hubs de Eventos. Para saber mais, consulte Conexões.

Decoradores

Aplica-se apenas ao modelo de programação Python v2.

Para Python funções v2 definidas usando um decorador, estas propriedades são suportadas para event_hub_output:

Propriedade Descrição
arg_name O nome da variável usada no código da função que representa o evento.
event_hub_name o nome do centro de eventos. Quando o nome do hub de eventos também está presente na cadeia de ligação, esse valor sobrepõe-se a esta propriedade em tempo de execução.
connection O nome de uma configuração de aplicativo ou coleção de configurações que especifica como se conectar a Hubs de Eventos. Para saber mais, consulte Conexões.

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

Anotações

Na biblioteca de runtime de funções Java, use a anotação EventHubOutput nos parâmetros cujo valor seria publicado nos Event Hubs. As seguintes configurações são suportadas na anotação:

Configuração

Aplica-se apenas ao modelo de programação Python v1.

A tabela a seguir explica as propriedades que você pode definir no options objeto passado para o output.eventHub() método.

Propriedade Descrição
eventHubName O nome do hub de eventos. Quando o nome do hub de eventos também está presente na cadeia de ligação, esse valor sobrepõe-se a esta propriedade em tempo de execução.
conexão O nome de uma configuração de aplicativo ou coleção de configurações que especifica como se conectar a Hubs de Eventos. Para saber mais, consulte Conexões.

A tabela a seguir explica as propriedades de configuração de associação definidas no arquivo function.json, que difere de acordo com a versão do tempo de execução.

function.json propriedade Descrição
tipo Deve ser definido como eventHub.
direção Deve ser definido como out. Este parâmetro é definido automaticamente quando cria a ligação no portal Azure.
Designação O nome da variável usada no código da função que representa o evento.
eventHubName Funções 2.x e superiores. O nome do hub de eventos. Quando o nome do hub de eventos também está presente na cadeia de ligação, esse valor sobrepõe-se a esta propriedade em tempo de execução.
conexão O nome de uma configuração de aplicativo ou coleção de configurações que especifica como se conectar a Hubs de Eventos. Para saber mais, consulte Conexões.

Quando estiver desenvolvendo localmente, adicione as configurações do aplicativo no arquivo local.settings.json na Values coleção.

Utilização

O tipo de parâmetro suportado pela ligação de saída dos Hubs de Eventos depende da versão de tempo de execução do Functions, da versão do pacote de extensão e da modalidade C# usada.

Quando você deseja que a função escreva um único evento, a associação de saída dos Hubs de Eventos pode ser vinculada aos seguintes tipos:

Tipo Descrição
string O evento como uma cadeia de caracteres. Use quando o evento for texto simples.
byte[] Os bytes do evento.
Tipos serializáveis JSON Um objeto que representa o evento. Functions tenta serializar um tipo de objeto CLR (POCO) simples em dados JSON.

Quando você deseja que a função escreva vários eventos, a ligação de saída dos Hubs de Eventos pode se vincular aos seguintes tipos:

Tipo Descrição
T[] onde T é um dos tipos de evento único Uma matriz que contém vários eventos. Cada entrada representa um evento.

Para outros cenários de saída, crie e use um EventHubProducerClient com outros tipos de Azure. Mensagens.EventHubs diretamente. Veja Register Azure clientes para um exemplo de utilização da injeção de dependências para criar um tipo de cliente a partir do SDK do Azure.

Há duas opções para enviar uma mensagem de Hubs de Eventos de uma função usando a anotação EventHubOutput :

  • Valor de retorno: Ao aplicar a anotação à própria função, o valor de retorno da função é mantido como uma mensagem de Hubs de Eventos.

  • Imperativo: Para definir explicitamente o valor da mensagem, aplique a anotação a um parâmetro específico do tipo OutputBinding<T>, onde T é um POJO ou qualquer tipo nativo de Java. Com essa configuração, passar um valor para o setValue método persiste o valor como uma mensagem de Hubs de Eventos.

Exemplos completos do PowerShell estão pendentes.

Acesse a mensagem de saída retornando o valor diretamente ou usando context.extraOutputs.set().

Há duas opções para enviar uma mensagem de Hubs de Eventos de uma função:

  • Valor de retorno: defina a name propriedade em function.json como $return. Com essa configuração, o valor de retorno da função é mantido como uma mensagem de Hubs de Eventos.

  • Imperativo: Passe um valor para o método set do parâmetro declarado como um tipo out . O valor passado para set é persistido como uma mensagem dos Hubs de Eventos.

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

Ligações

A connection propriedade é uma referência à configuração do ambiente que especifica como o aplicativo deve se conectar aos Hubs de Eventos. Pode especificar:

  • O nome de uma configuração de aplicação que contém uma cadeia de ligação.
  • O nome de um prefixo partilhado para múltiplas definições de aplicação, definindo em conjunto uma ligação de identidade gerida.

Se o valor configurado for uma correspondência exata para uma única configuração e uma correspondência de prefixo para outras configurações, a correspondência exata será usada.

Sugestão

As ligações de identidade gerida são recomendadas em detrimento das cadeias de ligação para melhorar a segurança. As cadeias de ligação incluem credenciais que podem ser expostas, enquanto as identidades geridas eliminam a necessidade de gerir segredos.

Se estiveres a usar versão 5.x ou superior da extensão, em vez de usares um cadeia de ligação com um segredo, podes fazer com que a aplicação use uma identidade Microsoft Entra. Para fazer isso, você definiria as configurações sob um prefixo comum que mapeia para a connection propriedade na configuração de gatilho e vinculação.

Neste modo, a extensão requer as seguintes definições de aplicação:

Cenário baseado em modelos Descrição Tipo de identidade
<CONNECTION_NAME_PREFIX>__fullyQualifiedNamespace O namespace Hubs de Eventos totalmente qualificado. Atribuído pelo sistema ou pelo utilizador
<CONNECTION_NAME_PREFIX>__credential Deve ser definido como managedidentity. Atribuída pelo utilizador
<CONNECTION_NAME_PREFIX>__clientId A ID do cliente da identidade gerenciada atribuída pelo usuário. Atribuída pelo utilizador

O valor por que substituires <CONNECTION_NAME_PREFIX> é tratado pela extensão de ligação como o nome da definição de ligação.

Por exemplo, se a sua configuração de binding especificar connection = "EventHubConnection" uma identidade gerida atribuída pelo utilizador, deve configurar as seguintes definições de aplicação:

{
    "EventHubConnection__fullyQualifiedNamespace": "myeventhubns.servicebus.windows.net",
    "EventHubConnection__credential": "managedidentity",
    "EventHubConnection__clientId": "00000000-0000-0000-0000-000000000000"
}

Sugestão

Use identidades geridas atribuídas pelo utilizador para cenários de produção onde precisa de controlo detalhado sobre permissões de identidade em múltiplos recursos.

Pode usar definições adicionais no modelo para personalizar ainda mais a ligação. Consulte Propriedades comuns para conexões baseadas em identidade.

Nota

Ao usar Azure App Configuration ou Key Vault para fornecer definições para ligações de Identidade Gerida, os nomes de definição devem usar um separador de chave válido como : ou / em vez do __ para garantir que os nomes são resolvidos corretamente.

Por exemplo: EventHubConnection:fullyQualifiedNamespace

Quando alojadas no serviço Funções do Azure, as ligações baseadas em identidade utilizam uma identidade gerida. A identidade atribuída ao sistema é usada por padrão, embora uma identidade atribuída ao usuário possa ser especificada com as credential propriedades e clientID . Observe que nãosuporte para a configuração de uma identidade atribuída pelo usuário com uma ID de recurso. Quando executado em outros contextos, como desenvolvimento local, sua identidade de desenvolvedor é usada, embora isso possa ser personalizado. Consulte Desenvolvimento local com conexões baseadas em identidade.

Conceder permissão à identidade

Qualquer identidade que esteja sendo usada deve ter permissões para executar as ações pretendidas. Para a maioria dos serviços Azure, isto significa que precisa de atribuir um papel no Azure RBAC, usando papéis incorporados ou personalizados que forneçam essas permissões.

Importante

Algumas permissões podem ser expostas pelo serviço de destino que não são necessárias para todos os contextos. Sempre que possível, aderir ao princípio do menor privilégio, concedendo à identidade apenas os privilégios necessários. Por exemplo, se o aplicativo só precisa ser capaz de ler de uma fonte de dados, use uma função que só tenha permissão para ler. Seria inadequado atribuir uma função que também permita escrever a esse serviço, pois isso seria uma permissão excessiva para uma operação de leitura. Da mesma forma, convém garantir que a atribuição de função tenha escopo apenas sobre os recursos que precisam ser lidos.

Você precisará criar uma atribuição de função que forneça acesso ao seu hub de eventos em tempo de execução. O escopo da atribuição de função pode ser para um namespace de Hubs de Eventos ou para o próprio hub de eventos. Funções de gestão como Proprietário não são suficientes. A tabela a seguir mostra as funções internas recomendadas ao usar a extensão Hubs de Eventos em operação normal. Seu aplicativo pode exigir permissões adicionais com base no código que você escreve.

Tipo de vinculação Exemplo de funções internas
Acionador Hubs de Eventos do Azure Recetor de Dados, Hubs de Eventos do Azure Proprietário dos Dados
Vinculação de saída Hubs de Eventos do Azure Remetente de Dados

Exceções e códigos de devolução

Enlace Referência
Hubs de Eventos Guia de Operações

Próximos passos