Neste tutorial, você cria um gatilho de banco de dados (trigger). O trigger chama uma API de terceiros quando um documento é inserido em uma coleção. A função do trigger adiciona o AWS Software Development Kit (SDK) oficial como uma dependência externa. Em seguida, a função usa o SDK para gravar o documento inserido em um bucket S3 como um objeto JSON estendido.
Sobre esta tarefa
O exemplo do AWS S3 neste tutorial ilustra um padrão que se aplica a qualquer serviço de terceiros que tenha uma biblioteca Node.js :
Adicione o pacote npm do serviço como dependência externa.
Armazene quaisquer credenciais necessárias como segredos e referencie-as a partir de valores em sua função.
Importe o pacote com
require()para dentro da sua função e chame-o usando as credenciais que armazenou.
Antes de começar
Para concluir este tutorial, você deve ter:
Um Atlas cluster com uma coleção de teste. Para começar, consulte Criar um Atlas Infinite ou Atlas Core Cluster.
Um bucket do AWS S3. Para saber como criar um, consulte Criar um bucket de uso geral na documentação da AWS. Observe o seguinte para uso posterior:
O nome completo do bucket
A região da AWS
Uma política do AWS IAM que permite
s3:PutObjectno prefixoinserted-documents/*do seu bucket. Para saber como criar uma, consulte Criar políticas do IAM na documentação da AWS.Um usuário do AWS IAM com a política anexada. Para saber como criar um, consulte Criar um usuário IAM em sua conta do AWS na documentação do AWS.
Uma chave de acesso e uma chave de acesso secreta para o usuário do IAM. Para saber como criá-las, consulte Criar chaves de acesso na documentação do AWS.
Passos
Armazene suas credenciais AWS como valores e segredos
Crie os seguintes Valores e Segredos para armazenar suas credenciais da AWS:
AwsAccessKeyId: Valor que contém seu ID de chave de acesso AWS.AwsSecretAccessKeySecret: Segredo que contém sua chave de acesso secreto AWS.AwsSecretAccessKey: valor vinculado ao segredo. Isso permite que você acesse a chave de acesso secreta em sua função, mantendo-a armazenada com segurança como um segredo.
Navegue até a página Valores.
No Atlas, acesse a página Triggers.
Se ainda não tiver sido exibido, selecione a organização que contém seu projeto no menu Organizations na barra de navegação.
Se ainda não estiver exibido, selecione seu projeto no menu Projects na barra de navegação.
Na barra lateral, clique em Triggers sob o título Streaming Data.
A página Acionadores é exibida.
Clique no botão View All Apps.
Clique na aplicação em que você deseja criar o Trigger.
Na barra lateral, clique em Values sob o título Build.
Armazene o ID da chave de acesso.
Clique em Create a Value.
Insira
AwsAccessKeyIdcomo Value Name.Selecione o tipo Value.
Selecione a opção Custom Content e insira seu ID de chave de acesso AWS.
Observação
Você deve inserir o ID da chave de acesso como um valor de string com aspas (
"<accessKeyId>").Clique em Save Draft.
Armazene a chave de acesso secreta.
Observação
Os valores secretos não podem ser acessados diretamente, então você deve criar um segundo valor que se vincule ao segredo.
Clique em Create a Value.
Insira
AwsSecretAccessKeycomo Value Name.Selecione o tipo Value.
Selecione a opção Link to Secret.
Insira
AwsSecretAccessKeySecrete clique em Create "AwsSecretAccessKeySecret" para nomear o segredo.Cole sua chave de acesso secreto AWS no campo que aparece abaixo do nome secreto.
Clique em Save Draft para criar o segredo e o valor.
Criar o gatilho de banco de dados e sua função
Crie um gatilho de banco de dados que chame uma nova função quando um documento for inserido. Você adiciona a dependência aws-sdk e define o código de função no mesmo formulário.
Navegue até a página Triggers.
No Atlas, acesse a página Triggers.
Se ainda não tiver sido exibido, selecione a organização que contém seu projeto no menu Organizations na barra de navegação.
Se ainda não estiver exibido, selecione seu projeto no menu Projects na barra de navegação.
Na barra lateral, clique em Triggers sob o título Streaming Data.
A página Acionadores é exibida.
Crie o gatilho.
Clique em Add Trigger para abrir a página de configuração do trigger.
Selecione o tipo de trigger Database e, em seguida, configure o trigger usando os seguintes valores:
ContextoValorTrigger NameWriteDocumentToS3TriggerWatch AgainstCollectionCluster NameNome do cluster de teste
Database NameNome do seu banco de dados de teste
Collection NameNome da sua collection de teste
Operation TypeSelecione apenas
Insert.Event TypeFunctionNa seção Function, selecione + New Function.
Insira o seguinte código para definir a função.
Substitua YOUR_AWS_REGION e YOUR_S3_BUCKET_NAME pela sua região da AWS e pelo nome completo do bucket do Console de gerenciamento da 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 um documento é inserido, a função faz o seguinte:
Lê o documento inserido do campo
fullDocumentdo evento de alteração.Cria um cliente S3 que se autentica com as credenciais da AWS armazenadas em seus Valores.
Grava o documento no prefixo
inserted-documents/do seu bucket como<_id>.json.
Observação
A função usa o _id do documento como parte da chave do objeto S3. Se seus documentos usarem um tipo _id diferente de ObjectId, a chave poderá não ser o que você espera.
Teste o gatilho
Insira um documento de teste na coleção que o Trigger observa. Confirme que um objeto JSON estendido correspondente aparece no seu bucket S3 sob o prefixo inserted-documents/.
Conecte-se ao seu cluster com mongosh.
Para saber como, consulte Conectar-se a um cluster via mongosh.
Insira um documento na coleção que o Trigger observa.
O exemplo a seguir insere um documento na collection de teste. Substitua YOUR_DATABASE_NAME e YOUR_COLLECTION_NAME pelo banco de dados e pela coleção que você inseriu quando criou o Trigger.
// 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 o valor insertedId da sua saída. A função usa esse valor como nome do objeto S3 .
Confirme que o objeto existe no seu bucket S3.
No Console de gerenciamento da AWS, abra seu bucket S3 e navegue até o prefixo inserted-documents/. Um objeto chamado <insertedId>.json é exibido, onde <insertedId> é o valor insertedId da etapa anterior.
Observação
Se o objeto não aparecer, revise os registros de execução do gatilho. Para saber como, consulte Trigger logs.