Ejecutar una función Lambda con un evento JSON

AWSBeginner
Practicar Ahora

Introducción

Un equipo de pagos necesita una función que calcule el total de un pedido. Desplegarás un breve controlador Python, enviarás dos entradas JSON y actualizarás el cálculo con una tarifa de gestión. Usa céntimos enteros para mantener sencilla la aritmética y después elimina tu función y sus registros.

Completa primero Empezar con AWS en LabEx, Usar credenciales temporales con un rol de IAM y Encontrar una solicitud fallida en CloudWatch Logs. Este entorno nuevo suministra la CLI, el espacio de trabajo y el rol de ejecución.

Relación con las certificaciones

Este laboratorio ofrece práctica para los siguientes temas de examen.

Desplegar un cálculo de pedidos

En este paso, sustituirás un controlador sin terminar y desplegarás una función. AWS Lambda ejecuta tu código cuando invocas una función. Un evento es la entrada proporcionada para esa invocación; un controlador, o handler, es la función Python que Lambda llama con ella. La configuración app.handler significa la función llamada handler de app.py.

Ve al espacio de trabajo preparado e inspecciona el código base. Actualmente devuelve un objeto vacío, por lo que no puede calcular un pedido.

cd /home/labex/project
cat app.py

Python utiliza la sangría para agrupar instrucciones dentro de una función. event["quantity"] lee un valor del objeto JSON entrante. * multiplica la cantidad por el precio unitario; return envía el objeto calculado al llamante. context proporciona información sobre la invocación, aunque este cálculo todavía no la necesita.

Sustituye el código base por este controlador completo. cat > app.py escribe en el archivo las líneas comprendidas entre <<'PY' y el PY final. La línea final debe estar sola.

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

La instrucción print escribe la entrada en los registros de ejecución; no devuelve la respuesta. Mantén los secretos de clientes fuera de los registros. Estos eventos contienen únicamente identificadores sintéticos y números.

Crea un paquete Zip, el archivo comprimido que Lambda despliega. Coloca app.py en su nivel superior para que se pueda encontrar el controlador. El rol de ejecución es la identidad que Lambda utiliza mientras ejecuta tu código. Este rol preparado permite registrar eventos; configurarás el acceso a datos en un laboratorio posterior. Lee su ARN en una variable del shell. Un ARN identifica un recurso específico; la variable evita copiarlo a mano.

zip -q function.zip app.py
ROLE_ARN=$(aws iam get-role --role-name labex-fn01-execution --query 'Role.Arn' --output text)

Despliega con el entorno de ejecución Python 3.12 y un tiempo de espera de cinco segundos. fileb:// lee el archivo comprimido como bytes. El entorno de ejecución elige el entorno del lenguaje; el tiempo de espera limita la duración de una invocación.

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}'

Espera Name labex-fn01-quote, Runtime python3.12, Handler app.handler, Timeout 5 y un CodeSize positivo. Crear la función despliega código; no invoca el controlador.

AWS View muestra la función, el controlador y la huella del código. Los registros de invocación siguen vacíos. El grupo de registros de referencia contiene datos de la plataforma ajenos al laboratorio y debe permanecer sin cambios.

Invocar dos eventos JSON

En este paso, llamarás a la función desplegada con dos pedidos distintos e interpretarás sus respuestas. JSON representa un objeto con campos con nombre. Los números no tienen comillas; las cadenas sí. Cada invocación recibe su propio evento.

El despliegue almacena tu paquete de código; una invocación proporciona un evento y ejecuta su controlador.

Escribe el primer evento: dos artículos a 375 céntimos cada uno.

cat > small.json <<'JSON'
{"order_id":"fn01-small","quantity":2,"unit_price_cents":375}
JSON

Invoca la función y guarda su respuesta. --cli-binary-format raw-in-base64-out permite que la CLI acepte JSON ordinario como carga útil. file:// lee el texto del evento; el nombre de archivo final recibe la carga útil devuelta.

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

El comando indica StatusCode 200. El archivo de respuesta debe contener {"order_id":"fn01-small","total_cents":750}. El estado de la solicitud al servicio y los datos devueltos por el controlador son evidencias distintas; inspecciona también la carga útil.

Envía un segundo pedido sin volver a desplegar código. Cinco artículos a 120 céntimos deben producir un total distinto.

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

Espera {"order_id":"fn01-large","total_cents":600}. Los valores de entrada determinan el cálculo de la misma función.

En AWS View, compara los ID de pedido, las cantidades, los precios y los totales. La configuración de la función permanece igual mientras cambian los registros de invocación. Abre Show logs para cualquiera de los pedidos y observa su entrada y resultado devuelto.

Actualizar el código y rastrear su resultado

En este paso, añadirás una tarifa de gestión de 100 céntimos y confirmarás que una nueva invocación ejecuta el cálculo actualizado. Editar el archivo local app.py no cambia el código desplegado; actualiza el paquete y envíalo a Lambda.

Sustituye el controlador por esta revisión. Solo cambia el cálculo: + 100 añade la tarifa después de la multiplicación.

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}'

El despliegue devuelve el nombre y una huella SHA del código. AWS View muestra la huella modificada; los resultados de invocaciones anteriores permanecen en los registros.

Para comparar con la Console, el ejemplo oficial muestra el archivo Python junto a los controles Deploy y Test. Su lambda_function.py y lambda_handler corresponden a app.py y handler de este laboratorio; continúa aquí con el flujo de trabajo de Terminal.

Ejemplo oficial de Lambda Console con un archivo Python y controles de despliegue.

Fuente: Guía de AWS Lambda.

Usa las cantidades del primer pedido con un nuevo ID de correlación.

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

Espera {"order_id":"fn01-revised","total_cents":850}: 750 céntimos por los artículos más la tarifa de 100 céntimos. La primera respuesta sigue siendo 750; actualizar el código no reescribe el historial.

Los registros de ejecución se almacenan en /aws/lambda/<function-name>. Recupera los mensajes que contienen este ID de pedido para relacionar su evento con la respuesta calculada.

aws logs filter-log-events --log-group-name /aws/lambda/labex-fn01-quote --filter-pattern '"fn01-revised"' --query 'events[].message'

Espera la entrada EVENT y el objeto devuelto con total 850. Los flujos completos también contienen el inicio y el final de la invocación e informes del entorno de ejecución, separados de la respuesta del pedido.

Vuelve a AWS View. Compara los tres registros reales, abre Show logs para fn01-revised y relaciona su entrada con el resultado de 850 céntimos. La referencia permanece sin cambios.

La revisión desplegada devuelve 850 céntimos mientras los totales calculados anteriores y los registros de referencia permanecen sin cambios.

Eliminar la función y conservar los registros de referencia

En este paso, eliminarás únicamente la función y su grupo de registros de ejecución y después confirmarás que la referencia ajena al laboratorio permanece. La función y el grupo de registros son recursos separados; eliminar solo la función no elimina los registros almacenados.

Elimina la función exacta y después lee un inventario obtenido correctamente.

aws lambda delete-function --function-name labex-fn01-quote
aws lambda list-functions --query 'Functions[].FunctionName'

Espera una lista vacía. Un error de autenticación o conexión no demostraría la eliminación.

Elimina los registros de ejecución del laboratorio y enumera los grupos restantes.

aws logs delete-log-group --log-group-name /aws/lambda/labex-fn01-quote
aws logs describe-log-groups --query 'logGroups[].logGroupName'

Solo debe permanecer /labex/labex-fn01-reference. Lee su mensaje para demostrar que la limpieza conservó los datos ajenos al laboratorio.

aws logs get-log-events --log-group-name /labex/labex-fn01-reference --log-stream-name platform --query 'events[].message'

Espera INFO platform reference keep unchanged. AWS View no muestra ninguna función desplegada ni registros de invocación, mientras la referencia permanece. El rol y la identidad preparados son componentes del entorno; la revocación de credenciales y el apagado se realizan después de las comprobaciones de recursos.

Resumen

Escribiste un controlador Python, desplegaste un paquete Zip y calculaste totales a partir de dos eventos JSON. Actualizaste el cálculo desplegado, relacionaste su nuevo resultado con los registros de ejecución y eliminaste únicamente la función y su grupo de registros conservando los datos de referencia.