Lab: O Relatório Automatizado - Trabalhando com AWS Lambda
O Cenário (A "User Story")
Como o dono de uma cafeteria, EU QUERO um sistema que automaticamente gere um relatório de análise de vendas todos os dias e o envie para o meu e-mail, PARA QUE eu possa tomar decisões de negócio baseadas em dados, sem precisar rodar relatórios manualmente ou manter um servidor para isso.
A Dor que o Lab Resolve
- Processos Manuais: Gerar relatórios manualmente é uma tarefa repetitiva, demorada e propensa a erros humanos.
- Custo de Infraestrutura: Manter um servidor (EC2) ligado 24/7 apenas para executar uma tarefa que roda por poucos minutos por dia é um grande desperdício de dinheiro.
Este laboratório resolve essas dores construindo um pipeline de relatórios 100% serverless, que só consome recursos quando está efetivamente trabalhando.
Objetivos de Aprendizado
Ao final deste laboratório, você será capaz de:
- Criar uma Camada (Layer) do Lambda para gerenciar dependências de código.
- Criar uma função Lambda que se conecta a um banco de dados em uma VPC.
- Configurar um gatilho agendado (Scheduled Trigger) com o Amazon EventBridge.
- Orquestrar a chamada de uma função Lambda por outra.
- Usar o CloudWatch Logs para solucionar problemas (
troubleshoot
).
O Passo a Passo
Tarefa 1: Analisando os "Crachás de Acesso" (As Funções do IAM)
Analogia: Antes de contratar nossos "gênios da lâmpada" (as funções Lambda), precisamos ir ao "departamento de segurança" (IAM) e pegar os crachás de acesso corretos para eles.
- No Console da AWS, navegue até IAM > Funções (Roles).
- Analise a
salesAnalysisReportRole
:- Relações de confiança (Trust relationships): Veja que ela "confia" no
lambda.amazonaws.com
. Isso permite que o serviço Lambda "vista" este crachá. - Permissões (Permissions): Observe as políticas. Ela tem permissão para enviar notificações (
AmazonSNSFullAccess
), invocar outras Lambdas (AWSLambdaRole
), etc.
- Relações de confiança (Trust relationships): Veja que ela "confia" no
- Analise a
salesAnalysisReportDERole
:- Permissões: Observe a política
AWSLambdaVPCAccessExecutionRole
. Este é o "passe especial" que permite que uma função Lambda se conecte a recursos dentro da sua rede privada (VPC), como nosso banco de dados.
- Permissões: Observe a política
Tarefa 2: Criando a "Mochila de Ferramentas" e o Primeiro "Gênio"
Analogia: Nosso primeiro gênio precisa de uma "ferramenta especial" (uma biblioteca Python) para falar com o banco de dados MySQL. Em vez de colocar a ferramenta dentro do livro de feitiços, vamos colocá-la em uma "mochila de ferramentas" (Lambda Layer) que ele pode usar.
- Crie a Camada (Layer):
- Navegue até AWS Lambda > Camadas (Layers) e clique em Criar camada (Create layer).
- Nome (Name):
pymysqlLibrary
. - Descrição (Description):
Biblioteca PyMySQL
. - Fazer upload de um arquivo .zip: Faça o upload do arquivo
pymysql-v3.zip
que você baixou. - Runtimes compatíveis: Selecione
Python 3.9
. - Clique em Criar (Create).
- Crie a Função Extratora de Dados:
- Vá em Funções (Functions) e clique em Criar função (Create function).
- Nome da função (Function name):
salesAnalysisReportDataExtractor
. - Tempo de execução (Runtime):
Python 3.9
. - Permissões (Permissions): Expanda
Alterar a função de execução padrão
, selecioneUsar uma função existente (Use an existing role)
e escolhasalesAnalysisReportDERole
. - Clique em Criar função.
- Anexe a "Mochila" à Função:
- Na página da sua nova função, no painel Visão geral da função (Function overview), clique no nó Camadas (Layers).
- Clique em Adicionar uma camada (Add a layer).
- Selecione
Camadas personalizadas (Custom layers)
, escolhapymysqlLibrary
e aVersão (Version)
1. Clique em Adicionar (Add).
- Faça o Upload do "Livro de Feitiços":
- Na aba Código (Code), em Origem do código (Code source), clique em Fazer upload de (Upload from) e selecione Arquivo .zip.
- Faça o upload do arquivo
salesAnalysisReportDataExtractor-v3.zip
.
- Configure o Ponto de Entrada (Handler):
- Ainda em Código (Code), em Configurações de runtime (Runtime settings), clique em Editar (Edit).
- Altere o Manipulador (Handler) para:
salesAnalysisReportDataExtractor.lambda_handler
. Salve.
- Conecte a Função à Rede:
- Vá para a aba Configuração (Configuration) > VPC.
- Clique em Editar (Edit) e conecte a função à
VPC da cafeteria (CafeVPC)
, àSub-rede pública 1 (Public Subnet 1)
e aoGrupo de segurança (Security group)
CafeSecurityGroup
. Salve.
Tarefa 3: Testando e Solucionando Problemas do "Gênio"
- Prepare o Teste:
- Vá para o Systems Manager > Parameter Store e copie os valores dos parâmetros do banco de dados (
/cafe/dbUrl
,dbName
, etc.). - Na sua função Lambda, vá para a aba Testar (Test). Crie um novo evento de teste chamado
SARDETestEvent
. - Cole o JSON abaixo, substituindo os valores pelos que você copiou:
{ "dbUrl": "<valor_do_dbUrl>", "dbName": "<valor_do_dbName>", "dbUser": "<valor_do_dbUser>", "dbPassword": "<valor_do_dbPassword>" }
- Salve o evento de teste.
- Vá para o Systems Manager > Parameter Store e copie os valores dos parâmetros do banco de dados (
- Execute o Teste: Clique em Testar (Test). Você verá um erro de
Task timed out
. - O Detetive:
- A Dor: A função não consegue se conectar ao banco de dados e o tempo se esgota.
- A Pista: Conexões de banco de dados MySQL usam a porta
3306
. A função está na VPC, mas a "fechadura" (Security Group) está permitindo que ela entre no "prédio" do banco de dados? - A Solução: Vá para o EC2 > Grupos de Segurança (Security Groups). Selecione o
CafeSecurityGroup
. Vá em Editar regras de entrada (Edit inbound rules). Adicione uma nova regra que permita tráfegoMySQL/Aurora (porta 3306)
a partir do próprioCafeSecurityGroup
(isso permite que recursos dentro do mesmo grupo de segurança conversem entre si).
- Teste Novamente: Volte para a função Lambda e execute o teste novamente. Agora ele deve passar!
- Popule o Banco de Dados: Acesse o site da cafeteria (o IP está nos detalhes do lab) e faça alguns pedidos para gerar dados.
- Teste Final: Execute o teste na função Lambda mais uma vez. Agora, a saída JSON no campo
body
deve conter os dados dos pedidos que você fez.
Tarefa 4 e 5: Criando o "Gênio Maestro" e o Gatilho
- Crie o Tópico SNS: Vá para o Amazon SNS e crie um tópico chamado
salesAnalysisReportTopic
. Crie uma inscrição (subscription) para o seu e-mail e confirme-a na sua caixa de entrada. Anote o ARN do tópico. - Crie a Função "Maestro": Usando a AWS CLI no seu CLI Host, crie a segunda função.
- Navegue até a pasta
activity-files
. - Obtenha o ARN da
salesAnalysisReportRole
no console do IAM. - Execute o comando
create-function
(substituindo os valores):aws lambda create-function \ --function-name salesAnalysisReport \ --runtime python3.9 \ --zip-file fileb://salesAnalysisReport-v2.zip \ --handler salesAnalysisReport.lambda_handler \ --region us-west-2 \ --role <ARN_DA_SUA_ROLE>
- Navegue até a pasta
- Configure a Função "Maestro":
- No console do Lambda, abra a função
salesAnalysisReport
. - Na aba Configuração (Configuration) > Variáveis de ambiente (Environment variables), crie uma variável chamada
topicARN
e cole o ARN do seu tópico SNS como valor.
- No console do Lambda, abra a função
- Teste a Função "Maestro": Vá na aba Testar (Test), crie um evento "hello-world" e execute. > O Resultado: Você deve receber um e-mail com o relatório de vendas! A função "maestro" invocou a função "extratora", pegou os dados e os enviou para você.
- Crie o Gatilho Agendado:
- Na função
salesAnalysisReport
, clique em + Adicionar gatilho (+ Add trigger). - Selecione EventBridge (CloudWatch Events).
- Crie uma nova regra chamada
Gatilho-Relatorio-Diario
. - Selecione Expressão de programação (Schedule expression) e use uma expressão
cron
para que ela rode em 5 minutos (lembre-se que o horário é UTC!). - Ex:
cron(MINUTOS HORA ? * MON-SAT *)
- Na função
- Verificação Final: Aguarde o horário agendado. Você receberá o relatório de vendas no seu e-mail, desta vez disparado automaticamente pelo "relógio mágico" do EventBridge.
Conclusão
Parabéns! Você construiu uma solução serverless de ponta a ponta, orquestrando múltiplos serviços da AWS. Você atuou como um verdadeiro engenheiro de nuvem, não apenas implantando, mas também diagnosticando e corrigindo problemas de configuração de rede e permissões.
Meu Diário de Bordo: Ensinando a Nuvem a Trabalhar Sozinha
Hoje foi um daqueles laboratórios que te levam para o próximo nível. A missão era construir um sistema de relatórios de vendas totalmente automatizado, 100% serverless. A ideia era ter um "robô" que, toda noite, acessasse um banco de dados, gerasse um relatório e o enviasse para o meu e-mail.
O que eu não esperava era a quantidade de lições valiosas que eu aprenderia no caminho, especialmente quando as coisas deram errado.
A Jornada em 4 Atos
Ato 1: A "Mochila de Ferramentas" (Lambda Layers)
- A Dor: Meu "assistente robô" (a função Lambda) precisava de uma ferramenta especial para falar com o banco de dados MySQL (a biblioteca
PyMySQL
). Como eu entrego essa ferramenta para ele? - O Que Eu Fiz: Em vez de embutir a ferramenta no "cérebro" do robô, eu criei uma Camada (Layer) do Lambda.
- O "Aha!" Moment:
- Analogia: Eu criei uma "mochila de ferramentas" com a
PyMySQL
dentro. Agora, qualquer um dos meus futuros robôs que precisem falar com um banco de dados pode simplesmente "vestir" essa mesma mochila. Isso mantém o código do robô limpo, focado na sua tarefa, e torna minhas ferramentas reutilizáveis.
- Analogia: Eu criei uma "mochila de ferramentas" com a
Ato 2: O Detetive de Rede (O Bug do Timeout)
- A Dor: Eu executei minha função pela primeira vez e... falhou. A mensagem era
Task timed out
. O código parecia certo, o banco de dados estava no ar. O que estava acontecendo? - O Que Eu Fiz: Fui investigar. A pista era que a função não conseguia chegar ao banco de dados.
- O "Aha!" Moment: A ficha caiu: minha função Lambda estava conectada à minha rede privada (VPC) para poder acessar o banco. Isso significa que ela estava dentro das minhas muralhas de segurança.
- Analogia: Meu "robô" estava tentando falar com o "servidor do banco de dados", mas a "fechadura eletrônica" (o Security Group) da sala do banco de dados não reconhecia o crachá do robô. Ele estava sendo barrado na porta!
- A Solução: Eu tive que ir no Security Group do banco de dados e adicionar uma regra permitindo a entrada de tráfego vindo do Security Group da minha própria função Lambda. A segurança de rede se aplica até mesmo a recursos serverless!
Ato 3: O Maestro e o Músico (Orquestrando Funções)
- A Dor: Eu poderia ter escrito uma única função gigante que fazia tudo. Mas isso seria confuso e difícil de manter.
- O Que Eu Fiz: O lab me ensinou a separar as responsabilidades, criando duas funções.
- O "Aha!" Moment:
- Analogia: Eu construí dois robôs. Um era um "músico especialista" (
DataExtractor
), cujo único trabalho era tocar um instrumento perfeitamente (consultar o banco de dados). O outro era o "maestro" (salesAnalysisReport
). O maestro não toca um instrumento; seu trabalho é chamar o músico na hora certa, pegar a música, formatar o relatório e enviá-lo para a audiência (o tópico SNS). Essa separação de tarefas torna o sistema muito mais limpo.
- Analogia: Eu construí dois robôs. Um era um "músico especialista" (
Ato 4: O Relógio Mágico (O Gatilho Agendado)
- A Dor: Como fazer esse relatório rodar toda noite, sem que eu precise apertar o botão?
- O Que Eu Fiz: Criei um gatilho agendado com o Amazon EventBridge.
- O "Aha!" Moment:
- Analogia: Eu configurei um "relógio mágico" para "esfregar a lâmpada" do meu robô maestro todo dia, em um horário específico. A automação estava completa.
A Grande Lição
Este lab não foi apenas sobre codificação; foi sobre arquitetura. Ele me ensinou que "serverless" não significa "sem complexidade", mas sim construir sistemas poderosos juntando pequenos serviços especializados como peças de Lego.
Depurar o problema do Security Group foi frustrante no início, mas incrivelmente recompensador. Me forçou a entender que, mesmo que eu não gerencie o servidor, eu ainda sou o arquiteto responsável pela segurança e pela forma como os componentes interagem. Ver aquele e-mail automático chegar na minha caixa de entrada, disparado por um relógio que eu configurei... foi uma sensação fantástica de dever cumprido.