DEV Community

camilo cabrales
camilo cabrales

Posted on

Conectarse a RDS por medio de un Proxy desde una función Lambda

Muchas de las aplicaciones que creamos necesitan una fuente de datos o base de datos relacional.Cuando la aplicación crece vamos a tener una carga significativa a nuestra base de datos, por lo que vamos a realizar mas peticiones y se van a crear mas conexiones a ella, lo que puede llegar a saturar la base de datos en cuanto a cantidad de conexiones.

Para dar un mejor manejo a las conexiones AWS tiene el componente Proxy que se encarga de administrar las conexiones a la base de datos de manera eficiente y evita que podamos llegar a tener errores por el alto numero de conexiones.

En este post vamos a crear un Proxy para que sirva como punto de acceso a nuestra base de datos. El acceso a la base de datos lo vamos a realizar por medio de una función Lambda.

Los Pasos a realizar van a ser los siguientes:

  • Creación de una base de datos (RDS).
  • Creación de un Secreto (Secrets Manager).
  • Creación del Proxy.
  • Creación de la función Lambda.

Iniciemos con la creación de la base de datos, para esto buscamos el servicio RDS. Ya en la pagina principal de RDS damos click en Databases y Create Database.

Principal RDS

Podemos observar que hay dos formas para crear nuestra base de datos: Standard create _y _Easy create. Las dos formas nos permiten crear la base de datos solo que la forma Easy create no necesitamos realizar muchas configuraciones, para nuestro caso vamos a utilizar la forma Standard create. Aunque pueden usar Easy create.

Seleccionamos el motor de base de datos PostgreSQL y dejamos la version que se carga por defecto.

Select Engine

Seleccionamos el template free tier para que no genere "costos" (Recuerden eliminar todos los servicios creados al terminar el ejercicio). Esta selección solo se debe utilizar para pruebas ya que son bases de datos pequeñas que no tienen alta disponibilidad ni sus datos se replican.

Select Template

Ahora asignamos un identificador para la instancia de base de datos, asignamos nombre un usuario y su contraseña.

Settings

Ahora debemos seleccionar el tipo de instancia que queremos para nuestra base de datos dejamos seleccionado la que viene por defecto que es t3.micro que es una instancia de uso general (En las referencias se encuentra el link hacia los tipos de instancia que maneja AWS).Para el almacenamiento dejamos un disco de propósito general de 20GB. Los demás valores los dejamos por defecto.

Instance Configuration

El siguiente paso es seleccionar la configuración de red y el lugar de donde queremos que se tenga acceso a nuestra base de datos. Para ambientes productivos siempre es mejor dejar el Public access No, ya limita el acceso a que sea desde la VPC en la cual se crea nuestra base de datos.

Conectivity

En la sección Aditional Configuration, vamos a encontrar dentro de la sección Database options una lista con el nombre DB parameter group. Los parameters groups nos sirven para establecer la configuración del motor de base de datos, siempre es recomendable tener una parameter group diferente al que esta por defecto para entornos de desarrollo y producción.
Para finalizar damos click en el boton Create Database.

Create Database

En la siguiente pantalla vamos a ver el listado de base de datos que tenemos en esta región. Vamos a dar click en el nombre de la base de datos que acabos de crear para ver el endpoint para conectarnos a ella.

Create Database

EndPoint

Nuestro siguiente paso es crear el Proxy para nuestra base de datos. Para esto vamos al menu lateral izquierdo y seleccionamos Proxies y damos click en el botón Create Proxy.

Create Proxy

Ahora debemos asignar un nombre al Proxy y seleccionar el tipo de motor de base de datos a utilizar para el Proxy.

Name Proxy

Seguido a esto debemos seleccionar la base de datos a la cual queremos crearle el proxy, seleccionamos la base de datos que lanzamos en pasos anteriores.

Select Database Proxy

En la sección de Conectivity nos pide un secreto (Nos sirve para almacenar información privada o credenciales de bases de datos). Damos click en el enlace create a new secret y nos llevara a la pagina principal de secrets manager, damos click en Store a new secret.

Page Secret

En esta pantalla debemos seleccionar el tipo de secreto, ingresar el usuario y contraseña que definimos al crear la base de datos y seleccionar la base de datos que va a utilizar este secreto.

Choose secret

Ahora debemos dar un nombre y una descripción a nuestro secreto.

Name secret

Para este caso vamos a dejar la configuración por defecto, sin embargo para entornos de producción como buena practica debemos rotar nuestros secretos .

Rotate secret

Para finalizar vamos a ver un resumen de la configuración de nuestro secreto y la forma en que podemos acceder a él por medio de algunos lenguajes de programación. Damos click en Store.

Store secret

Una vez creado el secreto regresamos a la ventana donde estábamos creando el proxy y seleccionamos el secreto (es posible que el secreto no aparezca en la lista y debamos actualizar la pagina e ingresar de nuevo los datos) que acabamos de crear y damos click en el botón Create proxy.

Create Proxy

El proxy puede tardar un tiempo en crearse, por lo que debemos esperar un poco a qué se cree.

Creating Proxy

Hasta el momento hemos creado: La base de datos, un secreto para almacenar las credenciales a la base de datos y el proxy por el cual vamos acceder a la base de datos. Ahora vamos a iniciar la creación de la función Lambda que va a conectarse a la base de datos.

Vamos a la pagina principal de Lambda y damos click en Create function.

Create function

El siguiente paso es definir la configuración de nuestra función, iniciando por asignarle un nombre, el lenguaje de programación y dejamos seleccionado para que se cree un rol por defecto.

Assign name function

Como el proxy solo se puede usar desde dentro de una VPC debemos seleccionar la VPC a la cual va a tener acceso. Hay que tener en cuenta que debe ser la misma VPC que seleccionamos para la base de datos y el proxy (en este ejemplo estamos utilizando la VPC por defecto que trae AWS para esta region).Aparte de la VPC debemos seleccionar las subnets desde la cuales la función Lambda puede acceder al proxy. Por ultimo debemos seleccionar el Security Group que nos va a permitir el acceso al proxy por medio del puerto que usa Postgres. Terminada la configuración damos click en el botón Create function.

Configure VPC Lambda

Como vamos a trabajar con Postgres desde Lambda, debemos utilizar el paquete psycopg que nos ayuda a tener acceder a Postgres. Si queremos utilizar paquetes de terceros o creados por nosotros en necesario usar un Layer.(en las referencias se indica como crear Layer).

Para agregar nuestra layer vamos a la parte inferior de la pantalla de la función Lambda y damos click en Add Layer.

Add Layer

En la siguiente pantalla seleccionamos nuestra Layer y la versión. El numero de versión depende de las veces que la hayamos modificado el Layer.

Select Layer

Podemos ver que nuestra Layer se agrego con éxito.

Show Layer

Ya que configuramos nuestra Layer debemos asignar al rol de la función Lambda las siguientes políticas. Para esto vamos a la pestaña de Configuration - Permissions damos click en el rol de la función.

Rol Function

Agregamos las siguientes políticas al rol: SecretsManagerReadWrite,AmazonRDSFullAccess y una política personalizada como la siguiente:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetResourcePolicy",
                "secretsmanager:GetSecretValue",
                "secretsmanager:DescribeSecret",
                "secretsmanager:ListSecretVersionIds",
                "secretsmanager:ListSecrets"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
Enter fullscreen mode Exit fullscreen mode

Policies Rol

Una vez que terminamos la configuración del rol de la función Lambda vamos agregar el siguiente código.

import json
import boto3
import psycopg2

client_secret = boto3.client('secretsmanager')

def lambda_handler(event, context):
    # TODO implement

    probar_conexion()
    return {
        'statusCode': 200,
        'body': json.dumps('Test Proxy!')
    }

def probar_conexion():
    conn = psycopg2.connect(host="proxy.com",database="postgres",user='postgres',password='12345678')
    print(conn)
    conn.close()

def probar_conexion_endpoint():
    response = client_secret.get_secret_value(SecretId='arn:aws:secretsmanager:us-east-1:385033107168:secret:secret-bd-proxy-4l9BKB')
    credentials = json.loads(response["SecretString"])
    conn = psycopg2.connect(host="proxy-database-post.proxy-cty4x2ccvn0y.us-east-1.rds.amazonaws.com",database="postgres",user=credentials["username"],password=credentials["password"])
    print(conn)
    conn.close()
Enter fullscreen mode Exit fullscreen mode

La función probar_conexion es la que vamos a utilizar para probar la conexión a nuestro proxy (Es necesario reemplazar los parametros: host,database,user,password por los que establecimos en la configuración de nuestra base de datos). Ahora debemos crear el tipo de prueba, desplegar la función (botón Deploy) y ejecutar la función (botón Test).

Como ejercicio pueden probar la función probar_conexion_endpoint. Para esto es necesario configurar un EndPoint (Se puede encontrar en la pagina de la VPC) que este dentro de la VPC de la función Lamba y de la base de datos, en su Security Group le debemos indicar que el Security Group de la función Lambda puede acceder a el.

EndPoint

Me pueden encontrar en:

Camilo Cabrales

Referencias

Proxy

Tipos de Instancia

Lambda Layer

Secrets Manager

Parameters Group

Discussion (0)