Microsserviços e reconhecimento de imagem na AWS

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:

  1. Crie sua conta gratuita na AWS em: https://aws.amazon.com/pt/
  2. Faça login no console da AWS;
  3. 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.