Microsserviços e reconhecimento de imagem na AWS
A engenharia de software passou por diversas transformações nos últimos anos. Entre elas, encontra-se o processo de desenvolvimento de software, que por muito tempo ficou adormecido e com uma abordagem relativamente pequena devido a fatores que mais servem para burocratizar o processo do que para apoiar o mesmo.
Com o advento dos serviços em nuvem, esse processo tornou-se mais sólido e pragmático, com mais agilidade e adaptabilidade, e mais: com integridade da solução como um todo, devido a estrutura que as novas variantes de arquiteturas de software passaram a apresentar, com frameworks, bibliotecas, padrões de software e ferramentas de desenvolvimento. Consequentemente, a arquitetura de software monolítica passou a ser mais questionada por suas tradicionais questões.
Com isso, pequenos serviços independentes formaram uma nova arquitetura para os processos de desenvolvimento de software, a partir de APIs bem representadas: são os chamados microsserviços. Eles facilitam o crescimento da aplicação que está sendo executada e agilizam o desenvolvimento, que consequentemente traz avanços ao mercado no que tange velocidade, inovação e novos recursos.
A proposta deste artigo é a utilização de microsserviços, a partir de componentes independentes, para execução de um programa que lê a placa da imagem de um automóvel e extrai o texto dela, valendo-se de serviços em nuvem da Amazon, tais como: Lambda Function, Armazenamento de objetos (Amazon S3) e Amazon API Gateway (para tornar pública a API de chamada do serviço). Todos esses serviços são executados sem que seja necessário o provisionamento ou gerenciamento de servidores. Basta fazer o upload do código e o Lambda gerencia tudo o que é necessário para executar e alterar a escala do código com alta disponibilidade.
Preparando o ambiente
Agora vamos aos passos para a preparação do ambiente:
- Crie sua conta gratuita na AWS em: https://aws.amazon.com/pt/
- Faça login no console da AWS;
- Na barra de pesquisa do console, pesquise por S3 e crie um Bucket com o nome "textextractdocument" e em "Configurações de bloqueio do acesso público deste bucket" desmarque todas as opções de "Bloquear todo o acesso público".
4. Na barra de pesquisa do console da AWS, digite IAM e crie um usuário com a opção "Selecionar tipo de credencial da AWS":
5. Não marque a opção de grupo "Administrators"
6. Adicione um nome de chave: "textextractdocument"
7. Revise os dados da criação
8. Copie o ID da chave de acesso e a chave de acesso secreta e armazene no seu computador em um local seguro
9. Após ter criado o usuário, clique sobre o mesmo e depois em "Adicionar permissões"
10. Clique em "Anexar políticas existentes de forma direta"
11. Na barra de pesquisa digite S3, e marque a caixa de seleção "AmazonS3FullAccess"; faça o mesmo para "AmazonRekognitionFullAccess" e "AWSLambdaBasicExecutionRole", e depois clique em próximo para ver as seguintes permissões que serão adicionadas:
12. No campo de busca do console da AWS, digite Lambda e acesse este serviço para criar uma nova função. Selecione a opção "Criar do zero", e no nome da função digite: "textextractdocument"; no idioma a ser usado para escrever sua função, selecione Node.js 14.x, arquitetura x86_64; em "Alterar a função de execução padrão", selecione "Criar uma função com permissões básicas do Lambda". Após a função ter sido criada, acesse a aba Configurações e na caixa Papel de execução clique sobre o link que está abaixo do nome da função. Na caixa Políticas de permissões, ao lado direito, clique no botão "Adicionar permissões => Anexar políticas" e na caixa Outras políticas de permissões, repita o passo 11.
13. No campo de busca do console da AWS, digite "api gateway", clique em "Criar API", escolha "API HTTP" e depois "Compilar"; na tela de passo 1, clique em "Adicionar integração", na caixa de seleção escolha "Lambda" e selecione a função lambda criada no passo anterior. Em nome de API, digite: "Nome da API" e então avançar. Em configurar rotas, clique em avançar; em Nome do estágio, clique avançar. Clique no botão criar.
14. Após a API ter sido criada, clique em Rotas, e então, criar uma nova rota. Escolha o método PUT
15. Depois vá no menu lateral em CORS e adicione as seguintes configurações:
16. Após finalizada, sua API terá as seguintes informações como abaixo:
Código da API em Node.js na sua função Lambda
const AWS = require('aws-sdk');
exports.handler = async function(event, context, callback) {
return await processImage(event);
};
const processImage = async function(event) {
const client = new AWS.Rekognition();
const photo = event['queryStringParameters']['key'];
const bucket = 'textextractdocument';
const words = [];
try {
var params = {
Image: {
S3Object: {
Bucket: bucket,
Name: photo
}
},
};
const response = await client.detectText(params).promise();
response.TextDetections.forEach(label => {
const detection = {"TEXT" : label.DetectedText, "LABEL" : label.Type, "CONFIDENCE" : label.Confidence};
words.push(detection);
});
const data = applyRegexExpression(words);
const rekognition = {
statusCode: 200,
body: JSON.stringify(data)
};
return rekognition;
} catch (error) {
console.log(error);
return error;
}
}
function applyRegexExpression(words) {
/**
* /^ => início da string
* () => todo conteúdo buscado
* \w* => 0 ou mais alphanumérico caracter
* [A-Z] => letras
* \w* => 0 ou mais alphanumérico novamente
* $/ => fim do conteúdo buscado
*/
const regex = new RegExp(/^(\w*(\d+[A-Z]|[A-Z]+\d)\w*)+$/);
let dataPlate = [];
for (let i = 0; i < words.length; i++) {
const regexResult = words[i]['TEXT'].match(regex);
if (regexResult != null && regexResult[0].length == 7) {
dataPlate = regexResult[0];
}
}
return dataPlate;
}
Placa do carro a ser reconhecida
Aqui o retorno do reconhecimento da placa com sucesso da requisição da API em json:
Conclusão
Os microsserviços geram capacidades de negócios que podem ser projetados de acordo com cada demanda, incluindo o uso de linguagens de programação diversas, bem como a implantação separada de cada uma delas formando um único serviço.
Com isso, arquiteturas monolíticas de projetos de software que geram demandas desnecessárias são economizadas e podem ser escaladas para uma arquitetura mais pragmática e de fácil atualização, isolamento de falhas - deixando o resto do serviço funcionando adequadamente - escalabilidade independente e velocidade de desenvolvimento.
Espero que você tenha gostado da abordagem dos microsserviços e possa utilizá-lo com mais frequência no seu dia a dia com sua equipe após avaliarem os pró e contras do que vocês estiverem desenvolvendo.