Olá pessoal, tudo bem? Bem-vindos de volta aqui a nossa Jornal da Cloud. E agora nós vamos continuar falando do assunto DynamoDB. Só que agora nós não vamos falar apenas das capacidades de leitura e gravação. Nós vamos falar de uma capacidade muito interessante do Dynamo, que é o Dynamo de Stream, ou seja, a capacidade de eu streamar informações a partir de algum item mutável na minha tabela. Certo? Então, vamos imaginar o seguinte, eu tenho ali no Dynamo, eu pago por o recurso que eu provisionei, ou seja, o tamanho que minha tabela está crescendo. Eu pago por escrita nessa tabela e eu pago por leitura nessa tabela. Quando eu estou fazendo, imagina o seguinte, eu tenho uma API, eu tenho essa API e ela está fazendo escrita e leitura, então eu estou pagando basicamente por três coisas. O peso que esse item vai ter na minha tabela, estou pagando pela escrita e estou pagando também pela leitura. Então, vamos imaginar que eu tenho uma forma de baratear um pouco isso, e é exatamente o stream dessa informação. Ela parte da premissa de que, se eu tiver uma alteração em determinada linha da minha tabela, em determinado item, ele vai stream é uma tabela diferente do Dynamo, não é uma forma diferente de usar o Dynamo, não é um outro produto da AWS, é uma capacidade de todas as tabelas que eu quiser criar. Ela não é obrigatória, ela é opcional, então eu posso ou não usar o Dynamo do B-Stream. Mas, dentro do nosso modelo, a gente vai fazer uma proposta legal aqui para que você veja como que isso funciona na prática. Então, voltando aqui a nossa arquiteturinha, a gente tem aqui um navegador web que acessa uma API Gateway, que acessa uma Lambda, que grava no Dynamo. Então, o que eu vou fazer agora aqui? Eu vou procurar um DynamoDB Stream. Vamos ver se eu tenho algum item dele, vamos ver, só o stream aqui já vai ser suficiente, vamos pegar aqui o stream, vou jogar aqui e uma vez que eu salvar o item aqui dentro, certo? Eu quero que esse item seja streamado para uma segunda lambda. Que vai receber esse evento e eu quero que essa lambda poste lá naquele nosso SQS de teste. Poderia ser uma CMS? Poderia. Poderia ser uma S3? Poderia. Eu poderia jogar para uma S3, mas aí eu não precisaria configurar dessa forma, tem até outras formas mais fáceis de fazer se eu fosse só guardar em um bucket. Eu vou fazer dessa forma aqui porque é um modelo mais usual, ou seja, onde eu posso de fato fazer uso do daima. Então, eu quero criar um recurso no meu daima e a partir dessa criação eu quero que ele mande para uma segunda lambda para que eu possa estar vendo isso dentro de uma fila SQS. Então vamos lá para a prática disso? Bom, primeira coisa que eu tenho que fazer é criar essa lambda, logicamente a lambda que eu vou aportar este recurso então eu vou lá no AWS Lambda eu vou criar uma outra Lambda aqui criar função, criar do zero vou colocar aqui que ele vai ser Lambda Street ele é Python permissões, eu vou usar aquela nossa policy ele é Python, permissões, eu vou usar aquela nossa policy, aquela nossa role, né? Contém as policies que a gente já tem feito, acho que é só isso aqui. Vou criar a minha função. Certo? Bom, vou fazer deploy do meu código aqui que vai postar no SQS. Vai receber o evento e vai postar no SQS. É um código bem pequeno. Prontinho. Minha Lambda está virtualmente pronta, correto? Ainda não. Por quê? Porque quando a gente olha para a nossa policy, aqui dentro da nossa role eu tenho uma política de Dynamo. O que eu posso fazer? Eu posso fazer scan em tabela, eu posso pegar item, deletar, descobrir a tabela, atualizar item, criar item, atualizar item, eu posso fazer bastante coisa aqui, mas eu não tenho permissões para mais. Bom, isso aqui está na documentação da AWS. Se você quiser em determinado momento saber quais são as pólices, as permissões que eu precisaria ter para tratar um S3, a documentação pode te falar. Então, cada caso exige uma permissão diferente. Vou mudar aqui para o visual para ficar mais fácil da gente ver. Eles são itens de leitura, então eu preciso primeiramente do de screen de stream, que é esse carinha aqui, então ele tem que poder descobrir uma stream. eu preciso do listString onde está meu listString? está aqui dentro eu vou precisar do getRecords que é para eu ter os objetos que vão vir do Dynamo aqui dentro e eu preciso do shardInterator onde que ele está? está aqui coloquei essas quatro próximas salvar alterações atualizado vamos dar uma olhada lá nas minhas funções vamos ver se ele já refletiu função da iron, olha aí já atualizou aqui, então, já tenho a Lambda e minha Lambda agora já sabe falar com o Dynamo, ok? O Dynamo DB Stream. Vamos, nesse momento, então, pegar aquela nossa tabelinha que a gente já tem, então, pegar aquela nossa tabelinha que a gente já tem, que a gente já estava trabalhando nela, tá? E vamos colocar a stream pra funcionar. Então, vamos lá no DynamoDB, vamos lá na nossa tabela de customer. Antes, vamos ver se nossos itens permanecem aqui. Eu permaneço com os itens aqui. Eu vou fazer o seguinte, pessoal, eu vou deletar esses itens aqui para a gente criar tudo do zero, tá? Para eu não ter problema de querer streamar coisas que já estão aqui dentro. Então, excluir os itens aqui, tá? Pode ver, não tem nada. Tá bom? Agora, o que eu vou fazer aqui aqui, tá? Pode ver, não tem nada, tá bom? Agora, o que que eu vou fazer aqui dentro, tá? Vou pegar a minha tabelinha, vou entrar dentro dela, olha aqui, é uma capacidade da tabela, então eu jogo aqui exportação de stream, eu posso exportar, como eu falei, direto para um bucket mais simples posso fazer stream para o kinesis que é uma outra ferramenta da AWS ele não é bem um Kafka, tá pessoal? para ficar mais fácil o entendimento para quem ainda nunca trabalhou com isso é similar, tá? posso fazer um stream direto para o Kinesis mas você notar aqui ó detalhes do stream tá desativado vou ativar ele aqui eu vou querer que ele joga toda minha imagem tudo que tiver atualizando isso pode ficar um pouco, tá bom? Por questões de transferência de dados. Ainda não é nada muito grande porque eu já estou pagando o conjunto aqui, tá? Mas eu posso só mandar o ID também. Então, vou ativar meu fluxo aqui. Pronto. Quando eu ativar o fluxo, ele habilita a opção de gatilho pra mim. Então, vou criar um gatilho. Qual é a função lambda que eu vou ter? Lambda stream, lot, ativar o acionador. Vou criar o gatilho aqui. Já criei. Só que isso aqui ainda não está funcional. Por quê? Porque uma coisa é eu fazer o gatilho aqui, outra coisa é eu ativar na lambda para que ela possa estar de fato vendo isso. Eu poderia criar o gatilho a partir da Lambda? Poderia, tá bom? Eu tenho formas lá de criar por lá também, tá? Como todos os serviços da AWS se comunicam, tem capacidade de comunicação entre si, eu poderia também seguir essa abordagem. Eu vim por aqui porque é o caminho tradicional, tá bom? Se você quer um recurso do Dynamo, é natural que você vá diretamente nele. Se eu olhar aqui na Lambda, vamos atualizar, ele já vai provavelmente aqui, ó, aparecer o gatilho do Dynamo para mim. Ó, já apareceu, tá vendo? Só que isso aqui pode ainda não estar funcional, se eu vou vir aqui em configurações, eu vou ter um gatilho, ele está habilitado, eu vou simplesmente editar, tá bom? Pra deixar ele ativo aqui, manter ele ativo, pra que as duas coisas se comuniquem, às vezes você vai testar na tua casa, e você vai fazer do Dynamo pra cá e você vai fazer toda a gravação certinha e ele não vai streamar. Por quê? Porque esses recursos foram criados em momentos diferentes. Então, isso aqui é uma forma de forçar a comunicação. Claro que se você tiver um contexto de CloudFormation onde eles são criados em runtime juntamente, isso não tem tanta necessidade. Mas, por garantia, se você notar que você criou lá o seu gatilho a partir da tabela e ele não fez a comunicação aqui, você pode vir dessa forma que ele já vai fazer. Então, vamos dar uma olhada aqui no nosso SQS vamos lá nosso SQS não tem nada nossa lambda já tem o gatilho é e a nossa tabela no daem também já tem ainda não foi nada processado ok? vamos lá para o nosso tester e eu vou criar vou gerar outros nomes aqui vou pegar um nome aqui esse aqui de baixo vou pegar este nome aqui e vou criar esse item antes de eu criar esse item, vamos conferir nossa fila vazia, não tem nada na fila item, vamos conferir nossa fila? Vazia, não tem nada na fila, ok? Vamos conferir aqui o CloudWatch para a gente ter certeza de que ainda não criou nada desse carinha aqui? Vamos lá, nos meus grupos de log eu ainda não tenho nenhum string do LambdaString. não tenho nenhum grupo de log pra ele. Então, fila ok, sem log, lambda ainda não executou, vamos criar o nosso item. estou enviando opa, olha só criou troll vamos ver se ele criou na tabela explorar item criou aqui o nosso item vamos ver nossa fila, se ele comunicou olha aqui, ele comunicou um item para minha fila vamos ver se esse item vem do Dynamo vamos pesquisar aqui ó enviar receber mensagem pesquisar a mensagem olha lá ó Dynamo veio do Dynamo olha aqui ó new image tá vendo ele mandou todo o objeto para mim, todo o record, por isso que a gente precisa daquela policy, tá dizendo? Ele vem no modelo JSON aqui de record pra que eu possa tá vendo todos os itens, tá? Então, é isso. Vamos fazer mais um? Só pra gente testar, ó, tá aí a mensagem. A mensagem trans, ele tá aparecendo ali porque eu fiz a leitura dela, tá bom? Então, vamos lá. Vou criar mais um item, vou pegar aqui outro nome e vou jogar aqui dentro. item criado, vamos dar uma olhadinha, criado, gating, lambda, dynamo, dynamo stream, lambda, sqs, vamos ver as mensagens aqui no sqs, duas mensagens disponíveis. E isso vai acontecer para quaisquer itens que eu criar, exatamente pelo fato de eu ter configurado um gatilho que replica toda a imagem do dado postado ali no Dynamo History. Então, é isso. É uma forma de você baratear um pouco a sua operação a itens de leitura e escrita tá bom? e é uma forma de você enviar pra quaisquer itens que você tiver necessidade, eu poderia ali ter um SMS e ter cinco filas interessadas nisso com subscription dentro do SMS, tá bom? Então, isso é muito legal, é um recurso muito útil de tabela do Dynamo, tá bom? Que a gente tem. Então, dentro de todos esses itens, é uma forma interessante da gente ter. Uma outra coisa que você pode configurar para baratear ainda mais ainda a sua tabela é também o TTL, tá bom? Você pode criar aí um tempo de vida do dado dentro da tabela do Dynamo, tá? Então, imaginar que você falou, poxa, eu tenho aqui uma tabela Dynamo, porque ela tem que ser transitória e garantir uma persistência mínima, uma baixa persistência, né? Eu venho, gravo, salvo na minha base, dou um retorno para o cliente, mas se eu estou usando stream, eu vou jogar ali aquele stream para já dentro do FQS que vai colocar, por exemplo, em bases finais ou distribuir para vários interessados, várias bases fins dentro do sistema. Vai depender muito da arquitetura que você segue. E esse dado não é mais importante para mim. Eu não vou ter multabilidade ou consultas nele dentro do Daim. Eu poderia falar que esse Daim tem que durar, por segurança, 24 horas, por exemplo. E logo após isso, o dado some. Então, eu posso excluir os itens inspirados da tabela, de forma muito simples. Então, assim, muitas coisas aqui dentro, capacidade de tabela, são formas backups, tá bom? Eu posso configurar backups aqui dentro, claro, gente, vamos lá. Cada recurso adicional que eu atrevo aos meus recursos AWS, eu incorro na possibilidade de pagar por eles ou pelos itens que eles usam. Então, é claro que você não vai ter uma base FIM sem um backup. Mas se o seu dado tem volatilidade, ou seja, é um dado que nasce e morre, veja o quanto você realmente necessita desse backup, tá? Porque às vezes você pode só estar pagando por recursos que você não vai usar. Então, na teoria do seguro morreu de velho, dentro da AWS a gente tem formas de replicar o dado, como eu mostrei aqui, por stream, sem ter a necessidade de garantir um tempo de vida muito alto. Para os nossos itens aí. Bom, é isso. Espero que vocês aproveitem muito dos recursos do Dynamo, porque é uma coisa muito incrível de ser usada. Bom, então é isso, pessoal. Mais uma vez, agradeço e boa sorte. you you you you you you