Disponibilizar un servicio API Rest en modalidad serverless
⚠️ Importante que estas pruebas las hagas en tu cuenta personal o una cuenta que sea para hacer test no en la cuenta de AWS del ambiente que usas habitualmente para algún proyecto. ⚠️
Problema
Necesitamos una pinche API Rest fácil y barata
Que vamos a usar
- Lambda: Para crear una función (con node) que tendrá nuestra "lógica" de lo que necesitamos hacer.
- Apigateway: Para disponibilizar nuestra lambda al mundo como un recurso Rest.
- Postman: para probar la API (cualquier otro nos vendrá bien igual).
Requisitos
- AWS Lambda
- AWS API Gateway
Caso de uso
Disponibilizar una URL https://subdominio.dominio.com/pagos
que reciba un POST
con un payload en formato JSON, procese esos dato y responda al cliente con un estado "success" (200)
, "fail" (400 o 500)
para entregar feedback del resultado de la operación.
Paso 1: Backend (aws lambda)
- Abrir tu consola web de tu cuenta de aws
- Acceder el servicio de AWS Lambda
- Presionar el botón "Create function"
- Seleccionar la opción "Author from scratch"
-
En la sección "Basic information" debemos completar
- Function Name: Pondremos "pagos"
- Runtime: Seleccionaremos Node.js 18.x
- Architecture: x86_64
- Presionamos en Create function
El proceso de creación tardara unos segundos y nos llevara a un editor de código online donde tendremos el siguiente archivo pre cargado en nuestra lambda function:
export const handler = async(event) => {
// TODO implement
const response = {
statusCode: 200,
body: JSON.stringify('Hello from Lambda!'),
};
return response;
};
el servicio AWS Lambda tiene como paradigma principal tener una función principal que es ejecutada con cada nueva llamada a la función, en este caso nuestra función principal se llama handler y recibe un único argumento llamado event. Para el caso puntual de esta implementación que es API Gateway <---> Lambda, el event representa el payload que la función recibirá desde API Gateway.
Comprendido lo anterior, y ya con el payload en nuestra función, es en la linea 2 donde nosotros podemos escribir nuestro código para hacer todas las operaciones y tareas que necesitemos, y finalmente podemos hacer un return que representa la respuesta que le enviaremos a quien invoco a nuestra lambda, en nuestro caso API Gateway, dando por finalizada la ejecución.
De forma predeterminada la respuesta (response) viene con un statusCode y un body pero podemos modificar esta estructura dependiendo de con quien se este comunicando nuestra lambda, para este ejemplo mantendremos la estructura del response.
Especial atención en el body, que sera el contenido que el cliente que haga una llamada a esta función obtendrá como respuesta, en este caso es un "hello from lambda!"
Paso 2: API Rest (AWS API Gateway)
- Abrir tu consola web de tu cuenta de aws
- Acceder el servicio de API Gateway
- Seleccionar REST API presionando el botón BUILD
-
En la siguiente ventana debes seleccionar:
- Choose the protocol: REST
- Create new API : New API
- API Name: demo.tudominio.com (puedes poner lo que sea, pero es mas ordenado asociarlos desde un inicio a la URL que se usara al final)
- Description: Lo que quieras
- Endpoint Type: Regional
- Presionar el botón Create API
Lo anterior nos llevara a la pagina de nuestra nueva API Rest, que ya tiene las configuraciones "mínimas" ahora toca habilitar el primer endpoint, vamos a ello.
- En el menu lateral izquierdo debes seleccionar Resources
- Luego presionar en el botón desplegable que dice Actions selecciona create resource
-
Se abrirá la ventana New Child Resource
- Resource Name: pagos (por convención es un sustantivo en plural)
- Resource Path: pagos (casi siempre se usa lo mismo que en el name)
- Enable API Gateway CORS: Lo marcaremos para habilitar CORS para este recurso.
- Presionamos el botón Create Resource
Ya tenemos nuestro primer recurso creado, ahora ya podemos definir nuestro primer método para ese recurso.
- Presionamos en /pagos, y nos mostrara en la ventana el titulo /pagos Methods
- Volvemos a presionar en el botón desplegable que dice Actions selecciona create method
- Aparecerá un menu desplegable en blanco, como nodo hijo del recurso /pagos seleccionaremos POST y pinchamos el botón circular de Check
-
Esto hará aparecer un nodo hijo POST del recurso /pagos y nos lleva a la /pagos - POST - Setup
- Integration type: Lambda Function
- Use Lambda Proxy integration: Seleccionar
- Lambda Region: Debes seleccionar la region donde esta tu lambda
- Lambda Function: Seleccionamos nuestra función que creamos en el paso 1
- Use Default Timeout: Se mantiene seleccionado
- Presionamos SAVE
- Te preguntara si quieres darle permisos a API Gateway para acceder a tu función lambda, debemos decirle que si.
Con el paso anterior ya tenemos conectada nuestra API Gateway con nuestra función lambda, ahora vamos a probarla.
-
Test desde consola lambda
- Selecciona el método POST que acabas de crear.
- Presiona el icono de un rayo que dice TEST
- Scroll hasta el final y sin tocar nada mas, presiona el botón azul que dice TEST esto hará que se simule una petición a la función lambda y obtener como resultado Status: 200 y Response Body: "Hello from Lambda!"
-
Ahora que ya sabemos que API Gateway esta llamando a nuestra función lambda, debemos "desplegarla" para que el endpoint quede habilitado.
- Volvemos a presionar en el botón desplegable que dice Actions selecciona Deploy API
- Deployment stage: [New Stage]
- Stage Name: le pondremos "dev" para usarla en nuestro ambiente de desarrollo
- Deployment description: aquí idealmente poner una breve descripción del cambio que estamos pasando al ambiente, le pondremos "Enable /pagos POST"
- Presionamos el botón DEPLOY
- Esto desplegara nuestra api en un ambiente, al cual hemos llamado "dev" y nos proporciona la URL Base
Invoke URL: https://xxxxxxxxxx.execute-api.us-east-2.amazonaws.com/dev
-
Abrir postman o nuestro cartero favorito y bastara con:
- Pegar la URL de la api mas la ruta del recurso, quedando algo así
https://xxxxxxxxxx.execute-api.us-east-2.amazonaws.com/dev/pagos
- Seleccionar el método
POST
- Enviar la petición y verificar que en el retorno obtenemos nuestro
"Hello from Lambda!"
- Pegar la URL de la api mas la ruta del recurso, quedando algo así
Y con eso ya tienes montada tu API Rest y podrás pedirle ese tan ansiado aumento salarial a tu TL :)
Comentarios finales
Este es un ejemplo que tiene por objetivo explicar de forma general el flujo y la forma en que podemos implementar una API en modalidad serverless con los servicios de AWS API Gateway y Amazon Lambda y hemos sobre simplificado el proceso y omitido intencionalmente muchos detalles para facilitar este primer acercamiento a la implementación.
Se recomienda revisar en detalle los siguientes puntos antes de implementar este modelo en un ambiente productivo de un cliente:
AWS Lambda
- Al crear la función lambda, usamos un ROL de IAM que crea aws al momento de crear cada lambda, este ROL es lo que define los permisos que tendrá la función, por ejemplo si podrá acceder a s3 o a dynamo, se recomienda crear manualmente estos roles en IAM según sea requerido para cada implementación. más info aquí
- Ambientes: AWS lambda te permite tener varios ambientes para cada una de tus funciones, así puede tener un stage de desarrollo y un stage productivo lo que facilitara tus pruebas previo a los pasos a producción, esto se logra con el uso de versiones y alias.
- CI/CD: En el ejemplo utilizamos el editor online que nos provee la consola web de amazon, para pruebas de concepto esto funciona bien, pero para un flujo real de un equipo se recomienda implementar CI/CD directamente desde un repositorio de GIT, donde el código fuente se envía a un repositorio y automáticamente usando AWS Code Build llevar ese código fuente a la lambda de forma transparente y automatizada.
- Omitimos configuraciones mas especificas como Memoria y Storage, pero para mas detalles puedes consultar la docu oficial
API Gateway
- Tipos de endpoints, tu API puede ser regional,optimizados para borde o privados según cada caso de uso, con algunos de ellos conseguirás latencias mas bajas, y costos diferentes también, para mas detalles, mira la docu aqui.
- CORS es una característica de seguridad que siempre debes considerar y configurar de manera correcta, más detalles acá.
- API Key, planes de uso y tasas de peticiones nos permiten controlar cantidad de peticiones bajo ciertas reglas, para mas detalles, consulta el apartado de la docu aqui
- Token de autorización: en muchos casos de uso las APIs públicas sólo deben ser accesibles si el usuario está autenticado en el sistema y cuenta con un token válido, API Gateway permite definir que todas las peticiones hechas pasen por una validador antes de llegar a nuestra lambda principal, mas detalles aquí.
- Ambientes: en muchos casos vas a requerir que tu API tenga varios ambientes para poder hacer pruebas sin impactar producción y esto lo puedes conseguir generando diferentes ambientes para la misma API, revisa los detalles aquí.