Blob + Event Grid no Azure: processamento event-driven
Blob + Event Grid no Azure permite processar automaticamente ficheiros assim que são carregados no Azure Blob Storage. Esta ligação é útil para cenários event-driven, como transformação de ficheiros, indexação ou notificações em tempo real.
Pré-requisitos
- Conta Azure com permissões para criar recursos (Resource Group, Storage Account, Function App).
- Azure CLI instalada e autenticada (az login).
- zip (ou outra forma de empacotar ficheiros) e Node.js local para criar a função (exemplo em JavaScript).
Passo 1: Criar Resource Group e Storage Account
Criar um Resource Group, uma Storage Account e um contentor onde vai carregar os ficheiros. Substitua <storageaccountname> por um nome único todo em minúsculas.
RESOURCE_GROUP="rg-eventgrid-demo"
LOCATION="northeurope"
STORAGE_ACCOUNT="<storageaccountname>" # nome único, minúsculas
az group create -n $RESOURCE_GROUP -l $LOCATION
az storage account create -n $STORAGE_ACCOUNT -g $RESOURCE_GROUP --sku Standard_LRS --kind StorageV2
az storage container create -n uploads --account-name $STORAGE_ACCOUNT
Passo 2: Criar um Azure Function App (Node.js)
Criar um Function App em Consumption Plan que irá conter a função com binding Event Grid. Use um nome único para o Function App.
FUNCTION_APP="funevdemo"
az functionapp create -g $RESOURCE_GROUP -n $FUNCTION_APP \
--storage-account $STORAGE_ACCOUNT --runtime node --functions-version 4 \
--consumption-plan-location $LOCATION
Passo 3: Criar e fazer deploy da função com Event Grid trigger
Criar uma função simples que recebe eventos do Event Grid. Estrutura mínima local:
BlobEventListener/
index.js
function.json
index.js:
module.exports = async function (context, eventGridEvent) {
context.log('EventGrid event received:', JSON.stringify(eventGridEvent));
const data = eventGridEvent.data || {};
context.log('Blob URL:', data.url || data.blobUrl || data.url);
};
function.json:
{
"bindings": [
{
"type": "eventGridTrigger",
"name": "eventGridEvent",
"direction": "in"
}
]
}
Empacotar e fazer deploy:
zip -r function.zip BlobEventListener
az functionapp deployment source config-zip -g $RESOURCE_GROUP -n $FUNCTION_APP --src function.zip
Passo 4: Criar a Event Grid subscription do Storage para a Function
Criar uma subscrição que envia eventos de tipo Microsoft.Storage.BlobCreated para a Function. Obtenha o id da Storage Account e o id da Function (endpoint).
STORAGE_ID=$(az storage account show -n $STORAGE_ACCOUNT -g $RESOURCE_GROUP --query id -o tsv)
SUB_ID=$(az account show --query id -o tsv)
FUNCTION_ENDPOINT="/subscriptions/$SUB_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Web/sites/$FUNCTION_APP/functions/BlobEventListener"
az eventgrid event-subscription create \
--name BlobCreateToFunction \
--source-resource-id $STORAGE_ID \
--endpoint-type azurefunction \
--endpoint "$FUNCTION_ENDPOINT" \
--included-event-types Microsoft.Storage.BlobCreated
Nota: a plataforma valida automaticamente o endpoint. Se receber erro de validação, confirme que a função está implantada e o nome da função (BlobEventListener) corresponde.
Passo 5: Testar — carregar um ficheiro e ver logs
Carregue um ficheiro para o contentor e observe os logs da Function em tempo real.
echo "teste" > test.txt
az storage blob upload --account-name $STORAGE_ACCOUNT -c uploads -n test.txt --file ./test.txt
# Ver logs da Function (num terminal separado)
az functionapp log tail -g $RESOURCE_GROUP -n $FUNCTION_APP
Deve ver uma linha com "EventGrid event received" e o URL do blob. Se não aparecer, verifique a subscrição com az eventgrid event-subscription show.
Verificar o resultado
Confirmar que o fluxo está a funcionar:
- O upload do ficheiro (az storage blob upload) desencadeia um evento Microsoft.Storage.BlobCreated.
- A Azure Function regista o evento (ver az functionapp log tail) e mostra o URL do blob.
- Se necessário, verifique a subscrição com az eventgrid event-subscription list --source-resource-id $STORAGE_ID.
Conclusão
Ligando o Azure Blob Storage a uma Azure Function via Event Grid criou-se um pipeline event-driven simples e útil para processamento automático de ficheiros. Próximos passos: ler o blob dentro da função (usar @azure/storage-blob), filtrar eventos por prefix/suffix na subscrição e adicionar retries/Dead Letter. Dica: se a validação do endpoint falhar, confirme que a função responde e que a rota/nome da função estão correctos — quer experimentar filtrar por extensão (.csv) antes de processar?