Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Neste artigo, você usa a CLI do Desenvolvedor do Azure (azd) para criar uma função de gatilho dos Hubs de Eventos para processamento de eventos em tempo real no Azure Functions. Depois de verificar o código localmente, você o implanta em um novo aplicativo de funções sem servidor em execução em um plano de Consumo Flex no Azure.
A fonte do projeto usa azd para criar o aplicativo de funções e recursos relacionados e implantar seu código no Azure. Essa implantação segue as práticas recomendadas atuais para implantações de Azure Functions seguras e escalonáveis.
Por padrão, o plano Flex Consumption segue um modelo de cobrança pague pelo que usar, o que significa que você pode concluir este artigo e incorrerá apenas em um custo de apenas alguns centavos de dólar ou menos em sua conta do Azure.
Este artigo dá suporte à versão 4 do modelo de programação Node.js para Azure Functions.
Este artigo dá suporte à versão 2 do modelo de programação Python para Azure Functions.
Pré-requisitos
-
kit de desenvolvedor do Java 21
- Defina a variável de ambiente
JAVA_HOMEpara o local de instalação da versão correta do JDK (Kit de Desenvolvimento Java).
- Defina a variável de ambiente
- Apache Maven 3.8.x
- Node.js 22 ou posterior
- Python 3.11 ou posterior
Uma conta do Azure com uma assinatura ativa. Crie uma conta gratuitamente.
Inicializar o projeto
Use o azd init comando para criar um projeto de código local do Azure Functions a partir de um modelo.
No seu terminal ou prompt de comando local, execute esse azd init comando em uma pasta vazia:
azd init --template functions-quickstart-dotnet-azd-eventhub -e eventhub-dotnet
Esse comando extrai os arquivos de projeto do repositório template e inicializa o projeto na pasta atual. O sinalizador -e define um nome para o ambiente atual. Em azd, o ambiente mantém um contexto de implantação exclusivo para seu aplicativo e você pode definir mais de um. O nome do ambiente também é usado no nome do grupo de recursos que você cria no Azure.
No seu terminal ou prompt de comando local, execute esse azd init comando em uma pasta vazia:
azd init --template functions-quickstart-typescript-azd-eventhub -e eventhub-ts
Esse comando extrai os arquivos de projeto do repositório template e inicializa o projeto na pasta atual. O sinalizador -e define um nome para o ambiente atual. Em azd, o ambiente mantém um contexto de implantação exclusivo para seu aplicativo e você pode definir mais de um. O nome do ambiente também é usado no nome do grupo de recursos que você cria no Azure.
No seu terminal ou prompt de comando local, execute esse azd init comando em uma pasta vazia:
azd init --template functions-quickstart-python-azd-eventhub -e eventhub-py
Esse comando extrai os arquivos de projeto do repositório template e inicializa o projeto na pasta atual. O sinalizador -e define um nome para o ambiente atual. Em azd, o ambiente mantém um contexto de implantação exclusivo para seu aplicativo e você pode definir mais de um. O nome do ambiente também é usado no nome do grupo de recursos que você cria no Azure.
Criar e ativar um ambiente virtual
Na pasta raiz, execute estes comandos para criar e ativar um ambiente virtual chamado .venv:
python3 -m venv .venv
source .venv/bin/activate
Se o Python não instalar o pacote venv na distribuição do Linux, execute o seguinte comando:
sudo apt-get install python3-venv
No seu terminal ou prompt de comando local, execute esse azd init comando em uma pasta vazia:
azd init --template functions-quickstart-java-azd-eventhub -e eventhub-java
Esse comando extrai os arquivos de projeto do repositório template e inicializa o projeto na pasta atual. O sinalizador -e define um nome para o ambiente atual. Em azd, o ambiente mantém um contexto de implantação exclusivo para seu aplicativo e você pode definir mais de um. O nome do ambiente também é usado no nome do grupo de recursos que você cria no Azure.
No seu terminal ou prompt de comando local, execute esse azd init comando em uma pasta vazia:
azd init --template functions-quickstart-javascript-azd-eventhub -e eventhub-js
Esse comando extrai os arquivos de projeto do repositório template e inicializa o projeto na pasta atual. O sinalizador -e define um nome para o ambiente atual. Em azd, o ambiente mantém um contexto de implantação exclusivo para seu aplicativo e você pode definir mais de um. O nome do ambiente também é usado no nome do grupo de recursos que você cria no Azure.
No seu terminal ou prompt de comando local, execute esse azd init comando em uma pasta vazia:
azd init --template functions-quickstart-powershell-azd-eventhub -e eventhub-ps
Esse comando extrai os arquivos de projeto do repositório template e inicializa o projeto na pasta atual. O sinalizador -e define um nome para o ambiente atual. Em azd, o ambiente mantém um contexto de implantação exclusivo para seu aplicativo e você pode definir mais de um. O nome do ambiente também é usado no nome do grupo de recursos que você cria no Azure.
Criar recursos do Azure
Antes de executar sua função localmente, você precisa criar um namespace e hub dos Hubs de Eventos no Azure. Use azd provision para criar esses recursos e definir suas configurações locais adicionando o arquivo delocal.settings.json necessário.
Execute o comando a seguir para entrar no Azure:
azd auth loginSiga os prompts para autenticar usando sua conta do Azure.
Na pasta raiz, execute o seguinte comando para criar seus recursos do Azure:
azd provisionQuando solicitado, forneça esses parâmetros de implantação obrigatórios:
Parâmetro Descrição assinatura do Azure Assinatura na qual você cria seus recursos. Localização do Azure Região do Azure na qual criar o grupo de recursos que contém os novos recursos do Azure. Somente regiões que atualmente dão suporte para o plano de Consumo Flex são mostradas. vnetEnabled Use um valor de Falsepara evitar a sobrecarga extra de criação de recursos de rede virtual.O
azd provisioncomando cria os recursos necessários do Azure, incluindo um namespace e um hub dos Hubs de Eventos, um aplicativo de funções de Consumo Flex, Application Insights e uma conta de armazenamento. Ele também configura seu arquivo local.settings.json com as informações de conexão dos Hubs de Eventos.
Executar no seu ambiente local
Em uma janela de terminal separada, inicie o emulador de armazenamento do Azurite:
azuriteO processo de host local do Functions usa o emulador do Azurite para a conexão de armazenamento interna (
AzureWebJobsStorage) exigida pelo runtime.
Para iniciar o aplicativo de funções, execute estes comandos em um terminal ou prompt de comando para navegar até a pasta do
srcprojeto e iniciar o aplicativo de funções:cd src func start
Para iniciar o aplicativo de funções, execute este comando em um terminal ou prompt de comando:
func start
Para criar e iniciar o aplicativo de funções, execute estes comandos em um terminal ou prompt de comando:
mvn clean package mvn azure-functions:run
Para instalar dependências e iniciar o aplicativo de funções, execute estes comandos em um terminal ou prompt de comando:
npm install npm start
Para instalar dependências e iniciar o aplicativo de funções, execute estes comandos em um terminal ou prompt de comando:
cd src npm install npm start
Para iniciar o aplicativo de funções, execute este comando em um terminal ou prompt de comando:
func start
Se solicitado, permita que as Ferramentas Principais (func.exe) sejam chamadas por meio do firewall.
Ao iniciar o host do Azure Functions na pasta do seu projeto local, informações sobre suas funções aparecerão no terminal.
Este exemplo inclui uma função de gatilho timer que gera automaticamente artigos de notícias a cada 10 segundos e os envia aos Hubs de Eventos. A função de gatilho dos Hubs de Eventos processa esses eventos e executa a análise de sentimento e o acompanhamento de envolvimento.
Você verá uma saída semelhante a este exemplo:
[2026-03-02T22:37:30.151Z] Executing 'Functions.EventHubsTrigger' [2026-03-02T22:37:30.159Z] Trigger Details: PartitionId: 24, OffsetString: 0, EnqueueTimeUtc: 2026-03-02T22:37:29.1790000+00:00, SequenceNumber: 0, Count: 1, Offset: 0, PartionId: 24 [2026-03-02T22:37:30.169Z] ⭐ High-engagement article NEWS-20260302-0580CB82 (Views: 6123, Sentiment: 0.57) featured! [2026-03-02T22:37:30.174Z] 🔥 Viral article: NEWS-20260302-0580CB82 - 6,123 views [2026-03-02T22:37:30.181Z] 🌟 Featured article: NEWS-20260302-0580CB82 [2026-03-02T22:37:30.185Z] ✅ Successfully processed article NEWS-20260302-0580CB82 - 'Technology Breakthrough in Renewable Energy Technology' by Sarah Johnson [2026-03-02T22:37:30.191Z] 📰 Processed 1 news articles, 0 failed in batch of 1 [2026-03-02T22:37:30.196Z] 📊 NEWS BATCH SUMMARY: 1 articles | Total Views: 6,123 | Avg Views: 6,123 | Avg Sentiment: 0.57 | Status: [Featured: 1] [2026-03-02T22:37:30.200Z] 📂 Top Categories: [Health: 1] | Top Sources: [Innovation Weekly: 1] [2026-03-02T22:37:30.204Z] 🔥 Viral articles in batch: 1 [2026-03-02T22:37:30.207Z] Executed 'Functions.EventHubsTrigger' (Succeeded, Duration=55ms)
Quando terminar, pressione Ctrl+C na janela do terminal para interromper o processo do host
func.exe.Feche a janela em que o Azurite está em execução.
- Execute
deactivatepara desligar o ambiente virtual.
Examinar o código (opcional)
Você pode examinar o código que define a função de gatilho dos Hubs de Eventos:
using System.Text.Json;
using Azure.Messaging.EventHubs;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Logging;
namespace function_app;
public class EventHubsTrigger
{
private readonly ILogger<EventHubsTrigger> _logger;
private readonly NewsProcessingService _newsService;
public EventHubsTrigger(ILogger<EventHubsTrigger> logger, NewsProcessingService newsService)
{
_logger = logger;
_newsService = newsService;
}
[Function(nameof(EventHubsTrigger))]
public async Task Run([EventHubTrigger("news", Connection = "EventHubConnection")] EventData[] input)
{
var processedArticles = new List<NewsArticle>();
var failedEvents = 0;
foreach (var message in input)
{
try
{
var messageBody = message.EventBody.ToString();
// Parse the news article event
var article = ParseNewsArticleEvent(messageBody);
if (article != null)
{
processedArticles.Add(article);
}
else
{
failedEvents++;
}
}
catch (Exception ex)
{
failedEvents++;
_logger.LogWarning($"Error processing message: {ex.Message}");
}
}
// Log summary of this execution
_logger.LogInformation($"📰 Processed {processedArticles.Count} news articles, {failedEvents} failed in batch of {input.Length}");
Você pode examinar o projeto de modelo completo a.
package com.function;
import com.microsoft.azure.functions.*;
import com.microsoft.azure.functions.annotation.*;
import java.time.Instant;
import java.util.*;
import java.util.logging.Logger;
/**
* Azure Function that processes messages from an input Event Hub,
* adds metadata, and sends processed messages to an output Event Hub.
*/
public class EventHubsTriggerFunction {
@FunctionName("EventHubsTrigger")
public void run(
@EventHubTrigger(
name = "messages",
eventHubName = "%INPUT_EVENTHUB_NAME%",
connection = "EventHubConnection",
cardinality = Cardinality.MANY)
List<String> messages,
@EventHubOutput(
name = "output",
eventHubName = "%OUTPUT_EVENTHUB_NAME%",
connection = "EventHubConnection")
OutputBinding<List<String>> output,
final ExecutionContext context) {
Logger logger = context.getLogger();
logger.info(String.format("🔄 Event hub function processing %d message(s)", messages.size()));
List<String> processedMessages = new ArrayList<>();
for (String message : messages) {
try {
logger.info("📨 Processing event: " + message);
// Create processed message with additional metadata
String processedMessage = String.format(
"{\"id\":\"%s\",\"message\":%s,\"timestamp\":\"%s\"}",
UUID.randomUUID().toString(),
message,
Instant.now().toString());
processedMessages.add(processedMessage);
logger.info("\u2728 Message processed: " + processedMessage);
} catch (Exception e) {
logger.severe("\u274C Error processing message: " + e.getMessage());
}
}
// Send processed messages to output Event Hub
if (!processedMessages.isEmpty()) {
output.setValue(processedMessages);
logger.info(String.format("📤 Sent %d message(s) to output Event Hub", processedMessages.size()));
}
}
}
Você pode examinar o projeto de modelo completo a.
const { app, output } = require("@azure/functions");
const eventHubOutput = output.eventHub({
connection: 'EventHubConnection',
eventHubName: '%OUTPUT_EVENTHUB_NAME%'
});
async function EventHubsTrigger(messages, context) {
context.log(`🔄 Event hub function processing ${messages.length} message(s)`);
const processedMessages = [];
for (const message of messages) {
try {
// Parse the incoming message
const eventData = typeof message === 'string' ? JSON.parse(message) : message;
context.log('📨 Processing event:', eventData);
// Create processed message with additional metadata
const processedMessage = {
id: eventData.id || crypto.randomUUID(),
message: eventData.message || JSON.stringify(eventData),
timestamp: new Date().toISOString()
};
processedMessages.push(processedMessage);
context.log('✨ Message processed:', processedMessage);
} catch (error) {
context.error(`❌ Error processing message: ${error}`);
}
}
// Send processed messages to output Event Hub
if (processedMessages.length > 0) {
context.extraOutputs.set(eventHubOutput, processedMessages);
context.log(`📤 Sent ${processedMessages.length} message(s) to output Event Hub`);
}
}
app.eventHub('EventHubsTrigger', {
connection: 'EventHubConnection',
eventHubName: '%INPUT_EVENTHUB_NAME%',
cardinality: 'many',
extraOutputs: [eventHubOutput],
handler: EventHubsTrigger
});
Você pode examinar o projeto de modelo completo a.
import { app, InvocationContext, output } from "@azure/functions";
interface EventMessage {
id: string;
message: string;
timestamp: string;
}
const eventHubOutput = output.eventHub({
connection: 'EventHubConnection',
eventHubName: '%OUTPUT_EVENTHUB_NAME%'
});
export async function EventHubsTrigger(messages: unknown[], context: InvocationContext): Promise<void> {
context.log(`🔄 Event hub function processing ${messages.length} message(s)`);
const processedMessages: EventMessage[] = [];
for (const message of messages) {
try {
// Parse the incoming message
const eventData = typeof message === 'string' ? JSON.parse(message) : message;
context.log('📨 Processing event:', eventData);
// Create processed message with additional metadata
const processedMessage: EventMessage = {
id: eventData.id || crypto.randomUUID(),
message: eventData.message || JSON.stringify(eventData),
timestamp: new Date().toISOString()
};
processedMessages.push(processedMessage);
context.log('✨ Message processed:', processedMessage);
} catch (error) {
context.error(`❌ Error processing message: ${error}`);
}
}
// Send processed messages to output Event Hub
if (processedMessages.length > 0) {
context.extraOutputs.set(eventHubOutput, processedMessages);
context.log(`📤 Sent ${processedMessages.length} message(s) to output Event Hub`);
}
}
app.eventHub('EventHubsTrigger', {
connection: 'EventHubConnection',
eventHubName: '%INPUT_EVENTHUB_NAME%',
cardinality: 'many',
extraOutputs: [eventHubOutput],
handler: EventHubsTrigger
});
Você pode examinar o projeto de modelo completo a.
param($InputEvents, $TriggerMetadata)
Write-Host "🔄 Event hub function processing $($InputEvents.Count) message(s)"
$processedMessages = @()
foreach ($message in $InputEvents) {
try {
# Parse the incoming message
$eventData = $message | ConvertFrom-Json -ErrorAction SilentlyContinue
if (-not $eventData) {
$eventData = @{ message = $message }
}
Write-Host "📨 Processing event: $($eventData | ConvertTo-Json -Compress)"
# Create processed message with additional metadata
$processedMessage = @{
id = if ($eventData.id) { $eventData.id } else { [guid]::NewGuid().ToString() }
message = if ($eventData.message) { $eventData.message } else { ($eventData | ConvertTo-Json -Compress) }
timestamp = (Get-Date).ToUniversalTime().ToString('o')
}
$processedMessages += $processedMessage
Write-Host "✨ Message processed: $($processedMessage | ConvertTo-Json -Compress)"
}
catch {
Write-Error "❌ Error processing message: $_"
}
}
# Send processed messages to output Event Hub
if ($processedMessages.Count -gt 0) {
Push-OutputBinding -Name OutputEvents -Value ($processedMessages | ConvertTo-Json -Compress)
Write-Host "📤 Sent $($processedMessages.Count) message(s) to output Event Hub"
}
O gatilho é definido no function.json correspondente.
Você pode examinar o projeto de modelo completo a.
import azure.functions as func
import logging
import json
from datetime import datetime, timezone
import random
import uuid
from typing import List
app = func.FunctionApp()
# News article data model
class NewsArticle:
title=random.choice(titles_templates).format(topic=topic),
content=f"Comprehensive coverage of the latest developments in {topic}. " * random.randint(10, 20),
author=random.choice(authors),
source=random.choice(sources),
category=random.choice(categories),
published_date=datetime.now(timezone.utc),
view_count=random.randint(100, 10000),
sentiment_score=round(random.uniform(-1.0, 1.0), 2),
status=random.choice(["Published", "Featured"]),
tags=[random.choice(topics) for _ in range(random.randint(3, 5))]
)
articles.append(article)
# Send articles to Event Hub
events_json = json.dumps([article.to_dict() for article in articles])
event.set(events_json)
logging.info(f'✅ HIGH-THROUGHPUT: Successfully generated {num_articles} news articles in ~10 seconds')
# Event Hub trigger - processes news articles
@app.event_hub_message_trigger(arg_name="events", event_hub_name="news",
connection="EventHubConnection")
def EventHubsTrigger(events: List[func.EventHubEvent]):
"""Process news articles from Event Hub with sentiment analysis and engagement tracking"""
# Handle both single event and list of events
if not isinstance(events, list):
events = [events]
batch_articles = []
failed_count = 0
for event in events:
try:
# Parse the event data
event_data = json.loads(event.get_body().decode('utf-8'))
# Handle both single article and array of articles
articles = event_data if isinstance(event_data, list) else [event_data]
for article_data in articles:
# Process each article
article_id = article_data.get('ArticleId')
title = article_data.get('Title')
author = article_data.get('Author')
Você pode examinar o projeto de modelo completo a.
Depois de verificar sua função localmente, é hora de publicá-la no Azure.
Publicar no Azure
Este projeto está configurado para usar o azd up comando para implantar seu código em um novo aplicativo de funções em um plano de Consumo Flex no Azure. Como você já provisionou recursos, esse comando implanta seu código no aplicativo de funções existente.
Dica
Este projeto inclui um conjunto de arquivos Bicep que azd utiliza para criar uma implantação segura em um plano de Consumo Flexível, seguindo as melhores práticas.
Na pasta raiz do repositório, execute o seguinte comando para implantar seu projeto de código no aplicativo de funções no Azure:
azd deploy
A implantação empacota seu código e o publica no aplicativo de função. Quando o comando for concluído, você verá links para os recursos criados.
Verificar a implantação
Após a conclusão da implantação, a função de gatilho dos Hubs de Eventos inicia automaticamente o processamento de eventos à medida que eles chegam ao hub de eventos.
No portal do Azure, acesse seu novo aplicativo de funções.
Selecione o fluxo de log no menu esquerdo para monitorar as execuções da função em tempo real.
Você vê entradas de registro que mostram que a função de acionamento dos Hubs de Evento está processando eventos gerados pelo acionador de temporizador.
Reimplantar seu código
Execute o comando azd up quantas vezes precisar para provisionar seus recursos de Azure e implantar atualizações de código em seu aplicativo de funções.
Observação
Os arquivos de código implantados são sempre sobrescritos pelo pacote de implantação mais recente.
Suas respostas iniciais aos prompts azd e quaisquer variáveis de ambiente geradas por azd são armazenadas localmente no seu ambiente nomeado. Use o comando azd env get-values para revisar todas as variáveis no seu ambiente que foram usadas ao criar recursos do Azure.
Limpar os recursos
Quando terminar de trabalhar com seu aplicativo de funções e recursos relacionados, use este comando para excluir o aplicativo de funções e seus recursos relacionados do Azure e evitar incorrer em custos adicionais:
azd down --no-prompt
Observação
A opção --no-prompt instrui azd a excluir seu grupo de recursos sem uma confirmação sua.
Este comando não afeta seu projeto de código local.