Alejandro Chavez
En mi caso agregué un sencillo archivo JSON como seed a la Local DynamoDB (aquí la documantación) para trabajar todo en mi PC (por ahora). Mi configuración está acá:
- GitHub
Desplegar una función Lambda que consulta DynamoDB en AWS exige ajustar variables de ambiente, parámetros dinámicos en la URL y permisos IAM. Si vienes de probar tu GET en local con Serverless Framework, hay tres detalles que debes resolver antes de subir tu aplicación a la nube para que funcione sin errores.
Por qué fallan las variables de ambiente entre local y la nube
Cuando tu cliente de DynamoDB tiene parámetros quemados apuntando a localhost, la Lambda en producción intentará conectarse a tu computadora y romperá la ejecución. La solución es condicionar esos parámetros según el entorno.
Serverless Framework inyecta automáticamente la variable IS_OFFLINE cuando trabajas en local. Esa variable vive en process.env.IS_OFFLINE y será true en tu máquina o undefined en la nube. Aprovechándola, puedes definir un objeto dynamoDbClientParams vacío por defecto y solo asignarle los valores locales cuando detectes el entorno offline [03:30].
¿Qué hace IS_OFFLINE en Serverless Framework? Es una variable de ambiente que el framework inyecta solo cuando ejecutas la función en tu máquina. Te permite diferenciar lógicamente entre local y producción sin cambiar código manualmente.
Cuando el objeto llega vacío al cliente, este apunta por defecto a la base de datos en la nube. Así evitas duplicar configuraciones.
Cómo capturar el ID desde la URL con path parameters
Un GET real necesita recibir el identificador del recurso desde la ruta, no tener un 1 quemado en el código. Aquí entra en juego el objeto event, que contiene toda la información del trigger que disparó la Lambda.
Si el trigger es HTTP, event trae el request completo. Si fuera una cola SQS, traería los mensajes. Para extraer un parámetro de ruta usas event.pathParameters.id y lo guardas en una variable userId [05:45].
En el archivo serverless.yml, dentro del evento HTTP, debes declarar el parámetro abriendo llaves en el path:
yaml http: method: get path: users/{id}
Con esto, el endpoint responderá a cualquier string que venga después de /users/.
Por qué aparece el error access denied al consultar DynamoDB
Después de desplegar con sls deploy, es muy probable que tu primera petición devuelva un error. La forma correcta de diagnosticarlo es ir a CloudWatch, el servicio de AWS que centraliza los logs de cómputo. Lambda inyecta sus logs allí por defecto, agrupados en log groups y log streams.
Al revisar el detalle, verás un mensaje tipo access denied: el rol que asume la Lambda no tiene autorización para hacer queries a DynamoDB. Serverless Framework crea por defecto un rol con permisos mínimos, así que tú debes ampliarlos [09:15].
¿Qué es un rol en AWS? Es un conjunto de permisos asignado a una entidad, como una Lambda. Define qué servicios y acciones puede ejecutar esa entidad dentro de tu cuenta de AWS.
Cómo agregar permisos IAM desde serverless.yml
IAM es el servicio de AWS que gestiona permisos y roles. Dentro de serverless.yml puedes declarar un bloque iam con un role y dentro de él, una lista de statements. Cada statement lleva tres claves:
Effect: usa Allow para conceder el permiso.Action: define qué se permite, por ejemplo dynamodb:* para todas las acciones.Resource: limita el permiso a un recurso específico mediante su ARN.Usar dynamodb:* sin restringir el recurso sería demasiado holgado. Una Lambda con ese permiso podría borrar otras tablas. Por eso, copia el ARN exacto de tu tabla desde la consola de DynamoDB, en la sección de información adicional, y pégalo en Resource.
Cómo verificar que el GET funciona en producción
Tras un nuevo serverless deploy, la actualización del rol queda activa. Si consultas la URL con un ID que no existe, recibirás una lista vacía sin errores, lo cual confirma que la conexión funciona.
Para probar de verdad, agrega manualmente un elemento en la consola de DynamoDB con un atributo id igual a 1 y otro atributo como name. Ejecuta un scan desde la consola para confirmar que el registro existe y luego vuelve a tu endpoint:
1.1.¿Qué es un scan en DynamoDB? Es una operación que recorre todos los elementos de una tabla y los devuelve. Sirve para inspeccionar el contenido completo, aunque no es la forma más eficiente para consultas en producción.
Un detalle para mejorar: actualmente la función devuelve una lista, pero como el id es único, tiene más sentido retornar un solo objeto de usuario. Refactorizar esa lógica es un buen ejercicio antes de avanzar al método POST para crear usuarios desde la API. ¿Te animas a hacer ese refactor y compartir tu solución en los comentarios?
Evita el hardcode del ARN de esta manera
iam: role: statements: - Effect: Allow Action: "dynamodb:*" Resource: { "Fn::GetAtt": ["usersTable", "Arn"] } ``` 
Alejandro Chavez
En mi caso agregué un sencillo archivo JSON como seed a la Local DynamoDB (aquí la documantación) para trabajar todo en mi PC (por ahora). Mi configuración está acá:
Enrique Alexis Lopez Araujo
Para poder hacer el reto que nos pide el profesor, solamente tenemos que modificar el return, quedando de la siguiente manera, y eliminando la metadata:
return { statusCode: 200, body: JSON.stringify(res.Items), };
Como quedaria completo el ejercicio:
Enrique Alexis Lopez Araujo
Para poder hacer el reto que nos pide el profesor, solamente tenemos que modificar el return, quedando de la siguiente manera, y eliminando la metadata:
return { statusCode: 200, body: JSON.stringify(res.Items), };
Mario Alexander Vargas Celis
¡Vamos a desplegar y testear tu endpoint GET en Serverless Framework usando AWS! 🔥
🚀 Despliegue del proyecto en AWS
✅ Paso 1: Configura tus credenciales de AWS
Si no lo hiciste antes, ejecuta:
aws configure
Ingresa:
AWS Access Key IDAWS Secret Access Keyus-east-1, por ejemplo)json (o deja en blanco)💡 Estas credenciales deben tener permisos para Lambda, API Gateway y CloudFormation.
✅ Paso 2: Verifica que tu serverless.yml esté listo
Ejemplo mínimo para función GET:
service: hola-mundo
provider: name: aws runtime: nodejs18.x region: us-east-1 stage: dev
functions: hello-world: handler: handler.hello events: - http: path: hello method: get
plugins: - serverless-offline
✅ Paso 3: Desplegar la función
npx serverless deploy
Esto:
Al final verás algo como:
endpoints: GET -
🧪 Testing del método GET
✅ Prueba con curl:
curl
✅ O prueba con Postman:
GET✅ O desde el navegador:
💬 ¿Qué deberías recibir?
Ejemplo de respuesta:
{ "message": "Hola mundo - bienvenidos al curso de serverless framework en AWS" }
🛠️ ¿Cómo ver logs si algo falla?
npx serverless logs -f hello-world
Para ver en tiempo real:
npx serverless logs -f hello-world -t
¿Quieres que agreguemos también una función POST o conectemos este GET con DynamoDB para leer datos?
analitica gc
Ya es la segunda vez que me pasa y es que no entiendo por que al profesor le aparece en la consola de AWS la información de lo que se a desplegado, pues lo que en mi caso es, que no veo nada, ni en cloudFormation, ni cloudWatch, ni Lambda, ni apiGetway; es decir en ninguna parte de mi consola de aws. Alguien podria decirme que puede estar sucediendo?
Víctor Rolack
Estás en la región correcta? Procura escoger en la consola aws la región en la que estás trabajando, de lo contrario, no te aparecerá nada
Cristian Archila Atehortua
Hola alguien me puede proporcionar documentación del tema de event para los diferentes tipos de parámetros cuando uno usa python
Brayan Jesus Garavito Uriza
Tengo el siguiente error:
CREATE_FAILED: S3Bucket (AWS::S3::Bucket)
Resource handler returned message: "Bucket cannot have ACLs set with ObjectOwnership's BucketOwnerEnforced setting (Service: S3, Status Code: 400, Request ID: HMMWWRY9TCJ371Q2, Extended Request ID: IJDSNJRtEwxhWp8+mePQb6aV9oH8FuGbUuWdZZAZvibhiP6pLp28DWxLsNnf7pQUtKs4qzpDc5TR1db2uo6SyDNLgEEOM+l59KrNF5n8msI=)" (RequestToken: 8bd3c680-fd8b-a0e1-a432-52f9de3b646c, HandlerErrorCode: GeneralServiceException)
Rubén Augusto Duarte Ortiz
Para los errores
2024-08-07T18:47:09.255Z undefined ERROR Uncaught Exception { "errorType": "Runtime.ImportModuleError", "errorMessage": "Error: Cannot find module 'aws-sdk'\nRequire stack:\n- /var/task/handler.js\n- /var/runtime/index.mjs", "stack": [ "Runtime.ImportModuleError: Error: Cannot find module 'aws-sdk'", "Require stack:", "- /var/task/handler.js", "- /var/runtime/index.mjs", " at _loadUserApp (file:///var/runtime/index.mjs:1087:17)", " at async UserFunction.js.module.exports.load (file:///var/runtime/index.mjs:1119:21)", " at async start (file:///var/runtime/index.mjs:1282:23)", " at async file:///var/runtime/index.mjs:1288:1" ] } ```2024-08-07T18:47:09.255Z undefined **ERROR** Uncaught **Exception** {   "errorType": "Runtime.ImportModuleError",   "errorMessage": "**Error**: Cannot find module 'aws-sdk'\nRequire stack:\n- /var/task/handler.js\n- /var/runtime/index.mjs",   "stack": \[   "Runtime.ImportModuleError: **Error**: Cannot find module 'aws-sdk'",   "Require stack:",   "- /var/task/handler.js",   "- /var/runtime/index.mjs",   " at \_loadUserApp (file:///var/runtime/index.mjs:1087:17)",   " at async UserFunction.js.module.exports.load (file:///var/runtime/index.mjs:1119:21)",   " at async start (file:///var/runtime/index.mjs:1282:23)",   " at async file:///var/runtime/index.mjs:1288:1"   ] } Se actualizo en el yml ```js provider: name: aws runtime: nodejs16.x # Actualiza esta línea a la versión soportada ```provider: name: aws runtime: nodejs16.x # Actualiza esta línea a la versión soportada
Juan Camilo Salazar Serna
Si les sale el error : CREATE_FAILED: CustomApiGatewayAccountCloudWatchRole
pareciese que anteriormente este recurso lo creaba serverless manualmente pero ya no.
Solo deben ir a iam y crear el rol con el nombre: serverlessApiGatewayCloudWatchRole
configurarlo de esta manera:
y presionar crear.
luego intente hacer el deploy nuevamente.
Anthony Jesús Espitia Parra
también podemos manejar el tema del despliegue en dev con alguna variable como is offline?
IVAN MAURICIO ROSERO CHAMORRO
Logré hacer el deployment, pero en la url sigo con el mismo Internal server error, y en el Clowdatch con el mismo error de AccessDeniedException. A pesar de que en el .yml actualizo el resource
Yor Jaggy Castaño Pino
ProfesorHola Ivan, nos podrias compartir por aca mas detalles para poder ayudarte, solo con el error a veces es complicado :pray:
IVAN MAURICIO ROSERO CHAMORRO
Así tengo el error en cloudwatch
Estos son los permisos que tengo en IAM
Así tengo mi serverless.yml con el iam insertado
service: crud-serverless-users-imrch provider: name: aws runtime: nodejs14.x iam: role: statements: - Effect: Allow Action: 'dynamodb:*' Resource: arn:aws:dynamodb:us-east-1:353628474529:table/usersTable plugins: - serverless-offline - serverless-dynamodb-local custom: dynamodb: # If you only want to use DynamoDB Local in some stages, declare them here stages: - dev start: port: 8000 inMemory: true migrate: true # Uncomment only if you already have a DynamoDB running locally # noStart: true functions: get-users: handler: handler.getUsers events: - http: path: users/{id} method: GET resources: Resources: usersTable: Type: AWS::DynamoDB::Table Properties: TableName: usersTable AttributeDefinitions: - AttributeName: pk AttributeType: S KeySchema: - AttributeName: pk KeyType: HASH ProvisionedThroughput: ReadCapacityUnits: 1 WriteCapacityUnits: 1```