O Sertão será Cloud

Desvendando o Poder do Azure Event Hub com Azure Functions: Identidades Gerenciadas com Typescript!

Bem-vindo ao setimo artigo da nossa série sobre integração de Azure Functions com serviços do Azure, utilizando ás melhores práticas de programação! 🎉 Já exploramos o Azure containers, Azure Key Vault, Azure Web PubSub e o Azure Service Bus. Agora, vamos mergulhar no Azure Event Hub, um serviço de transmissão de dados em grande escala. 📊

OBS: Para ver como integrar ao Azure Service Bus e o Azure Web PubSub veja:

Agora, falando um pouco sobre o Azure Event Hubs, destaca-se por ser um serviço de ingestão de dados em tempo real e de transmissão de eventos em larga escala. É projetado para facilitar a coleta, processamento e análise de grandes volumes de dados de eventos, gerados por aplicativos, dispositivos e sensores. Aqui estão alguns pontos-chave para entender o Azure Event Hubs:

Características Principais

  1. Ingestão de Dados em Alta Velocidade: O Event Hubs pode ingerir milhões de eventos por segundo, permitindo que você colete dados em tempo real de diversas fontes.
  2. Bufferização de Dados: Ele atua como um buffer temporário, armazenando eventos por um período configurável, o que permite que consumidores de dados os processem em seus próprios ritmos.
  3. Particionamento: Eventos podem ser particionados para permitir a ingestão paralela e a escalabilidade horizontal, o que melhora a capacidade de processamento.
  4. Transmissão de Eventos: Além de coletar dados, o Event Hubs pode transmitir eventos para múltiplos consumidores, permitindo que diferentes sistemas e serviços consumam os dados simultaneamente.
  5. Suporte a Diversas Plataformas e Linguagens: Você pode enviar eventos para o Event Hubs usando uma variedade de linguagens de programação e plataformas, incluindo .NET, Java, Python, Node.js e mais.
  6. Segurança e Conformidade: O Event Hubs oferece segurança robusta com autenticação e autorização baseadas em Microsoft Entra ID (antigo AAD) e chaves SAS (Shared Access Signature).

Casos de Uso

  1. Monitoramento de Aplicações e Infraestrutura:Coletar logs e métricas de servidores, contêineres e aplicativos para análise e monitoramento em tempo real.
  2. Processamento de Dados em Tempo Real: Analisar dados de sensores IoT (Internet of Things), transações financeiras, e-commerce, e muito mais em tempo real.
  3. ETL (Extract, Transform, Load): Integrar dados de várias fontes, transformá-los conforme necessário e carregá-los em sistemas de armazenamento ou bancos de dados.
  4. Análise de Clickstream: Rastrear e analisar cliques e interações de usuários em sites e aplicativos para insights de comportamento e personalização.
  5. Integração com Outros Serviços do Azure: O Event Hubs se integra bem com outros serviços do Azure, como Azure Stream Analytics, Azure Functions, Azure Data Lake, e mais, para construir pipelines de processamento de dados completos.

Estrutura do Azure Event Hubs

  • Namespace: Um contêiner de nível superior para um ou mais Event Hubs.
  • Event Hub: Um fluxo de dados de eventos dentro do namespace, semelhante a um tópico em sistemas de mensagens.
  • Partitions: Subdivisões de um Event Hub que permitem a ingestão paralela e independente de eventos.
  • Consumer Groups: Múltiplos grupos de consumidores podem ler do mesmo Event Hub, cada um com sua própria posição de leitura.

Como Funciona?

  1. Produtores (Producers): Enviam dados para o Event Hub. Podem ser aplicativos, dispositivos, ou qualquer sistema que produza eventos.
  2. Event Hubs: Recebe e armazena eventos, distribuindo-os em várias partições para escalabilidade.
  3. Consumidores (Consumers): Aplicações ou serviços que leem os eventos do Event Hub. Eles podem processar, analisar, ou armazenar os dados conforme necessário.
  4. Processamento e Armazenamento: Dados consumidos podem ser processados em tempo real (por exemplo, usando Azure Stream Analytics) ou armazenados para análise posterior (por exemplo, em Azure Data Lake ou Azure SQL Database).

O Azure Event Hubs é uma solução poderosa para lidar com grandes volumes de dados em tempo real, oferecendo escalabilidade, segurança e integração com outros serviços do Azure. Ele é ideal para cenários que exigem ingestão rápida e processamento paralelo de dados, permitindo que organizações transformem grandes quantidades de dados em insights valiosos rapidamente.

Passo 1: Configuração do Ambiente

Antes de começar, certifique-se de ter as seguintes dependências instaladas:

npm install @azure/identity @azure/event-hubs

OBS: Caso precise ver os Passos 1 ao 3 veja o artigo anterior sobre o tema:

Como Configurar o Azure Blob Service Client Aplicando os Princípios SOLID em uma Azure Function com…

Passo 4: Arquitetura com Provedores de Credenciais

Vamos criar uma fábrica para instanciar o EventHubProducerClient usando nosso CredentialProvider.

import { EventHubProducerClient } from "@azure/event-hubs";

/**
* Fábrica para criar instâncias do EventHubProducerClient.
*/
class EventHubProducerClientFactory {
private fullyQualifiedNamespace: string;
private eventHubName: string;
private credentialProvider: CredentialProvider;

/**
* Cria uma nova instância do EventHubProducerClientFactory.
* @param {string} fullyQualifiedNamespace - O namespace totalmente qualificado do Azure Event Hub.
* @param {string} eventHubName - O nome do Event Hub.
* @param {CredentialProvider} credentialProvider - O provedor de credenciais a ser utilizado.
*/
constructor(fullyQualifiedNamespace: string, eventHubName: string, credentialProvider: CredentialProvider) {
this.fullyQualifiedNamespace = fullyQualifiedNamespace;
this.eventHubName = eventHubName;
this.credentialProvider = credentialProvider;
}

/**
* Cria uma instância do EventHubProducerClient.
* @returns {EventHubProducerClient} Uma instância do EventHubProducerClient configurada.
*/
createEventHubProducerClient(): EventHubProducerClient {
const credential = this.credentialProvider.getCredential();
return new EventHubProducerClient(this.fullyQualifiedNamespace, this.eventHubName, credential);
}
}

Passo 5: Utilizando a Fábrica em uma Azure Function

Vamos integrar tudo isso em uma Azure Function, mostrando cada método de autenticação.

Exemplo 1: Azure Function com Managed Identity Atribuída ao Sistema

import { AzureFunction, Context, HttpRequest } from "@azure/functions";
import { EventHubProducerClientFactory } from "./EventHubProducerClientFactory";
import { SystemAssignedManagedIdentityCredentialProvider } from "./SystemAssignedManagedIdentityCredentialProvider";

/**
* Azure Function utilizando Managed Identity atribuída ao Sistema.
* @param {Context} context - O contexto da função.
* @param {HttpRequest} req - A requisição HTTP.
* @returns {Promise<void>} Uma promessa que resolve quando a função é concluída.
*/
const httpTrigger: AzureFunction = async function (context: Context, req: HttpRequest): Promise<void> {
const fullyQualifiedNamespace = process.env.AZURE_EVENTHUB_FULLYQUALIFIEDNAMESPACE;
const eventHubName = "EVENT_HUB_NAME";
const credentialProvider = new SystemAssignedManagedIdentityCredentialProvider();
const producerClientFactory = new EventHubProducerClientFactory(fullyQualifiedNamespace, eventHubName, credentialProvider);

const producerClient = producerClientFactory.createEventHubProducerClient();
// Utilize o producerClient para enviar eventos para o Event Hub
context.res = {
body: "Azure Function utilizando Managed Identity atribuída ao Sistema para Acesso ao Event Hub"
};
};

export default httpTrigger;

Exemplo 2: Azure Function com Managed Identity Atribuída ao Usuário

import { AzureFunction, Context, HttpRequest } from "@azure/functions";
import { EventHubProducerClientFactory } from "./EventHubProducerClientFactory";
import { UserAssignedManagedIdentityCredentialProvider } from "./UserAssignedManagedIdentityCredentialProvider";

/**
* Azure Function utilizando Managed Identity atribuída ao Usuário.
* @param {Context} context - O contexto da função.
* @param {HttpRequest} req - A requisição HTTP.
* @returns {Promise<void>} Uma promessa que resolve quando a função é concluída.
*/
const httpTrigger: AzureFunction = async function (context: Context, req: HttpRequest): Promise<void> {
const fullyQualifiedNamespace = process.env.AZURE_EVENTHUB_FULLYQUALIFIEDNAMESPACE;
const eventHubName = "EVENT HUB NAME";
const clientId = process.env.AZURE_EVENTHUB_CLIENTID;
const credentialProvider = new UserAssignedManagedIdentityCredentialProvider(clientId);
const producerClientFactory = new EventHubProducerClientFactory(fullyQualifiedNamespace, eventHubName, credentialProvider);

const producerClient = producerClientFactory.createEventHubProducerClient();
// Utilize o producerClient para enviar eventos para o Event Hub
context.res = {
body: "Azure Function utilizando Managed Identity atribuída ao Usuário para Acesso ao Event Hub"
};
};

export default httpTrigger;

Exemplo 3: Azure Function com Service Principal

import { AzureFunction, Context, HttpRequest } from "@azure/functions";
import { EventHubProducerClientFactory } from "./EventHubProducerClientFactory";
import { ServicePrincipalCredentialProvider } from "./ServicePrincipalCredentialProvider";

/**
* Azure Function utilizando Service Principal.
* @param {Context} context - O contexto da função.
* @param {HttpRequest} req - A requisição HTTP.
* @returns {Promise<void>} Uma promessa que resolve quando a função é concluída.
*/
const httpTrigger: AzureFunction = async function (context: Context, req: HttpRequest): Promise<void> {
const fullyQualifiedNamespace = process.env.AZURE_EVENTHUB_FULLYQUALIFIEDNAMESPACE;
const eventHubName = "EVENT HUB NAME";
const tenantId = process.env.AZURE_EVENTHUB_TENANTID;
const clientId = process.env.AZURE_EVENTHUB_CLIENTID;
const clientSecret = process.env.AZURE_EVENTHUB_CLIENTSECRET;
const credentialProvider = new ServicePrincipalCredentialProvider(tenantId, clientId, clientSecret);
const producerClientFactory = new EventHubProducerClientFactory(fullyQualifiedNamespace, eventHubName, credentialProvider);

const producerClient = producerClientFactory.createEventHubProducerClient();
// Utilize o producerClient para enviar eventos para o Event Hub
context.res = {
body: "Azure Function utilizando Service Principal para Acesso ao Event Hub"
};
};

export default httpTrigger;

Conclusão

Parabéns! Você configurou com sucesso o Azure Event Hub utilizando várias técnicas de autenticação em Azure Functions, aplicando as melhores práticas de mercado. Nossa abordagem modular facilita a manutenção e a extensão do código. 🎉

Referências

Início Rápido – Criar uma conexão de serviço no aplicativo de funções por meio do portal do Azure