En este tutorial, crearás un disparador de base de datos. El disparador llama a una API de terceros cuando se inserta un documento en una colección. La función del disparador agrega el Kit de Desarrollo de Software (SDK) oficial de AWS como dependencia externa. A continuación, la función utiliza el SDK para escribir el documento insertado en un bucket S3 como un objeto JSON extendido.
Acerca de esta tarea
El ejemplo de AWS S3 en este tutorial ilustra un patrón que se aplica a cualquier servicio de terceros que tenga una biblioteca Node.js:
Agregue el paquete npm del servicio como una dependencia externa.
Almacena las credenciales necesarias como Secretos y haz referencia a ellas desde los Valores en tu Función.
Importa el paquete con
require()dentro de tu función y llámalo usando las credenciales que almacenaste.
Antes de comenzar
Para completar este tutorial, debes tener:
Un clúster de Atlas con una colección de prueba. Para empezar, consulta Crear un clúster de Atlas Infinite o Atlas Core.
Un bucket S3 de AWS. Para aprender a crear uno, consulte la sección «Crear un bucket de propósito general» en la documentación de AWS. Tenga en cuenta lo siguiente para su uso posterior:
El nombre completo del cubo
La región de AWS
Una política de AWS IAM que permite
s3:PutObjecten el prefijoinserted-documents/*de tu bucket. Para saber cómo crear una, consulta la sección "Crear políticas de IAM" en la documentación de AWS.Un usuario de AWS IAM con la política asociada. Para saber cómo crearlo, consulta la sección «Crear un usuario de IAM en tu cuenta de AWS» en la documentación de AWS.
Una clave de acceso y una clave de acceso secreta para el usuario de IAM. Para obtener información sobre cómo crearlas, consulte la sección «Crear claves de acceso» en la documentación de AWS.
Pasos
Almacena tus credenciales de AWS como valores y secretos.
Crea los siguientes valores y secretos para almacenar tus credenciales de AWS:
AwsAccessKeyId: Valor que contiene su ID de clave de acceso de AWS.AwsSecretAccessKeySecret: Secreto que contiene su clave de acceso secreta de AWS.AwsSecretAccessKey: Valor que vincula con el secreto. Esto le permite acceder a la clave de acceso secreta en su función, manteniéndola almacenada de forma segura como un secreto.
Dirígete a la página de Valores.
En Atlas, diríjase a la página Triggers.
Si aún no aparece, se debe seleccionar la organización que contiene el proyecto en el menú Organizations de la barra de navegación.
Si aún no se muestra, seleccione su proyecto en el menú Projects de la barra de navegación.
En la barra lateral, haz clic en Triggers en la sección Streaming Data.
Se muestra la página de Triggers.
Haga clic en el botón View All Apps.
Haz clic en la aplicación en la que deseas crear el activador.
En la barra lateral, haz clic en Values en la sección Build.
Almacene el ID de la clave de acceso.
Haga clic en Create a Value.
Introduce
AwsAccessKeyIdcomo Value Name.Selecciona el tipo Value.
Seleccione la opción Custom Content e ingrese su ID de clave de acceso de AWS.
Nota
Debe introducir el ID de la clave de acceso como un valor de cadena entre comillas (
"<accessKeyId>").Haga clic en Save Draft.
Guarda la clave de acceso secreta.
Nota
No se puede acceder directamente a los valores secretos, por lo que se debe crear un segundo valor que se vincule al secreto.
Haga clic en Create a Value.
Introduce
AwsSecretAccessKeycomo Value Name.Selecciona el tipo Value.
Seleccione la opción Link to Secret.
Introduzca
AwsSecretAccessKeySecrety haga clic en Create "AwsSecretAccessKeySecret" para nombrar el secreto.Pegue su clave de acceso secreta de AWS en el campo que aparece debajo del nombre del secreto.
Haga clic en Save Draft para crear tanto el Secreto como el Valor.
Crear el disparador de la base de datos y su función.
Crea un disparador de base de datos que llame a una nueva función cuando se inserte un documento. Agrega la dependencia aws-sdk y define el código de la función en el mismo formulario.
Dirígete a la página de Disparadores.
En Atlas, diríjase a la página Triggers.
Si aún no aparece, se debe seleccionar la organización que contiene el proyecto en el menú Organizations de la barra de navegación.
Si aún no se muestra, seleccione su proyecto en el menú Projects de la barra de navegación.
En la barra lateral, haz clic en Triggers en la sección Streaming Data.
Se muestra la página de Triggers.
Crea el disparador.
Haz clic en Add Trigger para abrir la página de configuración del activador.
Seleccione el tipo de activador Database y, a continuación, configure el activador utilizando los siguientes valores:
ConfiguraciónValorTrigger NameWriteDocumentToS3TriggerWatch AgainstCollectionCluster NameNombre de su clúster de prueba
Database NameNombre de su base de datos de prueba
Collection NameNombre de su colección de pruebas
Operation TypeSeleccione solo
Insert.Event TypeFunctionEn la sección Function, seleccione + New Function.
Introduzca el siguiente código para definir la función.
Reemplace YOUR_AWS_REGION y YOUR_S3_BUCKET_NAME con su propia región de AWS y el nombre completo del bucket desde la consola de administración de AWS.
1 /* 2 * Write a newly-inserted document to an S3 bucket as an Extended JSON object. 3 */ 4 exports = async function writeDocumentToS3(changeEvent) { 5 const { fullDocument } = changeEvent; 6 7 // require calls must be in the exports function 8 const S3 = require("aws-sdk/clients/s3"); 9 const s3 = new S3({ 10 accessKeyId: context.values.get("AwsAccessKeyId"), 11 secretAccessKey: context.values.get("AwsSecretAccessKey"), 12 region: "YOUR_AWS_REGION", 13 }); 14 15 const key = `inserted-documents/${fullDocument._id.toString()}.json`; 16 17 // https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#putObject-property 18 await s3.putObject({ 19 Bucket: "YOUR_S3_BUCKET_NAME", 20 Key: key, 21 Body: EJSON.stringify(fullDocument), 22 ContentType: "application/json", 23 }).promise(); 24 25 return `Wrote document ${fullDocument._id} to ${key}`; 26 };
Cada vez que se inserta un documento, la función realiza lo siguiente:
Lee el documento insertado desde el campo
fullDocumentdel evento de cambio.Crea un cliente S3 que se autentica con las credenciales de AWS almacenadas en sus Valores.
Escribe el documento en el prefijo
inserted-documents/de su bucket como<_id>.json.
Nota
La función utiliza el _id del documento como parte de la clave del objeto S3. Si sus documentos utilizan un tipo _id distinto de ObjectId, es posible que la clave no sea la esperada.
Haz clic en Save para crear el disparador.
Importante
Si la opción de borradores de implementación está habilitada para tu aplicación, haz clic en Review & Deploy para implementar los valores, secretos, dependencias, funciones y activadores. Hasta que no los implementes, el activador no se ejecutará y el siguiente paso fallará.
Prueba el gatillo
Inserta un documento de prueba en la colección que supervisa el activador. Confirma que aparece un objeto JSON extendido correspondiente en tu bucket S3 bajo el prefijo inserted-documents/.
Conéctese a su clúster con mongosh.
Para saber cómo hacerlo, consulta Conectarse a un clúster mediante mongosh.
Inserta un documento en la colección que supervisa el Disparador.
El siguiente ejemplo inserta un documento en la colección de prueba. Reemplace YOUR_DATABASE_NAME y YOUR_COLLECTION_NAME con la base de datos y la colección que ingresó al crear el desencadenador.
// Replace YOUR_DATABASE_NAME and YOUR_COLLECTION_NAME with the // database and collection that the Trigger watches. use YOUR_DATABASE_NAME db.YOUR_COLLECTION_NAME.insertOne({ tutorialTest: "atlas-trigger-s3", createdAt: new Date() })
Observe el valor insertedId de su resultado. La función utiliza este valor como nombre del objeto S3.
Confirma que el objeto existe en tu bucket S3.
En la consola de administración de AWS, abra su bucket S3 y navegue hasta el prefijo inserted-documents/. Aparecerá un objeto llamado <insertedId>.json, donde <insertedId> es el valor insertedId del paso anterior.
Nota
Si el objeto no aparece, revise los registros de ejecución del activador. Para saber cómo hacerlo, consulte Registros del activador.