在本教程中,您将创建一个数据库触发器。将文档插入集合时,触发器会调用第三方API 。 Trigger 函数将官方 AWS 软件开发工具包 (SDK) 添加为外部依赖项。然后,该函数使用 SDK 将插入的文档作为扩展JSON对象写入S3 存储桶。
关于此任务
本教程中的 AWS S3示例说明了一种适用于任何具有 Node.js 库的第三方服务的模式:
在函数中导入包含
require()的包,并使用您存储的凭证进行调用。
开始之前
若要完成本教程,必须具备:
具有测试集合的Atlas 集群。要开始使用,请参阅创建Atlas无限或Atlas核心集群。
允许在存储桶的
inserted-documents/*前缀上使用s3:PutObject的 AWS IAM 策略。要学习;了解如何创建策略,请参阅 AWS 文档中的创建 IAM 策略。附加策略的 AWS IAM 用户。要学习;了解如何创建用户,请参阅 AWS 文档中的在您的 AWS 账户中创建 IAM 用户。
步骤
将 AWS 档案存储为值和密钥
创建以下值和密钥来存储您的 AWS凭证:
AwsAccessKeyId:包含 AWS访问权限密钥ID的值。AwsSecretAccessKeySecret:包含 AWS 秘密访问权限密钥的密钥。AwsSecretAccessKey:链接到密钥的值。这样,您就可以访问权限函数中的秘密访问权限密钥,同时仍将其作为密钥安全存储。
导航至“值”页面。
在 Atlas 中,前往 Triggers 页面。
如果尚未显示,请从导航栏上的 Organizations 菜单中选择包含项目的组织。
如果尚未显示,请从导航栏的 Projects 菜单中选择您的项目。
在侧边栏中,单击 Streaming Data 标题下的 Triggers。
会显示触发器页面。
单击 View All Apps 按钮。
单击要在其中创建触发器的应用。
在侧边栏中,单击 Build 标题下的 Values。
创建数据库触发器及其函数
创建一个数据库触发器,在插入文档时调用新函数。您可以添加 aws-sdk 依赖项,并以相同的形式定义函数代码。
导航到“触发器”页面。
在 Atlas 中,前往 Triggers 页面。
如果尚未显示,请从导航栏上的 Organizations 菜单中选择包含项目的组织。
如果尚未显示,请从导航栏的 Projects 菜单中选择您的项目。
在侧边栏中,单击 Streaming Data 标题下的 Triggers。
会显示触发器页面。
输入以下代码以定义函数。
将 YOUR_AWS_REGION 和 YOUR_S3_BUCKET_NAME 替换为您自己的 AWS 区域以及 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 };
每次插入文档时,该函数都会执行以下操作:
从变更事件的
fullDocument字段读取插入的文档。创建一个 S3客户端,使用存储在值中的 AWS凭证进行身份验证。
将文档作为
<_id>.json写入存储桶的inserted-documents/前缀。
注意
该函数使用文档的 _id 作为 S3对象键的一部分。如果您的文档使用 ObjectId 以外的 _id 类型,则密钥可能不是您所期望的。
测试触发器
将测试文档插入触发器监视的集合中。确认相应的扩展JSON对象出现在您的 S3 存储桶中的 inserted-documents/ 前缀下。
使用 mongosh 连接到您的集群。
将文档插入触发器监视的集合中。
以下示例将一个文档插入到测试集合中。将 YOUR_DATABASE_NAME 和 YOUR_COLLECTION_NAME 替换为您在创建触发器时输入的数据库和集合。
// 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() })
记下输出中的 insertedId 值。函数使用该值作为 S3对象的名称。