# API RESTful Serverless en Lambda y MySQL

Vamos a implementar un API RESTful en Serverless, en otras palabras sin utilización de servidores, como los conocemos. Existen muchos proveedores que ofrecen servicios, sin servidor, pero vamos a quedarnos con Amazon Web Services.

Si no conocen el termino Serverless es buen momento para empezar a investigarlo y empaparnos de su uso.

## Arquitectura

Aca un bosquejo de la arquitectura, que utilizaremos, donde tenemos las diferentes funciones **Lambdas** que eran invocadas desde nuestro **API Gateway**.

![](https://blog.santiagoagustinfernandez.com/wp-content/uploads/2019/04/Celebrate-diversity-_-05.21.20.png align="center")

API Gateway invocan a las Funciones Lambda, que se conectan contra la Base de Datos RDS MySQL.

Vamos a usar **Serverless Framework** que nos dará la posibilidad de manejar, localmente, nuestro código para probarlo y a su vez hacer el deploy, de nuestro código, con la configuración del entorno. Automáticamente, tendremos, parametrizada nuestras rutas en el **API Gateway**.

|  | **EndPoint** | **Método** | **Descripción** |
| --- | --- | --- | --- |
| 1 | /usuario | GET | Lista todos los usuarios de la tabla |
| 2 | /usuario/{id} | GET | Lista el usuario, especifico. |
| 3 | /usuario | POST | Crea un nuevo usuario en la tabla |
| 4 | /usuario/{id} | PUT | Modifica un usuario existente |
| 5 | /usuario/{id} | DELETE | Elimina un usuario |

Para esta PoC sera necesario tener instaladas las siguientes herramientas y framework’s.

## Recursos

* Node.js 8.10.
    
* MySQL, Instancia RDS en AWS.
    
* Editor de Código.
    
* Postman.
    

Para crear la Base de Datos, en AWS RDS, podemos revisar este [articulo](https://aws.amazon.com/es/getting-started/tutorials/create-mysql-db/) donde se crea una instancia. Es importante que tengamos su FQDN, Nombre de Instancia, Usuarios y Password.

Vamos a crear la Base de Datos, donde trabajaremos, en **MySQL**, luego de conectarnos.

```sql
CREATE TABLE `usuarios` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(100) DEFAULT NULL,
  `email` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;
```

## Serverless Framework

Vamos a instalar **Node.js** en nuestro equipo, puede variar segun nuestro sistema operativo y serverless.

Llegó el momento de agregar nuestras credenciales de AWS. Acá les dejo un [documento](https://docs.aws.amazon.com/es_es/IAM/latest/UserGuide/id_users_create.html), para crear un perfil IAM. En mi caso, cada perfil tiene sus credenciales. En mi caso *~/.aws/credentials*

![](https://blog.santiagoagustinfernandez.com/wp-content/uploads/2019/04/carbon-5.png align="center")

Creamos una carpeta y los archivos necesarios de Node.js y Serverless para comenzar!

![](https://blog.santiagoagustinfernandez.com/wp-content/uploads/2019/04/carbon-3.png align="center")

![](https://i1.wp.com/blog.santiagoagustinfernandez.com/wp-content/uploads/2019/04/Captura-de-Pantalla-2019-04-24-a-las-11.23.40.png?fit=640%2C319&ssl=1 align="center")

Vamos a pegarle una mirada a nuestro serverless.yml.

![](https://i0.wp.com/blog.santiagoagustinfernandez.com/wp-content/uploads/2019/04/Captura-de-Pantalla-2019-04-24-a-las-14.27.11.png?fit=640%2C314&ssl=1 align="center")

Vamos agregarle el perfil, que usaremos, para hacer el deploy y la region donde queremos hacerlo.

![](https://i2.wp.com/blog.santiagoagustinfernandez.com/wp-content/uploads/2019/04/Captura-de-Pantalla-2019-04-24-a-las-14.49.25.png?fit=640%2C300&ssl=1 align="center")

Instalamos las dependencias. Por un lado serverless-offine, para las pruebas locales, junto con MySQL, para la conectar la base de datos, y querystring, para el parseo de los JSON. Luego inicializamos nuestro archivo.

![](https://blog.santiagoagustinfernandez.com/wp-content/uploads/2019/04/carbon-7.png align="center")

Creamos el archivos connections.js donde pondremos todos nuestros datos de conexión. Vamos a AWS RDS y en base a la BBDD cargamos las variables para su funcionamiento.

![](https://blog.santiagoagustinfernandez.com/wp-content/uploads/2019/04/carbon-8.png align="center")

Creamos la carpeta CRUD/usuarios.js, donde estarán los handlers que atenderán las llamadas de nuestros Endpoints.

![](https://blog.santiagoagustinfernandez.com/wp-content/uploads/2019/04/carbon-9.png align="center")

Ahora nos toca crear los Endpoints, en el YAML. Aca les dejo mi serverless.yml.

![](https://blog.santiagoagustinfernandez.com/wp-content/uploads/2019/04/carbon-10.png align="center")

Ya tenemos todo listo para subirlo a AWS! Serverless creara el API Gateway, las funciones Lambda automaticamente! Hacemos:

```yaml
sls deploy
```

En el supuesto caso de querer probar, localmente, podríamos haber utilizado **sls offline** para la prueba local. Logicamente con los direccionamientos, correspondientes, de base de datos del archivo **connections.js**.

## Deploy

Empezo la Magia!

![](https://i2.wp.com/blog.santiagoagustinfernandez.com/wp-content/uploads/2019/04/Captura-de-Pantalla-2019-04-24-a-las-14.54.04.png?fit=640%2C640&ssl=1 align="center")

Aca podemos ver, varias cosas:

Si revisamos el S3 Bucket, encontraremos nuestro código. A su vez se crearan las funciones y las rutas en el Gateway.

Funciones Lambda

![](https://i2.wp.com/blog.santiagoagustinfernandez.com/wp-content/uploads/2019/04/Captura-de-Pantalla-2019-04-24-a-las-15.11.33.png?fit=640%2C366&ssl=1 align="center")

API Gateway

![](https://i2.wp.com/blog.santiagoagustinfernandez.com/wp-content/uploads/2019/04/Captura-de-Pantalla-2019-04-24-a-las-15.12.02.png?fit=640%2C474&ssl=1 align="center")

## Consumo de la API

Vamos a jugar, con POSTMAN, para revisar nuestras API’s.

Creamos 1 registro, para ello utilizaremos el verbo POST junto al envio del JSON, con los datos a insertar.

![](https://i1.wp.com/blog.santiagoagustinfernandez.com/wp-content/uploads/2019/04/Captura-de-Pantalla-2019-04-24-a-las-15.13.38.png?fit=640%2C640&ssl=1 align="center")

Vamos a realizar un GET junto con el ID.

![](https://i0.wp.com/blog.santiagoagustinfernandez.com/wp-content/uploads/2019/04/Captura-de-Pantalla-2019-04-24-a-las-15.14.44.png?fit=640%2C640&ssl=1 align="center")

Probamos de traer todos los registros.

![](https://i0.wp.com/blog.santiagoagustinfernandez.com/wp-content/uploads/2019/04/Captura-de-Pantalla-2019-04-24-a-las-15.14.19.png?fit=640%2C640&ssl=1 align="center")

Vamos a eliminar el registro.

![](https://i0.wp.com/blog.santiagoagustinfernandez.com/wp-content/uploads/2019/04/Captura-de-Pantalla-2019-04-24-a-las-15.20.26.png?fit=640%2C491&ssl=1 align="center")

Espero que les sirva! Les dejo el proyecto en [GitHub](https://github.com/safernandez666/APILambdaToMySQL).

En la próxima entrada, vamos a darle seguridad! Si quieren eliminar, de sus cuentas, el deploy no tienen mas que hacer sls remove.

Saludos!
