Cómo conectarse a Aurora Serverless fuera de la VPC.

He estado recientemente trabajando mucho con bases de datos en AWS, he tenido algunos retos y uno de ellos fue con Aurora Serverless para un caso de uso específico.

Necesitaba implementar una BD en Aurora Serverless para una aplicación que tiene una concurrencia muy variable y por la época actual de la pandemia era importante trabajar en alternativas para la reducción de costos, es así como buscamos migrar una Aurora Provisioned a una Aurora Serverless y en el camino surgieron varias cosas a tener en cuenta:

1- Para migrar la Aurora Provisioned a Aurora Serverless se debe tener en cuenta la versión del MySQL dado que teníamos originalmente 5.7 y Aurora Serverless sólo soporta 5.6, por tal motivo no pudimos hacerla por snapshots.

2- El servidor que tenia la APP y debía conectarse a la BD estaba onpremise con una IP Pública, pero no se contaba con VPN o Direct Connect hacía AWS.

3- Aurora Serverless no permite conexiones externas.

Teniendo en cuenta los puntos anteriores optamos por un workaround para poder conectar el servidor con la BD Aurora Serverless, el cual se ve en el siguiente diagrama:

Conectividad entre Servidor externo y Aurora Serverless

Para la conectividad externa del servidor on premise con la BD Aurora Serverless en un Subnet Group privado se debe hacer por un bastión host en la subred pública y crear un tunel ssh de la siguiente forma:

1- Lanzar un servidor AMI Linux en una subred pública, se configura el SG permitiendo solo tráfico del puerto 22 a la IP pública del servidor /32.

2- Probar conectividad desde el servidor bastión a la BD:

[ec2-user@ip-10-10-0-206 ~]$ mysql -h serverlesstest.cluster-cvxa7jznn96c.us-east-1.rds.amazonaws.com -u admin -p 
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.6.10 MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.MySQL [(none)]>

3- Ahora probar conectividad desde el servidor on premise a la BD haciendo el tunel SSH:

ssh ec2-user@IP_BASTION_HOST -i serverlesstest.pem -L 3306:serverlesstest.cluster-cvxa7jznn96c.us-east-1.rds.amazonaws.com:3306 -fN

Esto creará el túnel SSH. Todo el tráfico será enviado desde el servidor on premise desde el puerto -L (3306) al endpoint de la BD Aurora Serverless(también el puerto 3306). Tenga en cuenta que la opción f envía el proceso a un segundo plano y se hace difícil matarlo más adelante si desea desconectar el túnel.

Se puede omitir la opción f de la siguiente forma:

ssh ec2-user@IP_BASTION_HOST -i testserverless.pem -L 3306:serverlesstest.cluster-cvxa7jznn96c.us-east-1.rds.amazonaws.com:3306 -N

Si lo desea utilizar de esta forma, tenga en cuenta que una vez que finaliza la sesión (o presiona ctrl + c), el túnel se cierra y todas las conexiones actuales se interrumpen.

4- Después de crear el túnel SSH, cualquier comando que emita a localhost: 3306 se reenvía al clúster Aurora Serverless.

Failover en Aurora Serverless

Si tenemos algún fallo en la BD principal o la AZ se encuentra caída, Aurora vuelve a crear la BD en una AZ diferente, esto se conoce como failover automático multi-AZ.

Tiempo del Failover en Aurora Serverless

Como tal AWS no provee un tiempo esperado, esto depende totalmente de la demanda y la disponibilidad de capacidad en otras AZ dentro de la región donde se desplegó el clúster.

Lecciones aprendidas Aurora Serverless

1- Aurora Serverless no funciona con Proxy RDS [1].

2- Aurora Serverless no permite conexiones externas, se debe hacer a través de un bastión host.

3- Tenga en cuenta si va a migrar un snapshot de Aurora Provisioned a Aurora Serverless la versión de MySQL. [2]

Links:

[1] Proxy RDS.

[2] Migrar snapshots de Aurora Provisioned a Aurora Serverless.

AWS x10, Tech Director en Globant con más de 7 años de experiencia en AWS.

AWS x10, Tech Director en Globant con más de 7 años de experiencia en AWS.