O blog da AWS
Construindo uma ferramenta de web analytics com Kinesis e outros serviços AWS.
Por Joao Marcelo Barros de Almeida, Arquiteto de Soluções AWS Brasil
Desafio
Cada vez mais uma quantidade massiva de dados é gerada pelos consumidores em suas ações em sites ou aplicativos, esses dados depois de tratados, podem ajudar as equipes de negócio a tomarem decisões mais assertivas com relação a campanhas de marketing, por exemplo.
Uma maneira de obter esses dados, é através de uma ferramenta de web analytics, que nada mais que o processo de coletar, analisar e gerar relatórios de uso, a partir dos dados da navegação e das interações dos usuários no site.
Neste blog post, vamos exemplificar uma das possíveis soluções para se coletar dados em real-time, utilizando serviços da AWS como Amazon Kinesis Data Streams para a coleta, Elasticsearch para persistência e o Kibana para apresentação em um dashboard amigável.
A figura abaixo demonstra o desenho da solução apresentada:
Serviços AWS
Todos os serviços aqui apresentados são gerenciados pela AWS reduzindo o custo de operação e manutenção da solução.
Amazon Kinesis Data Streams, é um serviço de streaming de dados em real-time com escalabilidade e resiliência necessária para coletar os dados de forma continua e encaminhar para outros serviços, nessa arquitetura iremos usar o Amazon Kinesis Data Firehose como destino dos dados que são trafegados no Data Streams.
Amazon Kinesis Data Firehose é o serviço responsável por receber os dados do Amazon Kinesis Data Stream e persisti-los no Elasticsearch.
Amazon Elasticsearch Service facilita o uso deste software opensource de forma eficaz e em grande escala, além de fornecer o Kibana integrado, facilitando a apresentação dos dados coletados através da criação de dashboards.
Amazon Cognito, é um serviço que permite o cadastramento, login, e controle de acesso para as soluções criadas em AWS, na solução apresentada o Amazon Cognito será utilizado apenas para garantir o acesso do front-end ao envio de dados para o Amazon Kinesis Data Streams.
Para executarmos o teste, será necessário fazer a configuração detalhada de cada serviço como ilustrado nos passos abaixo.
IMPORTANTE: Esta não é uma solução pronta para produção. Destina-se apenas a educar em termos do que pode ser alcançado com os componentes acima mencionados. Para entender as práticas recomendadas da AWS para topologias de produção, consulte AWS Well Architected Framework
Configurando o Elasticsearch Service
Iniciaremos a configuração desse sistema iniciando pela instanciação de um Elasticsearch. aonde o Amazon Kinesis Data Firehose irá salvar as informações vindas do cliente ou do frontend da aplicação,
Vale lembrar que o passo a passo descrito nesse post tem como objetivo a criação de um ambiente de testes e não um ambiente produtivo. Clique aqui para ver um post que explica as camadas de segurança do Elasticsearch e como integrar o Kibana ao Amazon Cognito, recomendo utilizar o post como referência para a criação do serviço.
Acesse a página do serviço clicando aqui.
Abra o dashboard do Elasticsearch service para a criação de um novo domínio, clicando em Create a new domain
Selecione o tipo de deployment que irá subir o Elasticsearch, clique no tipo Development and Testing, esse é um tipo de instalação que disponibiliza somente uma instancia em uma zona de disponibilidade, e não deve ser utilizado para ambientes de produção.
Clique em Next.
Configure o nome do domínio em Elasticsearch domain name e clique em Next.
Selecione a opção de Public access em redes e depois Create master user no controle de acesso e por último Allow open access to domain na configuração das políticas.
Clique em Next.
Confirme as configurações clicando em Confirm.
Configurando o Amazon Kinesis Data Streams e Amazon Kinesis Data Firehose
Acesse a página do serviço clicando aqui.
Crie um Amazon Kinesis Data Streams, selecionando a opção e depois clique em Create data stream.
Defina um nome em Data stream name nesse ambiente de testes, coloque apenas 1 em Number of open shards e clique em Create data stream.
A confirmação de criação do Data Streams aparecerá na barra verde.
Copie e cole em um bloco de notas o ARN do Kinesis Data Streams que acabou de criar, pois ele será utilizado para criar adequar a role do Amazon Cognito que fará parte dessa autenticação.
Crie o Amazon Kinesis Data Firehose, clicando na opção Process with delivery stream.
Informe o nome que terá o delivery stream em Delivery stream name e selecione o Kinesis data stream criado no passo anterior;
Clique em Next.
Nesta etapa da configuração, é possível transformar os dados provenientes do cliente (ou front-end) utilizando uma função AWS Lambda.
Nesse tutorial não será necessário converter dados, então deixe todas as configurações padrão e clique em Next.
Neste passo, escolha o Amazon Elasticsearch como o destino das informações;
Em Domain, selecione o Amazon Elasticsearch criado no início desse tutorial;
Em Index, digite um nome para o índice que será criado no Elasticsearch para armazenar os dados recebidos via Amazon Kinesis Data Firehose.
Clique em Next.
Neste passo, é possível configurar o buffer de escrita no Elasticseartch, a compressão e criptografia dos dados salvos no S3 e principalmente qual role IAM será assumida pelo Amazon Kinesis Data Firehose.
Para esse tutorial deixe todas as opções padrão e clique em Next.
Revise suas configurações e clique em Next.
Configuração do Amazon Cognito
Acesse a página do serviço clicando aqui.
Clique em Manage Identity Pools
Clique em Create New identity pool
Digite o nome em Identity pool name;
Habilite unauthenticated identities clicando em Enable access to unauthenticated identities;
Clique em Create pool.
Permita a criação das roles no IAM para o Identity pool clicando em Allow.
Em Platform, altere a opção para JavaScript e copie e cole as informações da sessão Get AWS Credentials em um bloco de notas.
O passo anterior criou uma nova role IAM que deverá ser utilizada pela aplicação javascript para se autenticar na solução. Agora é necessário dar permissão para que esta role seja capaz de dê acesso de escrita ao Amazon Kinesis Data Streams.
Acesse a página do serviço clicando aqui.
Clique em Roles.
Procure no campo de Search pelo nome que deu ao Identity pool (aqui exemplificado como blogx);
Clique na role que termina com *Unauth_role.
Expanda a policy dentro da role;
Clique em Edit Policy;
Adicione a permissão abaixo alterando o ARN do Amazon Kinesis Data Streams, anotado na criação do stream no passo 1;
Clique em Review policy.
{ "Effect": "Allow", "Action": [ "kinesis:Put*" ], "Resource": [ “ARN DO AMAZON KINESIS DATA STREAMS" ] }
Clique em Save changes.
Configurando o JavaScript do cliente para testar a coleta de dados
Para enviar os dados coletados é necessário inserir as credenciais configurados no Amazon Cognito e chamar o SDK da AWS dentro do JavaScript dá pagina que se pretende coletar os dados.
Abaixo, segue um exemplo bem simples de parte de código dessa chamada.
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no"> <title>teste</title> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.3/css/bootstrap.min.css"> <link rel="stylesheet" href="assets/css/styles.css"> </head> <body> <script src="https://sdk.amazonaws.com/js/aws-sdk-2.283.1.min.js"></script> <script> function basic() { AWS.config.region = '#### INSERT AMAZON COGNITO CONFIG REGION HERE ####'; AWS.config.credentials = new AWS.CognitoIdentityCredentials({ IdentityPoolId: '#### INSERT AMAZON COGNITO IDENTITY POOL ID HERE #####', }); AWS.config.credentials.get(function (err) { // attach event listener if (err) { alert('Error retrieving credentials.'); console.error(err); return; } // create Amazon Kinesis Data Streams service object var kinesis = new AWS.Kinesis({ apiVersion: '2013-12-02' }); var params = { Records: [ /* required */ { Data: JSON.stringify({ url: window.location.href, time: new Date(), offer: "basic" }), PartitionKey: 'partition-' + AWS.config.credentials.identityId }, ], StreamName: '##### INSERT AMAZON KINESIS DATA STREAMS NAME HERE ####' }; kinesis.putRecords(params, function (err, data) { if (err) console.log(err, err.stack); // an error occurred else console.log(data); // successful response }); }); } </script> <h1 class="text-center">Stream de dados</h1> <div class="container"> <p class="text-center">Página de exemplo para a configuração e teste do JS para envio de dados para o Amazon Kinesis Data Streams.
Se você configurou corretamente o arquivo, cada clique no botão abaixo será enviado para o Amazon Kinesis Data Streams e poderá ser visualizado no Kibana como no exemplo do blog post.</p> </div> <div class="container text-center"><button class="btn btn-primary text-center" type="button" onclick="basic()">Clique aqui</button></div> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.3/js/bootstrap.bundle.min.js"></script> </body> </html>
Depois de criar o html com as configurações de autenticação do Amazon Cognito e Amazon Kinesis Data Streams, uma tela como a apresentada abaixo:
Configurando o index dos dados no Kibana
Acesse a página do serviço clicando aqui.
Clique no domínio do Elasticsearch que foi criado no passo 1
Clique no link do Kibana como apresentado na imagem abaixo:
Depois da autenticação, a tela inicial será apresentada, clique no menu conforme imagem.
Selecione o menu de padrão de índice em Index Patterns.
Clique em Create index pattern.
Selecione o índice criado no passo 2, quando foi criado o Amazon Kinesis Data Firehose;
Clique em Next step.
Selecione time no campo Time Filter field name;
Clique em Create index pattern.
Clique no menu para poder visualizar os dados, conforme figura abaixo:
Selecione o índice no campo de filtro;
Clique em Refresh.
Os dados deverão ser apresentados, conforme figura abaixo.
Referência
Acesso as páginas dos produtos
Amazon Kinesis
https://aws.amazon.com/pt/kinesis
Amazon Kinesis Data Streams
https://aws.amazon.com/pt/kinesis/data-streams
Amazon Kinesis Data Firehose
https://aws.amazon.com/pt/kinesis/data-firehose
Amazon Cognito
https://aws.amazon.com/pt/cognito/
Acesso as páginas de serviço
Elasticsearch services
https://console.aws.amazon.com/es/
Amazon Kinesis
https://console.aws.amazon.com/kinesis/
Amazon Cognito
https://console.aws.amazon.com/cognito/
Amazon IAM
https://console.aws.amazon.com/iam
Sobre o autor
Joao Marcelo Barros de Almeida é Arquiteto de Soluções na AWS Brasil.