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