Execute uma Função Lambda com um Evento JSON

AWSBeginner
Pratique Agora

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.

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.

A implantação armazena seu pacote de código; uma invocação fornece um evento e executa seu manipulador.

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.

Exemplo oficial do Lambda Console com um arquivo Python e controles de implantação.

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.

A revisão implantada retorna 850 centavos, enquanto os totais calculados anteriormente e os logs de referência permanecem inalterados.

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.