Alexa Flash Briefing — Lambda e S3

Como criar um resumo de notícias (Flash Briefing) com uma AWS Lambda e um Bucket S3

Jean Jacques Barros
5 min readMar 30, 2022

Neste artigo irei mostrar como criar um resumo de notícias da forma mais simples possível com uma AWS Lambda que irá gerar um novo arquivo atualizado com notícias todos os dias e salva essas informações em um arquivo JSON dentro de um Bucket S3, possibilitando fácil acesso para leitura de uma Skill da Alexa.

Há pouco tempo, obtive a certificação AWS Cloud Practitioner e, buscando implementar o que aprendi durante os meus estudos, atualizei a Skill da Alexa que havia criado para a Newsletter do Filipe Deschamps para que agora os meus resumos de notícia sejam gerados por meio de uma Lambda e salvos em um S3 para que possam ser acessados.

Mas o que é um Flash Briefing? Bem… o Flash Briefing é um resumo de notícias que os usuários da Alexa podem configurar para escutar todo dia de manhã ou quando chamarem o comando “Alexa, me fale o meu resumo de notícias”. Desta forma fica mais fácil de ter apenas aquelas notícias mais importantes do dia de forma resumida. Diversas empresas já tem a seu próprio resumo, como Globo, CNN, Tecmundo e muitas outras. E agora você pode ter o seu próprio Flash Briefing!

S3 Bucket

O Amazon S3 ou Amazon Simple Storage, tem como finalidade armazenar arquivos, e iremos utilizar ele para salvar o arquivo feed.json criado pela nossa Lambda.

Lambda

Este serviço serveless da AWS consiste de um código que executa em resposta a um evento e gerencia automaticamente os recursos de computação exigidos por esse código. Este evento pode ser uma chamada HTTP, um alarme em alguma aplicação ou um horário pré-definido (que é o nosso caso).

Para ativar nossa lambda criei dois eventos agendados, um que roda às 11h10 e outro às 11h50. Percebi que são entre estes horários que o e-mail com as notícias chega em minha caixa de mensagens.

Este é o código da Lambda, o qual será chamado sempre que um dos triggers (gatilhos) acima for acionado.

Estou utilizando o SDK (Software Development Kit) para Nodejs aws-sdk que auxilia a realizar a comunicação com os serviços disponíveis na nuvem. Crio uma conexão com o S3 na linha 4 e por meio deste objeto posso realizar as ações necessárias. Nesse caso irei excluir e enviar para dentro do bucket (aws-us-east-1–416068129208-newsletter-alexa-pipe) um objeto do tipo JSON (feed.json).

Estou resgatando as credenciais de accessKeyId e secretAccessKey por meio de variáveis de ambiente configuradas na Lambda:

A função que será chamada é a scheduledEventLoggerHandler e por meio dela que é feito o controle, então pegamos as notícias por meio da função getNews(), e inserimos dentro da variável data. Percebi que o arquivo não estava sendo atualizado dentro do bucket, por conta disso, criei essa função para deletar ele antes de fazer o novo upload. Mas após o arquivo ter sido removido, podemos enviar um novo que, ao ser gerado, o feed.json deve ter o seguinte formato para ser lido pela Alexa:

[
{
"uid": "b89847c0-bd29-4ae6-a983-e1e715811b32",
"updateDate": "2021-04-20T15:10:03.335Z",
"titleText": "Notícias que chamaram a nossa atenção nesta terça-feira:",
"mainText": "Notícias que chamaram a nossa atenção nesta terça-feira: ",
"redirectionUrl": "https://filipedeschamps.com.br/newsletter"
}
...
]

Para mais informações sobre como criar esse formato e sobre a implementação do método getNews() acessem o primeiro artigo: Alexa Skill — Newsletter Reader (Filipe Deschamps), lá eu explico como limpar o texto e gerar esse código.

Infraestrutura como código (CloudFormation)

Essa etapa é opcional, mas para facilitar no momento de enviar atualizações, de código ou de infra, para a aplicação, utilizei um recurso para criar a infraestrutura por meio de um código chamado CloudFormation. Por meio deste template.yml, estou criando a nossa Lambda, dando as permissões necessárias para ela por meio de policies e definindo os Triggers.

Cloudformation para Lambda e configuração dos eventos

Console Alexa

Agora vamos criar nossa Skill no Console da Alexa, para você apenas irá aparecer a versão “In Dev” porque ainda não foi publicada.

Clique em cima para editar e adicione um novo feed:

Aqui iremos adicionar inicialmente o que a Alexa deve dizer quando chamar o resumo, nesse caso “Da Newsletter Filipe Deschamps”. Você pode adicionar um ícone, informações da frequência em que seu resumo terá atualizações (diariamente nesta aplicação). O formato será em texto, mas poderiam ser utilizados áudios, também hospedados no S3. Qual o gênero e adicione o endereço apontando para o nosso arquivo JSON (essa é a parte mais importante!).

Pronto, após salvar, temos nosso Flash Briefing configurado. É possível testar no site ou na Alexa que estiver conectada em sua conta!

Free Tier

Para evitar custos inesperados, essa arquitetura foi pensada para utilizar apenas os recursos gratuitos disponibilizados pela AWS. Caso queria conhecer quais são estes serviços, acesse: Free Cloud Computing Services — AWS Free Tier (amazon.com)

Consumo do Free Tier AWS

Conclusão

Essa solução com Lambda e S3 não saiu na primeira implementação porque eu realmente não conhecia a melhor maneira de utilizar os recursos da AWS e sempre fiquei muito receoso por conta dos custos. E estou estou escrevendo este artigo para mostrar que o desenvolvimento de um software é um processo de crescimento gradual, um ensinamento que tiro desta experiência é que você não deve tentar fazer uma solução super robusta de início. Crie um MVP, valide a ideia e depois vá melhorando conforme for aprendendo.

Aqui está o link para a Skill, não esqueça de dar uma nota no site da Amazon, isso ajuda muito!

Flash Briefing — https://www.amazon.com.br/dp/B08SQTLJSK

Caso tenha alguma crítica, sugestão ou dúvida fique a vontade para me enviar uma mensagem:

Linkedin: https://www.linkedin.com/in/jjean-jacques10/

Revisão de texto realizada por: Gabriel Petillo

Até a próxima!

Referências

Alexa Skills Kit Official Site: Build Skills for Voice <https://developer.amazon.com/pt-BR/alexa/alexa-skills-kit>

Alexa Skills and Features <https://www.amazon.com/alexa-skills/b?ie=UTF8&node=13727921011>

Newsletter Filipe Deschamps <https://filipedeschamps.com.br/newsletter>

@jjean_dev • Instagram <https://www.instagram.com/jjean_dev/>

--

--

Jean Jacques Barros

I'm a software engineer passionate about coding and mangas/animes