Introdução
Uma equipe de checkout precisa de uma função que calcule o total de um pedido. Você implantará um pequeno manipulador Python, enviará duas entradas JSON e atualizará o cálculo com uma taxa de processamento. Use centavos inteiros para manter a aritmética simples e, depois, remova sua função e seus logs.
Conclua primeiro Get Started with AWS on LabEx, Use Credenciais Temporárias com uma Função IAM e Encontre uma Solicitação com Falha no CloudWatch Logs. Este ambiente novo fornece a CLI, o diretório de trabalho e a função de execução.
Relação com as certificações
Este laboratório oferece prática nos seguintes tópicos de exame.
- Cloud Practitioner (CLF-C02) · Tarefa 3.3: Implantação Lambda, eventos JSON e respostas calculadas.
- Solutions Architect – Associate (SAA-C03) · Tarefa 2.1: Implantação Lambda, eventos JSON e respostas calculadas.
- Developer – Associate (DVA-C02) · Tarefa 1.2: Implantação Lambda, eventos JSON e respostas calculadas.
Implante um Cálculo de Pedido
Nesta etapa, você substituirá um manipulador inacabado e implantará uma função. O AWS Lambda executa seu código quando você invoca uma função. Um evento é a entrada fornecida para essa invocação; um manipulador (handler) é a função Python que o Lambda chama com essa entrada. A configuração app.handler significa a função chamada handler em app.py.
Entre no diretório de trabalho preparado e inspecione o esqueleto. Ele atualmente retorna um objeto vazio, portanto não consegue calcular um pedido.
cd /home/labex/project
cat app.py
Python usa indentação para agrupar instruções dentro de uma função. event["quantity"] lê um valor do objeto JSON recebido. * multiplica a quantidade pelo preço unitário; return envia o objeto calculado a quem fez a chamada. context fornece informações da invocação, embora este cálculo ainda não precise delas.
Substitua o esqueleto por este manipulador completo. cat > app.py grava no arquivo as linhas entre <<'PY' e o PY de fechamento. A linha de fechamento deve ficar sozinha.
cat > app.py <<'PY'
import json
def handler(event, context):
order_id = event["order_id"]
quantity = event["quantity"]
unit_price = event["unit_price_cents"]
total = quantity * unit_price
print("EVENT " + json.dumps(event))
return {"order_id": order_id, "total_cents": total}
PY
A instrução print grava a entrada nos logs de execução; ela não retorna a resposta. Mantenha segredos de clientes fora dos logs. Estes eventos contêm apenas identificadores sintéticos e números.
Crie um pacote Zip, o arquivo compactado que o Lambda implanta. Coloque app.py no nível superior para que o manipulador seja encontrado. A função de execução (execution role) é a identidade que o Lambda usa ao executar seu código. Esta função IAM preparada permite o registro de logs; você configurará o acesso a dados em um laboratório posterior. Leia seu ARN em uma variável do shell. Um ARN identifica um recurso específico; a variável evita copiá-lo manualmente.
zip -q function.zip app.py
ROLE_ARN=$(aws iam get-role --role-name labex-fn01-execution --query 'Role.Arn' --output text)
Implante usando o ambiente de execução Python 3.12 e um tempo limite de cinco segundos. fileb:// lê o arquivo compactado como bytes. O ambiente de execução escolhe o ambiente da linguagem; o tempo limite restringe a duração de uma invocação.
aws lambda create-function --function-name labex-fn01-quote --runtime python3.12 --handler app.handler --role "$ROLE_ARN" --zip-file fileb://function.zip --timeout 5 --query '{Name:FunctionName,Runtime:Runtime,Handler:Handler,Timeout:Timeout,CodeSize:CodeSize}'
Espere Name labex-fn01-quote, Runtime python3.12, Handler app.handler, Timeout 5 e um CodeSize positivo. Criar a função implanta código; isso não invoca o manipulador.
O AWS View exibe a função, o manipulador e a impressão digital do código. Os logs de invocação ainda estão vazios. O grupo de logs de referência contém dados não relacionados da plataforma e deve permanecer inalterado.
Invoque Dois Eventos JSON
Nesta etapa, você chamará a função implantada com dois pedidos diferentes e interpretará suas respostas. JSON representa um objeto com campos nomeados. Números não têm aspas; strings têm. Cada invocação recebe seu próprio evento.

Grave o primeiro evento: dois itens de 375 centavos cada.
cat > small.json <<'JSON'
{"order_id":"fn01-small","quantity":2,"unit_price_cents":375}
JSON
Invoque a função e salve sua resposta. --cli-binary-format raw-in-base64-out permite que a CLI aceite JSON comum como payload. file:// lê o texto do evento; o nome de arquivo final recebe o payload retornado.
aws lambda invoke --function-name labex-fn01-quote --cli-binary-format raw-in-base64-out --payload file://small.json small-response.json
cat small-response.json
O comando informa StatusCode 200. O arquivo de resposta deve conter {"order_id":"fn01-small","total_cents":750}. O status da solicitação ao serviço e os dados retornados pelo manipulador são evidências diferentes; inspecione o payload também.
Envie um segundo pedido sem reimplantar o código. Cinco itens de 120 centavos devem produzir um total diferente.
cat > large.json <<'JSON'
{"order_id":"fn01-large","quantity":5,"unit_price_cents":120}
JSON
aws lambda invoke --function-name labex-fn01-quote --cli-binary-format raw-in-base64-out --payload file://large.json large-response.json
cat large-response.json
Espere {"order_id":"fn01-large","total_cents":600}. Os valores de entrada orientam o cálculo da mesma função.
No AWS View, compare os IDs dos pedidos, as quantidades, os preços e os totais. A configuração da função permanece igual enquanto os registros de invocação mudam. Abra Show logs para qualquer um dos pedidos para ver sua entrada e o resultado retornado.
Atualize o Código e Rastreie Seu Resultado
Nesta etapa, você adicionará uma taxa de processamento de 100 centavos e confirmará que uma nova invocação executa o cálculo atualizado. Editar o app.py local não altera o código implantado; atualize o pacote e envie-o ao Lambda.
Substitua o manipulador por esta revisão. Somente o cálculo muda: + 100 adiciona a taxa após a multiplicação.
cat > app.py <<'PY'
import json
def handler(event, context):
order_id = event["order_id"]
quantity = event["quantity"]
unit_price = event["unit_price_cents"]
total = quantity * unit_price + 100
print("EVENT " + json.dumps(event))
return {"order_id": order_id, "total_cents": total}
PY
zip -q function.zip app.py
aws lambda update-function-code --function-name labex-fn01-quote --zip-file fileb://function.zip --query '{Name:FunctionName,CodeSHA:CodeSha256}'
A implantação retorna o nome e uma impressão digital SHA do código. O AWS View mostra a impressão digital alterada; os resultados de invocações anteriores permanecem nos logs.
Para comparar com o Console, o exemplo oficial mostra o arquivo Python ao lado dos controles Deploy e Test. Seus lambda_function.py e lambda_handler correspondem ao app.py e ao handler deste laboratório; continue aqui com o fluxo de trabalho do Terminal.

Fonte: Guia do AWS Lambda.
Use as quantidades do primeiro pedido com um novo ID de correlação.
cat > revised.json <<'JSON'
{"order_id":"fn01-revised","quantity":2,"unit_price_cents":375}
JSON
aws lambda invoke --function-name labex-fn01-quote --cli-binary-format raw-in-base64-out --payload file://revised.json revised-response.json
cat revised-response.json
Espere {"order_id":"fn01-revised","total_cents":850}: 750 centavos dos itens mais a taxa de 100 centavos. A primeira resposta permanece 750; atualizar o código não reescreve o histórico.
Os logs de execução são armazenados em /aws/lambda/<function-name>. Recupere mensagens que contenham esse ID de pedido para conectar seu evento à resposta calculada.
aws logs filter-log-events --log-group-name /aws/lambda/labex-fn01-quote --filter-pattern '"fn01-revised"' --query 'events[].message'
Espere a entrada EVENT e o objeto retornado com total 850. Os fluxos completos também contêm início e fim de invocação e relatórios do ambiente de execução, separados da resposta do pedido.
Volte ao AWS View. Compare os três registros reais, abra Show logs para fn01-revised e associe sua entrada ao resultado de 850 centavos. A referência permanece inalterada.

Remova a Função e Preserve os Logs de Referência
Nesta etapa, você excluirá apenas a função e seu grupo de logs de execução e confirmará que a referência não relacionada permanece. A função e o grupo de logs são recursos separados; excluir apenas a função não remove os logs armazenados.
Exclua a função exata e leia um inventário obtido com sucesso.
aws lambda delete-function --function-name labex-fn01-quote
aws lambda list-functions --query 'Functions[].FunctionName'
Espere uma lista vazia. Um erro de autenticação ou conexão não comprovaria a exclusão.
Remova os logs de execução do laboratório e liste os grupos restantes.
aws logs delete-log-group --log-group-name /aws/lambda/labex-fn01-quote
aws logs describe-log-groups --query 'logGroups[].logGroupName'
Somente /labex/labex-fn01-reference deve permanecer. Leia sua mensagem para comprovar que a limpeza preservou dados não relacionados.
aws logs get-log-events --log-group-name /labex/labex-fn01-reference --log-stream-name platform --query 'events[].message'
Espere INFO platform reference keep unchanged. O AWS View não mostra nenhuma função implantada nem logs de invocação, enquanto a referência permanece. A função IAM e a identidade preparadas são recursos fornecidos pelo ambiente; a revogação de credenciais e o encerramento ocorrem após as verificações de recursos.
Resumo
Você escreveu um manipulador Python, implantou um pacote Zip e calculou totais de dois eventos JSON. Você atualizou o cálculo implantado, correlacionou seu novo resultado com os logs de execução e excluiu apenas a função e seu grupo de logs, preservando os dados de referência.



