Criando uma API OCR com FaaS na Azure – Parte 1: Arquitetura e Upload Seguro
Nos últimos tempos, tenho trabalhado em um sistema OCR voltado para leitura de receitas médicas digitais. O objetivo é simples: permitir que profissionais da saúde e farmácias possam automatizar a interpretação de prescrições médicas a partir de imagens enviadas via API. Tudo isso com segurança, escalabilidade e sem dor de cabeça com gestão de credenciais. Neste primeiro artigo da série, vou mostrar como pensei a arquitetura, a justificativa do uso de Azure Functions, e como fiz a integração com o Blob Storage usando Managed Identity. Ao final, teremos um endpoint funcional para upload seguro de imagens. Bora lá? Por que Azure Functions? A escolha por Azure Functions veio naturalmente por algumas razões: Serverless: não preciso me preocupar com infraestrutura. Escalável: o sistema vai lidar com muitos envios de imagem, então escalar sob demanda é essencial. Integrado com o ecossistema Azure: especialmente Blob Storage e Managed Identity. E como estamos falando de um sistema de OCR, onde a trigger principal será o envio de uma imagem para análise, uma Function HTTP cai como uma luva. Sobre a arquitetura do projeto Organizei a estrutura do código de forma limpa e modular, seguindo uma pegada de DDD light: /ocr-function-app ├── application/ │ └── UploadImageService.ts ├── domain/ │ └── IImageStorage.ts ├── infrastructure/ │ └── AzureBlobStorage.ts ├── functions/ │ └── HttpAddToBlob.ts ├── host.json ├── local.settings.json └── package.json A ideia é que a Function seja apenas o entrypoint, delegando responsabilidades para camadas mais específicas. ⛏️ Configurando o ambiente da Azure Function Antes de começar a codar, precisamos garantir que o ambiente da nossa Azure Function esteja pronto para subir e rodar corretamente com autenticação via Managed Identity e integração com o Blob Storage. Crie sua Azure Function no portal ou via CLI: func init ocr-function-app --worker-runtime node --language typescript Crie a Function HTTP trigger: func new --name HttpAddToBlob --template "HTTP trigger"

Nos últimos tempos, tenho trabalhado em um sistema OCR voltado para leitura de receitas médicas digitais. O objetivo é simples: permitir que profissionais da saúde e farmácias possam automatizar a interpretação de prescrições médicas a partir de imagens enviadas via API. Tudo isso com segurança, escalabilidade e sem dor de cabeça com gestão de credenciais.
Neste primeiro artigo da série, vou mostrar como pensei a arquitetura, a justificativa do uso de Azure Functions, e como fiz a integração com o Blob Storage usando Managed Identity. Ao final, teremos um endpoint funcional para upload seguro de imagens. Bora lá?
Por que Azure Functions?
A escolha por Azure Functions veio naturalmente por algumas razões:
- Serverless: não preciso me preocupar com infraestrutura.
- Escalável: o sistema vai lidar com muitos envios de imagem, então escalar sob demanda é essencial.
- Integrado com o ecossistema Azure: especialmente Blob Storage e Managed Identity.
E como estamos falando de um sistema de OCR, onde a trigger principal será o envio de uma imagem para análise, uma Function HTTP cai como uma luva.
Sobre a arquitetura do projeto
Organizei a estrutura do código de forma limpa e modular, seguindo uma pegada de DDD light:
/ocr-function-app
├── application/
│ └── UploadImageService.ts
├── domain/
│ └── IImageStorage.ts
├── infrastructure/
│ └── AzureBlobStorage.ts
├── functions/
│ └── HttpAddToBlob.ts
├── host.json
├── local.settings.json
└── package.json
A ideia é que a Function seja apenas o entrypoint, delegando responsabilidades para camadas mais específicas.
⛏️ Configurando o ambiente da Azure Function
Antes de começar a codar, precisamos garantir que o ambiente da nossa Azure Function esteja pronto para subir e rodar corretamente com autenticação via Managed Identity e integração com o Blob Storage.
- Crie sua Azure Function no portal ou via CLI:
func init ocr-function-app --worker-runtime node --language typescript
- Crie a Function HTTP trigger:
func new --name HttpAddToBlob --template "HTTP trigger"