Partilhar via


Hubs de Eventos do Azure trigger for Funções do Azure

Este artigo explica como trabalhar com o gatilho Hubs de Eventos do Azure para Funções do Azure. Funções do Azure suporta ligações de trigger e output para Event Hubs.

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

Use o gatilho de função para responder a um evento enviado para um fluxo de eventos do hub de eventos. Você precisa de acesso de leitura ao hub de eventos subjacente para configurar o gatilho. Quando a função é acionada, a mensagem passada para a função é digitada como uma cadeia de caracteres.

As decisões de dimensionamento dos Hubs de Eventos para os planos Consumo e Premium são feitas por meio do Target Based Scaling. Para obter mais informações, consulte Target Based Scaling.

Para informações sobre como Funções do Azure responde a eventos enviados para um fluxo de eventos de hub de eventos usando gatilhos, veja Integrar Centros de Eventos com funções serverless em Azure.

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 é acionada com base em um hub de eventos, onde a cadeia de caracteres da mensagem de entrada é gravada nos logs:

{
    private readonly ILogger<EventHubsFunction> _logger;

    public EventHubsFunction(ILogger<EventHubsFunction> logger)
    {
        _logger = logger;
    }

    [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 de gatilho de Hubs de Eventos. A função lê metadados de eventos e registra a mensagem.

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

export async function eventHubTrigger1(message: unknown, context: InvocationContext): Promise<void> {
    context.log('Event hub function processed message:', message);
    context.log('EnqueuedTimeUtc =', context.triggerMetadata.enqueuedTimeUtc);
    context.log('SequenceNumber =', context.triggerMetadata.sequenceNumber);
    context.log('Offset =', context.triggerMetadata.offset);
}

app.eventHub('eventHubTrigger1', {
    connection: 'myEventHubReadConnectionAppSetting',
    eventHubName: 'MyEventHub',
    cardinality: 'one',
    handler: eventHubTrigger1,
});

Para receber eventos em um lote, defina cardinality como many, conforme mostrado no exemplo a seguir.

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

export async function eventHubTrigger1(messages: unknown[], context: InvocationContext): Promise<void> {
    context.log(`Event hub function processed ${messages.length} messages`);
    for (let i = 0; i < messages.length; i++) {
        context.log('Event hub message:', messages[i]);
        context.log(`EnqueuedTimeUtc = ${context.triggerMetadata.enqueuedTimeUtcArray[i]}`);
        context.log(`SequenceNumber = ${context.triggerMetadata.sequenceNumberArray[i]}`);
        context.log(`Offset = ${context.triggerMetadata.offsetArray[i]}`);
    }
}

app.eventHub('eventHubTrigger1', {
    connection: 'myEventHubReadConnectionAppSetting',
    eventHubName: 'MyEventHub',
    cardinality: 'many',
    handler: eventHubTrigger1,
});

O exemplo a seguir mostra uma função JavaScript de gatilho de Hubs de Eventos. A função lê metadados de eventos e registra a mensagem.

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

app.eventHub('eventHubTrigger1', {
    connection: 'myEventHubReadConnectionAppSetting',
    eventHubName: 'MyEventHub',
    cardinality: 'one',
    handler: (message, context) => {
        context.log('Event hub function processed message:', message);
        context.log('EnqueuedTimeUtc =', context.triggerMetadata.enqueuedTimeUtc);
        context.log('SequenceNumber =', context.triggerMetadata.sequenceNumber);
        context.log('Offset =', context.triggerMetadata.offset);
    },
});

Para receber eventos em um lote, defina cardinality como many, conforme mostrado no exemplo a seguir.

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

app.eventHub('eventHubTrigger1', {
    connection: 'myEventHubReadConnectionAppSetting',
    eventHubName: 'MyEventHub',
    cardinality: 'many',
    handler: (messages, context) => {
        context.log(`Event hub function processed ${messages.length} messages`);
        for (let i = 0; i < messages.length; i++) {
            context.log('Event hub message:', messages[i]);
            context.log(`EnqueuedTimeUtc = ${context.triggerMetadata.enqueuedTimeUtcArray[i]}`);
            context.log(`SequenceNumber = ${context.triggerMetadata.sequenceNumberArray[i]}`);
            context.log(`Offset = ${context.triggerMetadata.offsetArray[i]}`);
        }
    },
});

Aqui está o código do PowerShell:

param($eventHubMessages, $TriggerMetadata)

Write-Host "PowerShell eventhub trigger function called for message array: $eventHubMessages"

$eventHubMessages | ForEach-Object { Write-Host "Processed message: $_" }

Este exemplo usa tipos de SDK para acessar diretamente o objeto subjacente EventData fornecido pelo gatilho de Hubs de Eventos:

A função lê o corpo do evento e o registra.

import logging
import azure.functions as func
import azurefunctions.extensions.bindings.eventhub as eh

app = func.FunctionApp(http_auth_level=func.AuthLevel.FUNCTION)

@app.event_hub_message_trigger(
    arg_name="event", event_hub_name="EVENTHUB_NAME", connection="EventHubConnection"
)
def eventhub_trigger(event: eh.EventData):
    logging.info(
        "Python EventHub trigger processed an event %s",
        event.body_as_str()
    )

Para exemplos de utilização do tipo EventData, veja as amostras EventData. Para um tutorial passo a passo sobre como incluir associações do tipo SDK na sua aplicação de funções, siga o Exemplo Python Associações SDK para Centros de Eventos.

Nota

As limitações conhecidas incluem:

  • A enqueued_time propriedade não é suportada.
  • O suporte a mensagens em lote é suportado com a versão de tempo de execução 4.1039 ou superior.

Para saber mais, incluindo quais outras associações de tipo SDK são suportadas, consulte Associações de tipo SDK.

O exemplo seguinte mostra uma ligação de gatilhos no Event Hubs e uma função Python que utiliza a vinculação. A função lê metadados de eventos e registra a mensagem. 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="EventHubTrigger1")
@app.event_hub_message_trigger(arg_name="myhub", 
                               event_hub_name="<EVENT_HUB_NAME>",
                               connection="<CONNECTION_SETTING>") 
def test_function(myhub: func.EventHubEvent):
    logging.info('Python EventHub trigger processed an event: %s',
                myhub.get_body().decode('utf-8'))

O exemplo a seguir mostra uma ligação de gatilho de Hubs de Eventos que registra o corpo da mensagem do gatilho de Hubs de Eventos.

@FunctionName("ehprocessor")
public void eventHubProcessor(
  @EventHubTrigger(name = "msg",
                  eventHubName = "myeventhubname",
                  connection = "myconnvarname") String message,
       final ExecutionContext context )
       {
          context.getLogger().info(message);
 }

Na biblioteca de runtime de funções Java, use a anotação EventHubTrigger nos parâmetros cujo valor provém do hub de eventos. Os parâmetros com essas anotações fazem com que a função seja executada quando um evento chega. Esta anotação pode ser usada com tipos nativos de Java, POJOs ou valores anuláveis usando Optional<T>.

O exemplo a seguir ilustra o uso extensivo e outras opções de SystemProperties Binding para introspeção adicional do Evento, juntamente com o fornecimento de um caminho bem formado BlobOutput que é hierárquico de Data.

package com.example;
import java.util.Map;
import java.time.ZonedDateTime;

import com.microsoft.azure.functions.annotation.*;
import com.microsoft.azure.functions.*;

/**
 * Azure Functions with Event Hub trigger.
 * and Blob Output using date in path along with message partition ID
 * and message sequence number from EventHub Trigger Properties
 */
public class EventHubReceiver {

    @FunctionName("EventHubReceiver")
    @StorageAccount("bloboutput")

    public void run(
            @EventHubTrigger(name = "message",
                eventHubName = "%eventhub%",
                consumerGroup = "%consumergroup%",
                connection = "eventhubconnection",
                cardinality = Cardinality.ONE)
            String message,

            final ExecutionContext context,

            @BindingName("Properties") Map<String, Object> properties,
            @BindingName("SystemProperties") Map<String, Object> systemProperties,
            @BindingName("PartitionContext") Map<String, Object> partitionContext,
            @BindingName("EnqueuedTimeUtc") Object enqueuedTimeUtc,

            @BlobOutput(
                name = "outputItem",
                path = "iotevents/{datetime:yy}/{datetime:MM}/{datetime:dd}/{datetime:HH}/" +
                       "{datetime:mm}/{PartitionContext.PartitionId}/{SystemProperties.SequenceNumber}.json")
            OutputBinding<String> outputItem) {

        var et = ZonedDateTime.parse(enqueuedTimeUtc + "Z"); // needed as the UTC time presented does not have a TZ
                                                             // indicator
        context.getLogger().info("Event hub message received: " + message + ", properties: " + properties);
        context.getLogger().info("Properties: " + properties);
        context.getLogger().info("System Properties: " + systemProperties);
        context.getLogger().info("partitionContext: " + partitionContext);
        context.getLogger().info("EnqueuedTimeUtc: " + et);

        outputItem.setValue(message);
    }
}

Atributos

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

Use o para definir um gatilho EventHubTriggerAttribute em um hub de eventos, que oferece suporte às 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. Pode ser referenciado nas configurações do aplicativo, como %eventHubName%
Grupo de Consumidores Uma propriedade opcional que define o grupo de consumidores usado para se inscrever em eventos no hub. Quando omitido, o grupo de $Default consumidores é utilizado.
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, as seguintes propriedades no event_hub_message_trigger:

Propriedade Descrição
arg_name O nome da variável que representa o item de evento no código de função.
event_hub_name 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.
connection O nome de uma configuração de aplicativo ou coleção de configurações que especifica como se conectar a Hubs de Eventos. 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 EventHubTrigger, que suporta as seguintes definições:

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 app.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. Pode ser referenciado através das definições da aplicação %eventHubName%
Grupo de consumidores Uma propriedade opcional que define o grupo de consumidores usado para se inscrever em eventos no hub. Em caso de omissão, utiliza-se o grupo de $Default consumidores.
cardinalidade Defina como many para habilitar o envio em lote. Se omitida ou definida como one, uma única mensagem é passada para a funçã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. Consulte Conexões.

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

function.json propriedade Descrição
tipo Deve ser definido como eventHubTrigger. Esta propriedade é definida automaticamente quando cria o gatilho no portal Azure.
direção Deve ser definido como in. Esta propriedade é definida automaticamente quando cria o gatilho no portal Azure.
Designação O nome da variável que representa o item de evento no código de funçã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. Pode ser referenciado através das definições da aplicação %eventHubName%
Grupo de consumidores Uma propriedade opcional que define o grupo de consumidores usado para se inscrever em eventos no hub. Em caso de omissão, utiliza-se o grupo de $Default consumidores.
cardinalidade Defina como many para habilitar o envio em lote. Se omitida ou definida como one, uma única mensagem é passada para a funçã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. Consulte Conexões.
Tipo de dados Uma propriedade opcional que define o tipo de entrada do gatilho. Escolha string ou binary se a entrada não for JSON válida.

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

Utilização

Para saber mais sobre como os Centros de Eventos disparam e Hub IoT disparam, consulte Consuming Events com Funções do Azure.

O Functions também suporta bindings de tipos de SDK em Python para Hubs de Eventos do Azure, o que permite trabalhar com dados usando estes tipos de SDK subjacentes:

Importante

O suporte para tipos de SDK Event Hubs em Python está em Preview e é suportado apenas para o modelo de programação Python v2. Para mais informações, veja SDK tipos em Python.

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 processe um único evento, o gatilho de Hubs de Eventos pode se vincular 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 Quando um evento contém dados JSON, o Functions tenta desserializar os dados JSON em um tipo de objeto CLR (POCO) simples.
Azure. Mensagens.EventHubs.EventData1 O objeto do evento.
Se você estiver migrando de versões mais antigas dos SDKs de Hubs de Eventos, observe que essa versão descarta o suporte para o tipo herdado Body em favor de EventBody.

Quando você deseja que a função processe um lote de eventos, o gatilho Hubs de Eventos pode se vincular aos seguintes tipos:

Tipo Descrição
string[] Uma matriz de eventos do lote, como strings. Cada entrada representa um evento.
EventData[] Uma série de eventos do lote, como instâncias de Azure. Mensagens.EventHubs.EventData. Cada entrada representa um evento.
T[] onde T é um JSON serializável tipo1 Uma matriz de eventos do lote, como instâncias de um tipo POCO personalizado. Cada entrada representa um evento.

1 Para usar estes tipos, precisa de consultar Microsoft.Azure. Functions.Worker.Extensions.EventHubs 5.5.0 ou posterior e as dependências common para associações de tipos de SDK.

O tipo de parâmetro pode ser um dos seguintes:

  • Quaisquer tipos nativos de Java como int, String, byte[].
  • Valores anuláveis usando Optional.
  • Qualquer tipo de POJO.

Para saber mais, consulte a referência EventHubTrigger .

Metadados do evento

O gatilho Hubs de Eventos fornece várias propriedades de metadados. As propriedades de metadados podem ser usadas como parte de expressões de ligação em outras associações ou como parâmetros em seu código. As propriedades vêm da classe EventData .

Propriedade Tipo Descrição
PartitionContext PartitionContext A PartitionContext instância.
EnqueuedTimeUtc DateTime A hora enfileirada em UTC.
Offset string O deslocamento dos dados relativos ao fluxo de partição do hub de eventos. O deslocamento é um marcador ou identificador para um evento dentro do fluxo de Hubs de Eventos. O identificador é exclusivo dentro de uma partição do fluxo de Hubs de Eventos.
PartitionKey string A partição para a qual os dados do evento devem ser enviados.
Properties IDictionary<String,Object> As propriedades do usuário dos dados do evento.
SequenceNumber Int64 O número de sequência lógica do evento.
SystemProperties IDictionary<String,Object> As propriedades do sistema, incluindo os dados do evento.

Consulte exemplos de código que usam essas propriedades anteriormente neste artigo.

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

host.json configurações

O arquivo host.json contém configurações que controlam o comportamento de gatilho dos Hubs de Eventos. Consulte a seção Configurações de host.json para obter detalhes sobre as configurações disponíveis.

Próximos passos