Uso de AWS Lambda con Amazon Aurora DSQL - Amazon Aurora DSQL

Amazon Aurora DSQL se proporciona como un servicio de versión preliminar. Para obtener más información, consulte Betas y versiones preliminares en los Términos de servicio de AWS.

Uso de AWS Lambda con Amazon Aurora DSQL

En el siguiente tutorial se describe cómo utilizar Lambda con Aurora DSQL

Requisitos previos

  • Autorización para crear funciones de Lambda. Para obtener más información, consulte Introducción a Lambda.

  • Autorización para crear o modificar la política de IAM creada por Lambda. Necesita los permisos iam:CreatePolicy y iam:AttachRolePolicy. Para obtener más información, consulte Acciones, recursos y claves de condición para IAM.

  • Debe tener instalado npm v8.5.3 o superior.

  • Debe tener instalado zip v3.0 o superior.

Cree una nueva función en AWS Lambda.
  1. Inicie sesión en la AWS Management Console y abra la consola AWS Lambda en https://console.aws.amazon.com/lambda/.

  2. Seleccione Creación de función.

  3. Proporcione un nombre, como dsql-sample.

  4. No edite la configuración predeterminada para asegurarse de que Lambda crea un nuevo rol con los permisos de Lambda básicos.

  5. Seleccione Creación de función.

Autorización del rol de ejecución de Lambda para conectarse al clúster
  1. En la función de Lambda, elija Configuración > Permisos.

  2. Elija el nombre del rol para abrir el rol de ejecución en la consola de IAM.

  3. Elija Agregar permisos > Crear política insertada y utilice el editor JSON.

  4. En Acción pegue la siguiente acción para autorizar a la identidad de IAM para que se conecte mediante el rol de base de datos administrador.

    "Action": ["dsql:DbConnectAdmin"],
    nota

    Estamos utilizando un rol admin para minimizar los pasos de requisitos previos para empezar. No debe utilizar un rol de base de datos administración para las aplicaciones de producción. Consulte Uso de roles de base de datos con roles de IAM para obtener información sobre cómo crear roles de base de datos personalizados con autorización que tengan el menor número de permisos para la base de datos.

  5. En Recurso, agregue el nombre de recurso de Amazon (ARN) del clúster. También puede utilizar un carácter comodín.

    "Resource": ["*"]
  6. Elija Siguiente.

  7. Introduzca un Nombre para la política, como dsql-sample-dbconnect.

  8. Seleccione Crear política.

Cree un paquete para cargarlo en Lambda.
  1. Cree una carpeta denominada myfunction.

  2. En la carpeta, cree un nuevo archivo llamado package.json con el siguiente contenido.

    { "dependencies": { "@aws-sdk/dsql-signer": "^3.705.0", "assert": "2.1.0", "pg": "^8.13.1" } }
  3. En la carpeta, cree un archivo denominado index.mjs en el directorio con el siguiente contenido.

    import { DsqlSigner } from "@aws-sdk/dsql-signer"; import pg from "pg"; import assert from "node:assert"; const { Client } = pg; async function dsql_sample(clusterEndpoint, region) { let client; try { // The token expiration time is optional, and the default value 900 seconds const signer = new DsqlSigner({ hostname: clusterEndpoint, region, }); const token = await signer.getDbConnectAdminAuthToken(); // <https://node-postgres.com/apis/client> // By default `rejectUnauthorized` is true in TLS options // <https://nodejs.org/api/tls.html#tls_tls_connect_options_callback> // The config does not offer any specific parameter to set sslmode to verify-full // Settings are controlled either via connection string or by setting // rejectUnauthorized to false in ssl options client = new Client({ host: clusterEndpoint, user: "admin", password: token, database: "postgres", port: 5432, // <https://node-postgres.com/announcements> for version 8.0 ssl: true, rejectUnauthorized: false }); // Connect await client.connect(); // Create a new table await client.query(`CREATE TABLE IF NOT EXISTS owner ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), name VARCHAR(30) NOT NULL, city VARCHAR(80) NOT NULL, telephone VARCHAR(20) )`); // Insert some data await client.query("INSERT INTO owner(name, city, telephone) VALUES($1, $2, $3)", ["John Doe", "Anytown", "555-555-1900"] ); // Check that data is inserted by reading it back const result = await client.query("SELECT id, city FROM owner where name='John Doe'"); assert.deepEqual(result.rows[0].city, "Anytown") assert.notEqual(result.rows[0].id, null) await client.query("DELETE FROM owner where name='John Doe'"); } catch (error) { console.error(error); throw new Error("Failed to connect to the database"); } finally { client?.end(); } Promise.resolve(); } // https://docs.aws.amazon.com/lambda/latest/dg/nodejs-handler.html export const handler = async (event) => { const endpoint = event.endpoint; const region = event.region; const responseCode = await dsql_sample(endpoint, region); const response = { statusCode: responseCode, endpoint: endpoint, }; return response; };
  4. Utilice los siguientes comandos para crear un paquete.

    npm install zip -r pkg.zip .
Carga del paquete de código y prueba de la función de Lambda
  1. En la pestaña Código de la función de Lambda, elija Cargar desde > Archivo .zip

  2. Cargue el archivo pkg.zip que ha creado. Para obtener más información, consulte Implementación de funciones de Lambda de Node.js con archivos .zip.

  3. En la pestaña Prueba de la función de Lambda, pegue la siguiente carga útil JSON y modifíquela para utilizar el ID de clúster.

  4. En la pestaña Prueba de la función de Lambda, utilice el siguiente Evento JSON modificado para especificar el punto de conexión del clúster.

    {"endpoint": "replace_with_your_cluster_endpoint"}
  5. Escriba un nombre de evento, como dsql-sample-test. Seleccione Save.

  6. Seleccione Test (Probar).

  7. Elija Detalles para ampliar la respuesta de ejecución y registrar la salida.

  8. Si se ha realizado correctamente, la respuesta de ejecución de la función de Lambda debe devolver un código de estado 200:

    {statusCode": 200, "endpoint": "your_cluster_endpoint"}

    Si la base de datos devuelve un error o si no se realiza la conexión con la base de datos, la respuesta de ejecución de la función de Lambda devuelve un código de estado 500.

    {"statusCode": 500,"endpoint": "your_cluster_endpoint"}