Tutorial: Uso de una función de Lambda para obtener acceso a la base de datos de Amazon RDS - Amazon Relational Database Service

Tutorial: Uso de una función de Lambda para obtener acceso a la base de datos de Amazon RDS

En este tutorial, utilizará una función de Lambda para escribir datos en una base de datos de Amazon Relational Database Service (Amazon RDS) a través de RDS Proxy. La función de Lambda lee registros de una cola de Amazon Simple Queue Service (Amazon SQS) y escribe un elemento nuevo en una tabla de la base de datos siempre que se agrega un mensaje. En este ejemplo, utiliza la AWS Management Console para agregar mensajes a la cola de forma manual. En el siguiente diagrama, se muestran los recursos de AWS que utiliza para completar el tutorial.


      Una instancia de la AWS Management Console se conecta a una cola estándar de Amazon SQS, que se conecta a una función de Lambda, que se conecta a una base de datos de RDS para MySQL a través de RDS Proxy.

Con Amazon RDS, puede ejecutar una base de datos relacional administrada en la nube mediante productos de bases de datos habituales como Microsoft SQL Server, MariaDB, MySQL, Oracle Database y PostgreSQL. Al utilizar Lambda para acceder a su base de datos, puede leer y escribir datos en respuesta a eventos, como el registro de un nuevo cliente en su sitio web. Su función, instancia de base de datos y proxy también se escalan automáticamente para hacer frente a los períodos de alta demanda.

Para completar este tutorial, lleve a cabo las siguientes tareas:

  1. Inicie una instancia de base de datos de RDS para MySQL y un proxy en la VPC predeterminada de su Cuenta de AWS.

  2. Cree y pruebe una función de Lambda que cree una tabla nueva en la base de datos y escriba datos en ella.

  3. Cree una cola de Amazon SQS y configúrela para que invoque la función de Lambda cada vez que se agregue un mensaje nuevo.

  4. Para probar la configuración completa, agregue mensajes a la cola mediante la AWS Management Console y supervise los resultados con los Registros de CloudWatch.

Al completar estos pasos, aprenderá lo siguiente:

  • Cómo usar Amazon RDS para crear una instancia de base de datos y un proxy, y conectar una función de Lambda al proxy.

  • Cómo utilizar Lambda para llevar a cabo operaciones de creación y lectura en una base de datos de Amazon RDS.

  • Cómo utilizar Amazon SQS para invocar una función de Lambda.

Puede completar esta tarea mediante la AWS Management Console o la AWS Command Line Interface (AWS CLI).

Requisitos previos

Antes de empezar, complete los pasos de las siguientes secciones:

Creación de una instancia de base de datos de Amazon RDS


        Diagrama de flujo de trabajo del tutorial que muestra que se encuentra en el paso de creación de la base de datos.

Una instancia de base de datos de Amazon RDS es un entorno de base de datos aislado que se ejecuta en la Nube de AWS. Una instancia puede contener una o más bases de datos creadas por el usuario. A menos que especifique lo contrario, Amazon RDS crea nuevas instancias de bases de datos en la VPC predeterminada incluida en la Cuenta de AWS. Para obtener más información sobre Amazon VPC, consulte la Guía del usuario de Amazon Virtual Private Cloud.

En este tutorial, creará una nueva instancia en su VPC predeterminada de la Cuenta de AWS y creará una base de datos llamada ExampleDB en esa instancia. Puede crear su instancia de base de datos y la base de datos mediante la AWS Management Console o la AWS CLI.

Para crear una instancia de base de datos
  1. Abra la consola de Amazon RDS y elija Crear base de datos.

  2. Deje seleccionada la opción Creación estándar y, a continuación, en Opciones del motor, elija MySQL.

  3. En Plantillas, elija Nivel gratuito.

  4. En Configuración, en Identificador de instancia de base de datos, ingrese MySQLForLambda.

  5. Para establecer su nombre de usuario y contraseña, haga lo siguiente:

    1. En Configuración de credenciales, deje Nombre de usuario maestro establecido en admin.

    2. En Contraseña maestra, introduzca y confirme una contraseña para acceder a la base de datos.

  6. Para especificar el nombre de la base de datos, haga lo siguiente:

    • Deje todas las opciones predeterminadas restantes seleccionadas y desplácese hacia abajo hasta la sección Configuración adicional.

    • Amplíe esta sección e introduzca ExampleDB como Nombre de base de datos inicial.

  7. Deje todas las opciones predeterminadas restantes seleccionadas y elija Crear base de datos.

Creación de una función de Lambda y un proxy


        Diagrama de flujo de trabajo del tutorial que muestra que se encuentra creando un rol de ejecución en el paso de la función de Lambda.

Puede utilizar la consola de RDS para crear una función de Lambda y un proxy en la misma VPC que la base de datos.

nota

Solo puede crear estos recursos asociados cuando la base de datos haya terminado de crearse y esté en estado Disponible.

Para crear una función y un proxy asociados
  1. Desde la página Bases de datos, compruebe si su base de datos está en estado Disponible. Si es así, continúe con el siguiente paso. De no ser así, espere a que la base de datos esté disponible.

  2. Seleccione la base de datos y elija Configurar la conexión de Lambda en Acciones.

  3. En la página Configurar la conexión de Lambda, elija Crear nueva función.

    Configure el Nombre de la nueva función de Lambda a LambdaFunctionWithRDS.

  4. En la sección RDS Proxy, seleccione la opción Conectarse mediante RDS Proxy. Además, elija Crear un nuevo proxy.

    • En Credenciales de la base de datos, elija Nombre de usuario y contraseña de la base de datos.

    • En Nombre de usuario, especifique admin.

    • En Contraseña, escriba la contraseña que ha creado para la instancia de base de datos.

  5. Seleccione Configurar para completar la creación de la función de Lambda y el proxy.

El asistente completa la configuración y proporciona un enlace a la consola de Lambda para que revise la nueva función. Tenga en cuenta el punto de conexión del proxy antes de cambiar a la consola de Lambda.

Crear un rol de ejecución de función


        Diagrama de flujo de trabajo del tutorial que muestra que se encuentra creando un rol de ejecución en el paso de la función de Lambda.

Antes de crear la función de Lambda, debe crear un rol de ejecución para conceder a la función los permisos necesarios. Para este tutorial, Lambda necesita permiso para administrar la conexión de red a la VPC que contiene la instancia de base de datos y para sondear los mensajes de una cola de Amazon SQS.

Para dar a la función de Lambda los permisos que necesita, se utilizan políticas administradas por IAM en este tutorial. Se trata de políticas que conceden permisos para muchos casos de uso comunes y están disponibles en la Cuenta de AWS. Para obtener más información sobre el uso de políticas administradas, consulte Prácticas recomendadas relativas a políticas.

Para crear el rol de ejecución de Lambda
  1. Abra la página Roles de la consola de IAM y elija Crear rol.

  2. En Tipo de entidad de confianza, elija Servicio de AWS, y en Caso de uso, elija Lambda.

  3. Elija Siguiente.

  4. Agregue las políticas administradas por IAM de la siguiente manera:

    1. En el cuadro de búsqueda de políticas, busque AWSLambdaSQSQueueExecutionRole.

    2. En la lista de resultados, seleccione la casilla de verificación junto al rol y, a continuación, elija Borrar filtros.

    3. En el cuadro de búsqueda de políticas, busque AWSLambdaVPCAccessExecutionRole.

    4. En la lista de resultados, seleccione la casilla de verificación junto al rol y, a continuación, elija Siguiente.

  5. En Nombre del rol, ingrese lambda-vpc-sqs-role y, a continuación, elija Crear rol.

Más adelante en el tutorial, necesitará el nombre de recurso de Amazon (ARN) del rol de ejecución que acaba de crear.

Para encontrar el ARN del rol de ejecución
  1. Abra la página Roles de la consola de IAM y elija su rol (lambda-vpc-sqs-role).

  2. Copie el ARN que se muestra en la sección Resumen.

Creación del paquete de despliegue de Lambda


        Diagrama de flujo de trabajo del tutorial que muestra que se encuentra creando un paquete de despliegue en el paso de la función de Lambda

En el siguiente ejemplo de código Python, se utiliza el paquete PyMySQL para abrir una conexión a la base de datos. La primera vez que invoca su función, también crea una nueva tabla llamada Customer. La tabla utiliza el siguiente esquema, en el que CustID es la clave principal:

Customer(CustID, Name)

La función también utiliza PyMySQL para agregar registros a esta tabla. La función agrega registros mediante los ID de cliente y los nombres especificados en los mensajes que agregará a la cola de Amazon SQS.

El código crea la conexión a la base de datos fuera de la función del controlador. La creación de la conexión en el código de inicialización permite volver a utilizar la conexión mediante invocaciones posteriores de la función y mejora el rendimiento. En una aplicación de producción, también puede utilizar la simultaneidad aprovisionada para inicializar el número solicitado de conexiones a la base de datos. Estas conexiones están disponibles en cuanto se invoca la función.

import sys import logging import pymysql import json import os # rds settings user_name = os.environ['USER_NAME'] password = os.environ['PASSWORD'] rds_proxy_host = os.environ['RDS_PROXY_HOST'] db_name = os.environ['DB_NAME'] logger = logging.getLogger() logger.setLevel(logging.INFO) # create the database connection outside of the handler to allow connections to be # re-used by subsequent function invocations. try: conn = pymysql.connect(host=rds_proxy_host, user=user_name, passwd=password, db=db_name, connect_timeout=5) except pymysql.MySQLError as e: logger.error("ERROR: Unexpected error: Could not connect to MySQL instance.") logger.error(e) sys.exit(1) logger.info("SUCCESS: Connection to RDS for MySQL instance succeeded") def lambda_handler(event, context): """ This function creates a new RDS database table and writes records to it """ message = event['Records'][0]['body'] data = json.loads(message) CustID = data['CustID'] Name = data['Name'] item_count = 0 sql_string = f"insert into Customer (CustID, Name) values(%s, %s)" with conn.cursor() as cur: cur.execute("create table if not exists Customer ( CustID int NOT NULL, Name varchar(255) NOT NULL, PRIMARY KEY (CustID))") cur.execute(sql_string, (CustID, Name)) conn.commit() cur.execute("select * from Customer") logger.info("The following items have been added to the database:") for row in cur: item_count += 1 logger.info(row) conn.commit() return "Added %d items to RDS for MySQL table" %(item_count)
nota

En este ejemplo, las credenciales de acceso a la base de datos se almacenan como variables de entorno. En las aplicaciones de producción, se recomienda utilizar AWS Secrets Manager como una opción más segura. Tenga en cuenta que si la función de Lambda está en una VPC, debe crear un punto de conexión de VPC para conectarse a Secrets Manager. Para obtener más información, consulte How to connect to AWS Secrets Manager service within a Virtual Private Cloud.

Para incluir la dependencia PyMySQL en el código de la función, cree un paquete de despliegue .zip. Los siguientes comandos funcionan en Linux, macOS o Unix:

Para crear un paquete de paquete de despliegue .zip
  1. Guarde el código de ejemplo como un archivo denominado lambda_function.py.

  2. En el mismo directorio en el que creó el archivo lambda_function.py, cree un nuevo directorio llamado package e instale la biblioteca de PyMySQL.

    mkdir package pip install --target package pymysql
  3. Cree un archivo zip que contenga el código de la aplicación y la biblioteca de PyMySQL. En Linux o macOS, ejecute los siguientes comandos de la CLI. En Windows, utilice la herramienta de compresión que prefiera para crear el archivo lambda_function.zip. El archivo de código de origen lambda_function.py y las carpetas que contienen las dependencias deben estar instalados en la raíz del archivo .zip.

    cd package zip -r ../lambda_function.zip . cd .. zip lambda_function.zip lambda_function.py

    También puede crear su paquete de despliegue mediante un entorno virtual de Python. Consulte Implementación de funciones Python Lambda con archivos .zip.

Actualización de la función de Lambda

Con el paquete .zip que acaba de crear, ahora puede actualizar una función de Lambda mediante la consola de Lambda. Para permitir que la función acceda a la base de datos, también debe configurar las variables de entorno con las credenciales de acceso.

Para actualizar la función de Lambda
  1. Abra la página Funciones de la consola de Lambda y elija su función LambdaFunctionWithRDS.

  2. En la pestaña Configuración de tiempo de ejecución, seleccione Editar para cambiar el Tiempo de ejecución de la función a Python 3.10.

  3. Cambie el Controlador a lambda_function.lambda_handler.

  4. En la pestaña Código, elija Cargar desde y, a continuación, archivo .zip.

  5. Seleccione el archivo lambda_function.zip que creó en la fase anterior y elija Guardar.

Ahora, configure la función con el rol de ejecución que creó anteriormente. Esto concede a la función los permisos que necesita para acceder a la instancia de base de datos y sondear una cola de Amazon SQS.

Para configura el rol de ejecución de la función
  1. En la página Funciones de la consola de Lambda, seleccione la pestaña Configuración y, a continuación, elija Permisos.

  2. En Rol de ejecución, elija Editar.

  3. En Rol existente, elija su rol de ejecución (lambda-vpc-sqs-role).

  4. Elija Guardar.

Para configurar las variables de entorno de la función
  1. En la página Funciones de la consola de Lambda, seleccione la pestaña Configuración y luego elija Variables de entorno.

  2. Elija Editar.

  3. Para agregar las credenciales de acceso a la base de datos, haga lo siguiente:

    1. Elija Agregar variable de entorno y, luego, para Clave, ingrese USER_NAME. A continuación, para Valor, ingrese admin.

    2. Elija Agregar variable de entorno y, luego, para Clave, ingrese DB_NAME. A continuación, para Valor, ingrese ExampleDB.

    3. Elija Agregar variable de entorno y, luego, para Clave, ingrese PASSWORD. A continuación, para Valor, ingrese la contraseña que eligió al crear la base de datos.

    4. Elija Agregar variable de entorno y, luego, para Clave, ingrese RDS_PROXY_HOST. A continuación, para Valor, ingrese el punto de conexión de RDS Proxy del que tomo nota antes.

    5. Elija Guardar.

Prueba de la función de Lambda en la consola


        Diagrama de flujo de trabajo del tutorial que muestra que se encuentra probando la función en el paso de la función de Lambda

Puede seguir utilizando la consola de Lambda para probar la función. En la fase final del tutorial, debe crear un evento de prueba que imita los datos que recibirá la función cuando la invoque con Amazon SQS. El evento de prueba contiene un objeto JSON que especifica un ID y un nombre de cliente para agregarlos a la tabla Customer que crea la función.

Para probar la función de Lambda
  1. Abra la página Funciones de la consola de Lambda y elija su función.

  2. Elija la sección Prueba.

  3. Elija Crear un nuevo evento y escriba myTestEvent como nombre del evento.

  4. Copie el siguiente código en Evento JSON y seleccione Guardar.

    { "Records": [ { "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d", "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", "body": "{\n \"CustID\": 1021,\n \"Name\": \"Martha Rivera\"\n}", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1545082649183", "SenderId": "AIDAIENQZJOLO23YVJ4VO", "ApproximateFirstReceiveTimestamp": "1545082649185" }, "messageAttributes": {}, "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-west-2:123456789012:my-queue", "awsRegion": "us-west-2" } ] }
  5. Seleccione Probar.

En la pestaña Resultados de ejecución, debería ver resultados similares a los siguientes que se muestran en los Registros de funciones:

[INFO] 2023-02-14T19:31:35.149Z bdd06682-00c7-4d6f-9abb-89f4bbb4a27f The following items have been added to the database: [INFO] 2023-02-14T19:31:35.149Z bdd06682-00c7-4d6f-9abb-89f4bbb4a27f (1021, 'Martha Rivera')

Cree una cola de Amazon SQS.


        Diagrama de flujo de trabajo del tutorial que muestra que se encuentra creando la cola en el paso de la cola de mensajes.

Ha probado correctamente la integración de la función de Lambda y la instancia de base de datos de Amazon RDS. Ahora, cree la cola de Amazon SQS que utilizará para invocar la función de Lambda en la fase final del tutorial.

Para crear la cola de Amazon SQS (consola)
  1. Abra la página Colas de la consola de Amazon SQS y seleccione Crear cola.

  2. Deje Tipo como Estándar e ingrese LambdaRDSQueue como nombre de la cola.

  3. Deje todas las opciones predeterminadas seleccionadas y seleccione Crear cola.

Creación de una asignación de orígenes de eventos para invocar la función de Lambda


        Diagrama de flujo de trabajo del tutorial que muestra que se encuentra creando una asignación de orígenes de eventos en el paso de la cola de mensajes.

Una asignación de orígenes de eventos es un recurso de Lambda que lee elementos de un flujo o una cola e invoca una función de Lambda. Al configurar una asignación de orígenes de eventos, puede especificar un tamaño de lote para que los registros de su flujo o cola se agrupen en una sola carga. En este ejemplo, ha establecido el tamaño del lote en 1 para que la función de Lambda se invoque cada vez que envíe un mensaje a la cola. Puede configurar la asignación de orígenes de eventos mediante la AWS CLI o la consola de Lambda.

Para crear una asignación de orígenes de eventos (consola)
  1. Abra la página Funciones de la consola de Lambda y seleccione su función (LambdaFunctionWithRDS).

  2. En la sección Información general de la función, elija Agregar desencadenador.

  3. Para el origen, seleccione Amazon SQS y, a continuación, seleccione el nombre de la cola (LambdaRDSQueue).

  4. En Tamaño del lote, ingrese 1.

  5. Deje todas las demás opciones configuradas en los valores predeterminados y seleccione Agregar.

Ya lo tiene todo listo para probar la configuración completa. Para ello, agregue un mensaje a su cola de Amazon SQS.

Prueba y supervisión de la configuración


        Diagrama de flujo de trabajo del tutorial que muestra que se encuentra en el paso de prueba y supervisión.

Para probar la configuración completa, agregue mensajes a la cola de Amazon SQS mediante la consola. A continuación, utilice Registros de CloudWatch para confirmar que la función de Lambda esté escribiendo registros en la base de datos según lo previsto.

Para probar y supervisar la configuración
  1. Abra la página Colas de la consola de Amazon SQS y seleccione su cola (LambdaRDSQueue).

  2. Elija Enviar y recibir mensajes y pegue el siguiente JSON en el Cuerpo del mensaje de la sección Enviar mensaje.

    { "CustID": 1054, "Name": "Richard Roe" }
  3. Elija Enviar mensaje.

    Al enviar el mensaje a la cola, Lambda invocará la función a través de la asignación de orígenes de eventos. Para confirmar que Lambda haya invocado su función según lo previsto, utilice Registros de CloudWatch para comprobar que la función haya escrito el ID y el nombre del cliente en la tabla de la base de datos.

  4. Abra la página Grupos de registro de la consola de CloudWatch y seleccione el grupo de registro para su función (/aws/lambda/LambdaFunctionWithRDS).

  5. En la sección Flujos de registro, elija el flujo de registro más reciente.

    La tabla debe contener dos registros de clientes, uno de cada invocación de la función. En el flujo de registro, debería ver mensajes similares al siguiente:

    [INFO] 2023-02-14T19:06:43.873Z 45368126-3eee-47f7-88ca-3086ae6d3a77 The following items have been added to the database: [INFO] 2023-02-14T19:06:43.873Z 45368126-3eee-47f7-88ca-3086ae6d3a77 (1021, 'Martha Rivera') [INFO] 2023-02-14T19:06:43.873Z 45368126-3eee-47f7-88ca-3086ae6d3a77 (1054, 'Richard Roe')

Limpiar los recursos de

A menos que desee conservar los recursos que creó para este tutorial, puede eliminarlos ahora. Si elimina los recursos de AWS que ya no utiliza, evitará gastos innecesarios en su cuenta de AWS.

Cómo eliminar la función de Lambda
  1. Abra la página de Funciones en la consola de Lambda.

  2. Seleccione la función que ha creado.

  3. Elija Actions (Acciones), Delete (Eliminar).

  4. Elija Delete (Eliminar).

Cómo eliminar el rol de ejecución
  1. Abra la página Roles en la consola de IAM.

  2. Seleccione el rol de ejecución que creó.

  3. Elija Delete role (Eliminar rol).

  4. Elija Sí, eliminar.

Para eliminar la instancia de base de datos MySQL
  1. Abra la página Databases (Bases de datos) de la consola de Amazon RDS.

  2. Seleccione la base de datos que ha creado.

  3. Elija Acciones, Eliminar.

  4. Borre el cuadro de verificación Create final snapshot (Crear instantánea final).

  5. Escriba delete me en el cuadro de texto.

  6. Elija Eliminar.

Para eliminar la cola de Amazon SQS
  1. Inicie sesión en la AWS Management Console y abra la consola de Amazon SQS en https://console.aws.amazon.com/sqs/.

  2. Seleccione la cola que ha creado.

  3. Elija Eliminar.

  4. Escriba delete en el cuadro de texto.

  5. Elija Eliminar.