¿Cómo crear una función Lambda 'delete' con Python en un proyecto serverless?
Crear funciones Lambda para eliminar datos de una base de datos DynamoDB es un paso crucial en el desarrollo de aplicaciones serverless. A lo largo de este proyecto, hemos trabajado en crear, actualizar e insertar registros, pero ahora nos enfocaremos en la eliminación programática de elementos no deseados.
¿Cómo estructurar el handler para la función 'delete'?
Para empezar, necesitamos definir el handler en Python de la función delete. Comenzamos importando las dependencias necesarias: boto3 para interactuar con AWS, json para manejar datos JSON y os para acceder a las variables de entorno del sistema operativo.
¿Cómo manejar parámetros y la lógica de HTTP en Python?
El manejo de los path parameters es esencial. En el handler, podemos acceder a estos parámetros mediante event['pathParameters']. Esto nos permite extraer el userId que deseamos eliminar y proceder con la operación delete.
La operación delete_item en boto3 es bastante directa, necesaria para borrar el ítem correspondiente en DynamoDB. Utilizamos el userId como clave primaria para llevar a cabo esta operación.
¿Cómo configurar el serverless YAML?
Es crucial asegurar que el serverless.yml está configurado de manera adecuada para manejar runtimes diferentes, en este caso, Python 3.8:
Para desplegar la función Lambda, se utiliza sls deploy. A menudo surgen errores, como la referencia incorrecta a un archivo de JavaScript o typos en nombres de tablas. Herramientas como CloudWatch son fundamentales para depurar y obtener logs detallados.
Durante el desarrollo, es común enfrentar errores como 502 bad gateway o errores de configuración en las tablas de DynamoDB. Estas situaciones deben verse como oportunidades de aprendizaje, ya que cada error nos permite mejorar y corregir nuestra implementación.
¿Cómo interactuar con AWS para probar y verificar acciones?
Para probar tus funciones Lambda, herramientas como Postman son ideales para enviar requests HTTP y verificar las respuestas. Ingresar el userId en la URL y observar la respuesta nos ayuda a determinar si la eliminación fue exitosa. Utilizar CloudWatch ayuda a revisar logs cuando algo no va según lo planificado.
Finalmente, seguir aprendiendo a usar herramientas serverless es vital para el desarrollo de aplicaciones modernas en la nube. No dudes en investigar más sobre otros servicios de AWS que pueden complementarse con aplicaciones serverless y seguir integrando estos conocimientos en nuevos proyectos. ¡Ánimo! ¡El aprendizaje nunca se detiene!
Para modo local.
Yo instale conda porque que resulta que me pedia python 3.8 y yo tengo 3.11 asi cree un ambiente virtual para python 3.8 y boto3.
Despues ya en el yml hice referencia al path donde estaba esa ruta.
Me salvaste. Hice ambiente virtual con python 3.11 y no me andaba. No pude descubrir porque. Luego instalé python 3.8 para hacer un ambiente virtual con esa versión y anduvo sin problema.
Creo que pesa 18.76 MB porque la carpeta de node_modules no fue excluida correctamente, en mi caso cada función pesa 91 kB.
En mi caso, dejé la función de DELETE en JavaScript, quedó así:
...constdeleteUser=async(event, context)=>{let id = event.pathParameters.id;let params ={TableName:"usersTable",Key:{id: id },};return dynamodb
.delete(params).promise().then((response)=>{return{statusCode:200,body:JSON.stringify({id: id }),};});};...
Mi GitHub
Excelente que lo notaste!
Alerta de spoiler:
Esto hace parte de las mejores que hacemos al final del curso, en la etapa de Refactor y alistamiento para PRD donde explicamos mas a detalle como hacer un empaquetado para cada lambda 🚀
Al final tenemos empaquetados de menos de 2KB
¡Excelente!
Se puede reducir mas si en el archivo serverless.yml se le agrega
package:patterns:-"!.dynamodb"-"!node_modules"
El resultado que me dio fue que ahora todos pesan 170 hb
Recientemente realice un code challenge para una posicion que aplique y en la cual implemente una funcion lambda con Java, Springboot3. El equipo de AWS confirmo el soporte y tiene una excelente documentacion al respecto, la cual comparto por si alguien ocupa.
¡Perfecto! Vamos a crear una función updateUsers en tu handler que permita actualizar los datos de un usuario en DynamoDB utilizando el método update de DocumentClient.
✅ 1. Estructura básica deupdateUsers
Supongamos que tu body del POST (o PUT) contiene un JSON como este:
update-users:
handler: updateUsers/handler.updateUsers
events:
- http:
path: users/{id}
method: PUT
✅ 3. Exporta la función en tuhandler.js
module.exports = {
getUsers,
updateUsers
};
¿Quieres que te genere también el archivo updateUsers/handler.js por separado, si prefieres tener cada función en su propia carpeta?
¿como seria el delete, pero en java?
Claro, seria algo como esto:
package com.example;import com.amazonaws.services.lambda.runtime.Context;import com.amazonaws.services.lambda.runtime.RequestHandler;import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent;import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent;import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;import com.amazonaws.services.dynamodbv2.document.DeleteItemOutcome;import com.amazonaws.services.dynamodbv2.document.DynamoDB;import com.amazonaws.services.dynamodbv2.document.Item;import com.amazonaws.services.dynamodbv2.document.PrimaryKey;import com.amazonaws.services.dynamodbv2.document.Table;publicclassDeleteObjectLambdaimplementsRequestHandler<APIGatewayProxyRequestEvent,APIGatewayProxyResponseEvent>{privatestatic final StringTABLE_NAME="my-dynamodb-table";private final AmazonDynamoDB ddb =AmazonDynamoDBClientBuilder.defaultClient();private final DynamoDB dynamoDB =newDynamoDB(ddb); @OverridepublicAPIGatewayProxyResponseEventhandleRequest(APIGatewayProxyRequestEvent request,Context context){String objectId = request.getPathParameters().get("objectId");// Assuming the ID is passed as a path parameterTable table = dynamoDB.getTable(TABLE_NAME);PrimaryKey primaryKey =newPrimaryKey("objectId", objectId);try{DeleteItemOutcome outcome = table.deleteItem(primaryKey);returnnewAPIGatewayProxyResponseEvent().withStatusCode(204);// HTTP 204 = No Content}catch(Exception e){returnnewAPIGatewayProxyResponseEvent().withStatusCode(500).withBody("Error deleting object: "+ e.getMessage());}}}
sin embargo, recuerda que java es un lenguaje compilado y por tanto debes compilar tu .java a un binario antes de subirlo como handler
Si tienen el error:
Error:
Cannot read file node_modules\@smithy\config-resolver\dist-types\ts3.4\regionInfo\getRegionInfo.d.ts due to: EMFILE:
aquí te enseñas a solucionarlo:
Al intentar implementar esto mismo con el AWS SDK v3 ES6 encuentro que requiere se suba el node_modules para acceder a la librería @aws-sdk/client-dynamodb .
Hola Juan, esto sucede si usas Node 14 o 16 si no me equivoco. Actualiza a Node 18+ y no necesitas empaquetar node_modules.