¿Cómo podemos manejar el ambiente al desplegar a la nube?
¡Desplegar aplicaciones a la nube puede ser un desafío! Aunque ya probamos nuestra aplicación GET y parece lista para ir a la nube, hay diferencias sutiles entre el entorno local y la nube que deben ser consideradas. Estos detalles son esenciales para evitar errores y asegurar un desarrollo uniforme entre ambientes.
Uso de variables de entorno
Las variables de entorno son claves cuando trabajamos en múltiples ambientes. En la aplicación local, nuestro cliente de DynamoDB se conecta a una base de datos local, sin embargo, para el despliegue en la nube, eso podría ocasionar un error al intentar llegar al localhost.
La solución es usar process.env para determinar si estamos trabajando en local o en la nube. Si la variable IS_OFFLINE está definida, estamos en local; de lo contrario, en la nube. Así:
let dynamoDBClientParams ={};if(process.env.IS_OFFLINE){ dynamoDBClientParams ={// Parámetros locales aquí};}
Ajuste del endpoint de la función Lambda
Al desplegar en la nube, un problema frecuente es que la Lambda intenta conectarse a un recurso que no está disponible. Por defecto, cuando no se especifica un endpoint, esta se conecta a la base de datos adecuada en la nube, resolviendo el problema automáticamente.
¿Cómo manejar IDs dinámicos en las solicitudes?
El manejo de IDs fijos no es factible. Por lo tanto, necesitamos extraer dinámicamente los IDs de la URL. Esto se logra mediante el uso del objeto event que proporciona información sobre el evento HTTP que desencadena la función Lambda.
const userId = event.pathParameters.id;
Configuración del path parameter en Serverless
En el archivo serverless.yml, debemos indicar que esperamos un parámetro en la ruta. Esto se configura simplemente así:
functions:getUser:handler: handler.getUser
events:-http:path: users/{id}method: get
¿Cómo podemos resolver errores comunes?
Es común encontrar errores al desplegar en la nube, como el de "Access Denied". Esto suele ser causado por permisos insuficientes del rol de AWS asociado. AWS presta especial atención a la seguridad, por lo que debemos otorgar permisos explícitamente.
Solucionar errores de permisos con IAM
A través de IAM, se deben conceder permisos específicos a las funciones Lambda, especialmente cuando interactúan con servicios como DynamoDB. Configuramos estos permisos editando el archivo serverless.yml.
Con esto, permitimos todas las acciones de DynamoDB, pero limitadas a una tabla específica.
¿Qué estrategia podemos seguir para verificar y corregir errores?
Al detectar errores, CloudWatch en AWS es una herramienta esencial. Lambda inyecta automáticamente sus logs en CloudWatch, lo que nos permite revisar las causas de cualquiera de los errores que surjan.
Usar CloudWatch para depuración
Para verificar logs en CloudWatch:
Navega a la consola de CloudWatch.
Dirígete a Log Groups y selecciona el grupo de logs de la Lambda.
Examina los logs para determinar la causa de cualquier error.
¿Cómo mejorar la lógica para obtener datos específicos?
Actualmente, obtenemos una lista de usuarios coincidiendo con un ID, aunque solo el ID es único. Propongo realizar una mejora para regresar únicamente la información del usuario en lugar de una lista.
Tarea práctica
Te invito a intentar refactorizar la lógica de nuestra aplicación para que regrese solo la información específica de un usuario. Esto ayudará a optimizar la consulta y asegurar que nuestra aplicación sea más precisa.
La mejora y personalización de nuestras aplicaciones no solo resuelven problemas inmediatos, sino que también preparan el terreno para un desarrollo más robusto a largo plazo. ¡Sigue experimentando y ajustando!
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
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:
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:
Crea los recursos en AWS (Lambda, API Gateway, roles IAM, etc.)
Te da la URL pública del endpoint
Al final verás algo como:
endpoints:
GET -
🧪 Testing del método GET
✅ Prueba con curl:
curl
✅ O prueba con Postman:
Método: GET
URL:
✅ O desde el navegador:
Abre la URL directamente y verás la respuesta JSON
💬 ¿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?
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?
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
Hola alguien me puede proporcionar documentación del tema de event para los diferentes tipos de parámetros cuando uno usa python
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)
Para los errores
2024-08-07T18:47:09.255Z undefinedERRORUncaughtException{"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
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.
también podemos manejar el tema del despliegue en dev con alguna variable como is offline?
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
Hola Ivan, nos podrias compartir por aca mas detalles para poder ayudarte, solo con el error a veces es complicado :pray:
Tienes enlace al repo con el codigo en github?
Alguna captura de pantalla de la traza del error completo en cloudwatch?
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.xiam:role:statements:-Effect:AllowAction:'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 DynamoDBLocalin some stages, declare them here
stages:- dev
start:port:8000inMemory:truemigrate:true # Uncomment only if you already have a DynamoDB running locally
# noStart:truefunctions: get-users:handler: handler.getUsersevents:- http:path: users/{id}method:GETresources:Resources:usersTable:Type:AWS::DynamoDB::TableProperties:TableName: usersTable
AttributeDefinitions:-AttributeName: pk
AttributeType:SKeySchema:-AttributeName: pk
KeyType:HASHProvisionedThroughput:ReadCapacityUnits:1WriteCapacityUnits:1```