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.

 

 

 

 

 

Use seus dados para impulsionar o crescimento do negócio. Inove continuamente usando o data flywheel.