Projetos na AWS

Crie um aplicativo web moderno

Implante um aplicativo web, estabeleça uma conexão a um banco de dados e analise o comportamento dos usuários

Módulo 5: Capturar o comportamento do usuário

Neste módulo, você verá como capturar o comportamento do usuário usando o AWS Lambda e outros serviços sem servidor.

Visão geral

Agora que o site Mythical Mysfits está pronto e disponível, vamos criar uma maneira de entender melhor como seus usuários estão interagindo com ele e com os mysfits. Seria bastante fácil analisar as ações dos usuários no site que levam a alterações de dados no nosso back-end, ou seja, quando os mysfits são adotados ou curtidos.

Mas, entender as ações que os visitantes realizam no site antes de tomar qualquer decisão, como curtir ou adotar um mysfit, pode ajudar você a criar uma melhor experiência do usuário no futuro que leve à adoção ainda mais rápida dos mysfits. Para ajudar a coletar esses insights, implementaremos uma funcionalidade no front-end do site para que, cada vez que um usuário clicar no perfil de um mysfit, uma pequena solicitação seja enviada a uma nova API de microsserviço que criaremos. Esses registros serão processados em tempo real por uma função de código sem servidor e serão agregados e armazenados para qualquer análise futura que você queira realizar.

Os princípios de design dos aplicativos modernos usam preferencialmente serviços dedicados, desacoplados e modulares. Por isso, em vez de criar métodos e funcionalidades adicionais dentro do serviço Mysfits existente no qual você trabalhou até agora, criaremos um serviço novo e desacoplado com o objetivo de receber os eventos de cliques dos usuários do site Mysfits. A pilha completa foi representada usando um modelo do CloudFormation fornecido.

Diagrama da arquitetura

capturar o comportamento do usuário

Por que escolher o AWS Lambda para esta implementação?

O Lambda é ideal para aplicativos impulsionados por dados que precisam responder em tempo real a alterações em dados, mudanças no estado do sistema ou ações dos usuários. Esses aplicativos geralmente se conectam a datastores para acessar e analisar dados para processamento de lote, análise de fluxo e inferência de machine learning. O Lambda é apropriado para esses aplicativos por estar integrado a datastores como Kinesis Data Streams e Data Firehose, S3, CloudWatch Events, CloudWatch Logs e DynamoDB, hoje com um total de 17 fontes de eventos.   

Recursos sem servidor usados neste módulo

Fluxo de entrega do AWS Kinesis Firehose: o Kinesis Firehose é um serviço de streaming em tempo real gerenciado e de alta disponibilidade que recebe registros de dados que são automaticamente consumidos e direcionados para diversos destinos de armazenamento possíveis dentro da AWS, como buckets do Amazon S3 ou clusters de data warehouse do Amazon Redshift. O Kinesis Firehose também permite que todos os registros recebidos pelo fluxo sejam automaticamente entregues a uma função sem servidor criada com o AWS Lambda. Isso significa que o código que você escreveu pode realizar quaisquer processamentos ou transformações adicionais nos dados antes que eles sejam agregados e armazenados no destino configurado.

Bucket do Amazon S3: será criado um novo bucket no S3 no qual todos os registros de eventos de cliques são agregados em arquivos e armazenados como objetos.

Função do AWS Lambda: o AWS Lambda permite que o desenvolvedor escreva funções de código contendo apenas aquilo que sua lógica necessita. O código criado pode ser implantado, invocado, disponibilizado com alta confiabilidade e expandido sem qualquer necessidade de gerenciar uma infraestrutura. Aqui, usaremos o AWS SAM para definir uma função de código sem servidor. Ela será escrita em Python e implantada no AWS Lambda para processar e enriquecer os registros de cliques recebidos pelo fluxo de entrega. O código que escrevemos é bastante simples, e o enriquecimento que ele realiza poderia ser feito no front-end do site sem qualquer processamento adicional. A função recupera atributos adicionais do mysfit clicado para tornar o registro do clique mais relevante, com dados já recuperados pelo front-end do site. Mas, para os fins deste workshop, usaremos o código para demonstrar como é possível incluir na arquitetura uma função sem servidor para realizar qualquer transformação ou processamento adicional necessário, em tempo real, antes do armazenamento dos dados. Depois que a função do Lambda for criada e o fluxo de entrega do Kinesis Firehose for configurado como fonte de eventos para ela, o fluxo de entrega entregará automaticamente registros de cliques como eventos à função do código, receberá as respostas que o código retornará e entregará os registros atualizados para o bucket do Amazon S3 configurado.

Uma API REST do Amazon API Gateway: o AWS Kinesis Firehose oferece uma API de serviço como todos os outros serviços da AWS e, neste caso, estamos usando a operação PutRecord para colocar registros de eventos de cliques do usuário no fluxo de entrega. Mas não queremos integrar o front-end do site diretamente à API PutRecord do Kinesis Firehose. Para fazer isso, teríamos que gerenciar credenciais da AWS dentro do código do front-end para autorizar as solicitações à API PutRecord, expondo a API direta da AWS da qual dependemos aos usuários. Isso pode incentivar visitantes mal-intencionados a tentar adicionar registros ao fluxo de entrega que sejam malformados ou que prejudiquem nosso objetivo de entender o comportamento real do usuário. Em vez disso, usaremos o Amazon API Gateway para criar um proxy do serviço da AWS para a API PutRecord do Kinesis Firehose. Isso nos permite criar nosso próprio endpoint RESTful público que não exige gerenciamento de credenciais da AWS para solicitações no front-end. Além disso, usaremos um modelo de mapeamento de solicitação no API Gateway para definir nossa própria estrutura de carga útil. Assim, as solicitações à estrutura esperada serão restritas, e as solicitações bem formadas serão transformadas para a estrutura exigida pela API PutRecord do Kinesis Firehose.

Funções do IAM: o Kinesis Firehose exige uma função de serviço para permitir a entrega dos registros recebidos como eventos à função do Lambda criada e dos registros processados ao bucket de destino do S3. A API do Amazon API Gateway também requer uma nova função que permita invocar a API PutRecord dentro do Kinesis Firehose para cada solicitação recebida.

Instruções de implementação

  • A: Crie um novo repositório do CodeCommit

    Esta nova pilha que você implantará usando o CloudFormation conterá tanto os recursos de ambiente da infraestrutura como o código do aplicativo que o AWS Lambda executará para processar os eventos de streaming. Para empacotar a criação da infraestrutura e do código em uma única implantação, usaremos outra ferramenta da AWS que é pré-instalada no IDE da AWS Cloud9: a CLI do AWS SAM. O código de funções do AWS Lambda é entregue ao serviço em um pacote .zip transferido por upload ao bucket do Amazon S3.

    A CLI do SAM automatiza o processo. Com ela, podemos criar um modelo do CloudFormation que faz referências locais ao sistema de arquivos onde o código de nossa função do Lambda está armazenado. Em seguida, a CLI do SAM empacotará o código em um arquivo .zip que será transferido por upload para o bucket do Amazon S3 e criará um novo modelo do CloudFormation indicando o local do upload do pacote .zip no S3 para implantação no AWS Lambda. Depois disso, poderemos implantar esse modelo do CloudFormation gerado pela CLI do SAM na AWS e observar o ambiente ser criado juntamente com a função do Lambda que usa o pacote de código transferido.

    Primeiro, vamos criar um novo repositório do CodeCommit onde o código do serviço de streaming residirá:

    aws codecommit create-repository --repository-name MythicalMysfitsStreamingService-Repository

    Em resposta a esse comando, copie o valor em “cloneUrlHttp”. O valor deve ter esta forma: https://git-codecommit.REPLACE_ME_REGION.amazonaws.com/v1/repos/MythicalMysfitsStreamingService-Repository.

    Em seguida, vamos clonar o novo repositório vazio no nosso IDE:

    cd ~/environment/
    git clone {insert the copied cloneValueUrl from above}
    B: Copie a base do código do serviço de streaming

    Agora, vamos mover nosso diretório de trabalho para esse novo repositório:

    cd ~/environment/MythicalMysfitsStreamingService-Repository/

    Em seguida, copie os componentes do aplicativo do módulo 5 para o diretório do novo repositório:

    cp -r ~/environment/aws-modern-application-workshop/module-5/app/streaming/* .

    Vamos também copiar o modelo do CloudFormation para esse módulo.

    cp ~/environment/aws-modern-application-workshop/module-5/cfn/* .
  • A: Use o pip para instalar as dependências da função do Lambda

    Agora, temos o diretório do repositório definido com todos os artefatos fornecidos:

    Um modelo do CFN para criar toda a pilha.

    Um script Python contendo o código da função do Lambda: streamProcessor.py.

    Armazenar os modelos do CloudFormation juntamente com o código do aplicativo em um repositório é um método comum entre os clientes da AWS. Dessa forma, temos um único local onde todas as alterações no aplicativo e seu ambiente podem ser acompanhadas.

    Mas, se você analisar o código no arquivo streamProcessor.py, verá que ele usa as solicitações do pacote Python para fazer uma solicitação de API ao serviço Mythical Mysfits criado anteriormente. Bibliotecas externas não são automaticamente incluídas no ambiente de tempo de execução do AWS Lambda porque diferentes clientes da AWS podem depender de versões diferentes de diversas bibliotecas, entre outros fatores.

    Você terá que empacotar todas as dependências de bibliotecas juntamente com a função de código do Lambda antes do upload ao serviço Lambda. Para isso, usaremos o pip, um gerenciador de pacotes para Python. No terminal do Cloud9, execute o seguinte comando para instalar o pacote de solicitações e suas dependências localmente, juntamente com o código da função:

    pip install requests -t .

    Quando o comando tiver sido concluído, você verá várias pastas de pacotes Python adicionais armazenadas no diretório do repositório.

    B: Atualize o código da função do Lambda

    A próxima etapa é realizar uma alteração no código da função do Lambda para deixá-lo completamente pronto para a implantação. Será necessário substituir uma linha no arquivo streamProcessor.py pelo ApiEndpoint da API do serviço Mysfits, criado no módulo 4 e usado no front-end do site.

    replace-api-endpoint

    Esse serviço é responsável pela integração com a MysfitsTable no DynamoDB. Seria possível escrever uma função do Lambda que se integrasse diretamente à tabela do DynamoDB, mas isso interferia no objetivo do primeiro microsserviço e criaria múltiplas bases de código separadas que se integrariam com a mesma tabela. Em vez disso, faremos a integração com essa tabela usando o serviço existente, resultando em uma arquitetura de aplicativo muito mais desacoplada e modular.

    C: Envie o código para o CodeCommit

    Vamos confirmar as alterações do código no novo repositório para salvá-las no CodeCommit:

    git add .
    git commit -m "New stream processing service."
    git push
  • A: Crie um bucket do S3 para pacotes de código de função do Lambda

    Depois de alterar a linha no arquivo Python e confirmar o código, estamos prontos para usar a CLI do AWS SAM e empacotar o código da função, fazer upload do pacote para o S3 e criar o modelo implantável do CloudFormation para criar nossa pilha de streaming.

    Primeiro, use a AWS CLI para criar um novo bucket no S3 para o qual os pacotes de código da função do Lambda serão transferidos por upload. Como o nome de cada bucket no S3 precisa ser exclusivo entre todos os clientes da AWS no mundo, mude o final do nome do bucket para que seja exclusivo:

    B: Use a CLI do SAM para empacotar o código para o Lambda

    Depois de criar o bucket, estamos prontos para usar a CLI do SAM para empacotar e fazer upload do código e transformar o modelo do CloudFormation. Não esqueça de substituir o parâmetro do comando anterior pelo nome do bucket que você acabou de criar (este comando também pressupõe que seu terminal ainda está no diretório de trabalho do repositório):

    sam package --template-file ./real-time-streaming.yml --output-template-file ./transformed-streaming.yml --s3-bucket replace-with-your-bucket-name

    Se o procedimento for concluído com êxito, você verá o arquivo transformed-streaming.yml recém-criado no diretório /MythicalMysfitsStreamingService-Repository/. No conteúdo do arquivo, você verá que o parâmetro CodeUri da função do Lambda sem servidor foi atualizada com o local do objeto no qual a CLI do SAM fez upload do pacote de código.

    C: Implante a pilha usando o AWS CloudFormation

    O comando da CLI do SAM também retorna o comando que precisava ser executado para que o CloudFormation criasse toda a nova pilha. Mas como nossa pilha cria recursos do IAM, será necessário incluir mais um parâmetro no comando. Execute o seguinte comando para implantar a pilha de streaming:

    aws cloudformation deploy --template-file /home/ec2-user/environment/MythicalMysfitsStreamingService-Repository/cfn/transformed-streaming.yml --stack-name MythicalMysfitsStreamingStack --capabilities CAPABILITY_IAM

    Depois da criação da pilha, será possível criar o microsserviço de processamento em tempo real.

    Em situações futuras em que são feitas alterações apenas no código da função do Lambda sem alteração na pilha do CloudFormation, você poderá repetir os mesmos comandos da CLI do AWS SAM e do CloudFormation usados acima. Isso implantará o código na função do Lambda e manterá o ambiente da infraestrutura inalterado.

  • A: Atualize o conteúdo do site

    Com a pilha de streaming em execução, você precisa publicar uma nova versão do front-end do Mythical Mysfits com o JavaScript que enviará eventos ao serviço sempre que um usuário clicar no perfil de um mysfit.

    O novo arquivo index.html pode ser encontrado em: ~/environment/aws-modern-application-workshop/module-5/web/index.html.

    Esse arquivo contém os mesmos espaços reservados do módulo 4 que precisam ser atualizados, além de um espaço reservado adicional para o endpoint recém-criado do serviço de streaming. Consulte o arquivo anterior index.html que você atualizou no módulo 4 para obter os valores anteriores das variáveis.

    Execute o seguinte comando para que a nova pilha de streaming recupere o novo endpoint do API Gateway para o serviço de processamento de streaming:

    aws cloudformation describe-stacks --stack-name MythicalMysfitsStreamingStack
    B: Envie a nova versão do site para o S3

    Substitua o valor final em index.html pelo streamingApiEndpoint e você estará pronto para publicar a atualização finalizada da página inicial do Mythical Mysfits:

    aws s3 cp ~/environment/aws-modern-application-workshop/module-5/web/index.html s3://YOUR-S3-BUCKET/

    Atualize o site Mythical Mysfits no navegador mais uma vez e ele passará a registrar e publicar cada clique que um usuário dá no perfil de um mysfit!

    Os registros processados podem ser visualizados no bucket de destino do S3 criado como parte da MythicalMysfitsStreamingStack.

    Agora que sua arquitetura de aplicativo moderna está concluída, explore o Console AWS e os diversos serviços que você criou para lançar o Mythical Mysfits!

  • Não esqueça de excluir todos os recursos criados durante o workshop para garantir que não será cobrado pelos recursos por mais tempo que o desejado. Recomendamos usar o Console AWS para explorar os recursos que você criou e excluí-los quando não precisar mais deles.

    Os dois recursos provisionados usando o AWS CloudFormation podem ser removidos simplesmente executando o seguinte comando da CLI para cada pilha:

    aws cloudformation delete-stack --stack-name STACK-NAME-HERE

    Para remover todos os recursos criados, visite os seguintes Consoles AWS, que contêm os recursos criados durante o workshop do Mythical Mysfits:

Conclusão

Essa experiência foi criada para dar a você uma ideia de como um desenvolvedor projeta e cria arquiteturas de aplicativos modernos usando a AWS. Desenvolvedores na AWS podem provisionar recursos de forma programática usando a AWS CLI, reutilizar definições de infraestrutura usando o AWS CloudFormation, criar e implantar automaticamente alterações de código usando as ferramentas do desenvolvedor da AWS de serviços de código, e aproveitar os diferentes recursos de serviços de computação e aplicativos que não exigem o provisionamento nem o gerenciamento de quaisquer servidores!

Uma ótima sugestão para aprender mais sobre o funcionamento interno do site Mythical Mysfits que você criou é aprofundar-se no estudo dos modelos do CloudFormation e nos recursos declarados neles.

Esperamos que você tenha gostado deste workshop de criação de aplicativos modernos da AWS! Este tutorial também é hospedado pelo GitHub, onde você pode registrar um problema se tiver alguma recomendação. Você também poderá inicializar uma solicitação pull do GitHub se quiser colaborar na melhoria do código.

Para saber mais sobre desenvolvimento na AWS, visite o Centro do desenvolvedor da AWS.

Parabéns!

Você criou um aplicativo web moderno na AWS.
Compartilhe-o com seus amigos ou envie seu feedback.

Twilight Glitter adorou seu trabalho