【发布时间】:2019-07-24 01:27:14
【问题描述】:
我正在尝试运行一个 lambda,每次将一个对象放入我的 S3 存储桶时,它都会将元数据插入我的数据库。
因为我使用的是 MongoDB,所以我有代码可以在调用之间保持数据库连接。我遇到的问题是我无法获取元数据。
所有插入数据库的代码都已完成,我只需要帮助从 aws lambda 获取元数据。
这是我的代码(主要是从 MongoDB site 复制而来)
"use strict";
const MongoClient = require('mongodb').MongoClient;
const MONGODB_URI = 'mongodb://cam_writer:1%40kGM%26LL%26gA5y7NVk1cvl9@cluster0-shard-00-00-hlygq.mongodb.net:27017,cluster0-shard-00-01-hlygq.mongodb.net:27017,cluster0-shard-00-02-hlygq.mongodb.net:27017/test?ssl=true&replicaSet=Cluster0-shard-0&authSource=admin&retryWrites=true'; // or Atlas connection string
var AWS = require('aws-sdk')
var s3 = AWS.S3()
let cachedDb = null;
function connectToDatabase (uri) {
console.log('=> connect to database');
if (cachedDb) {
console.log('=> using cached database instance');
return Promise.resolve(cachedDb);
}
return MongoClient.connect(uri)
.then(client => {
cachedDb = client.db('events');
return cachedDb;
});
}
function queryDatabase (db) {
console.log('=> query database');
return db.collection('detection_events').find({}).toArray()
.then(() => { return { statusCode: 200, body: 'success' }; })
.catch(err => {
console.log('=> an error occurred: ', err);
return { statusCode: 500, body: 'error' };
});
}
function insertIntoDb (db, obj) {
console.log('=> inserting data into db');
return db.collection('detection_events').insertOne(obj)
}
module.exports.handler = (event, context, callback) => {
context.callbackWaitsForEmptyEventLoop = false;
console.log(event)
var meta = {test : "test", "key": event}; // HOW DO I GET THE ACTUAL METADATA FOR THE EVENT?
console.log('event: ', event);
connectToDatabase(MONGODB_URI)
.then(db => insertIntoDb(db, meta))
.then(result => {
console.log('=> returning result: ', result);
callback(null, result);
})
.catch(err => {
console.log('=> an error occurred: ', err);
callback(err);
});
};
我知道 s3 传递给 lambda 的“事件”不包含元数据。在 python 中,我能够通过使用 boto3 来获取元数据,我只是不知道如何在 node.js 中执行它,(更不用说 aws lambda 中的 node.js)
编辑:
所以我根据下面的第一个答案更新了我的代码。现在的代码是:
"use strict";
const MongoClient = require('mongodb').MongoClient;
const MONGODB_URI = 'mongodb://cam_writer:1%40kGM%26LL%26gA5y7NVk1cvl9@cluster0-shard-00-00-hlygq.mongodb.net:27017,cluster0-shard-00-01-hlygq.mongodb.net:27017,cluster0-shard-00-02-hlygq.mongodb.net:27017/test?ssl=true&replicaSet=Cluster0-shard-0&authSource=admin&retryWrites=true'; // or Atlas connection string
const AWS = require('aws-sdk')
const s3 = new AWS.S3()
let cachedDb = null;
const connectToDatabase = uri => {
console.log('=> connect to database');
if (cachedDb) {
console.log('=> using cached database instance');
return Promise.resolve(cachedDb);
}
return MongoClient.connect(uri)
.then(client => {
cachedDb = client.db('events');
return Promise.resolve(cachedDb);
});
}
function insertIntoDb(db, obj) {
console.log('=> inserting data into db');
return db.collection('detection_events').insertOne(obj)
}
module.exports.handler = async (event) => {
const db = await connectToDatabase(MONGODB_URI);
//finally get the HEAD for the s3Object
const head = await s3.headObject({
Bucket: event.Records[0].s3.bucket.name,
Key: event.Records[0].s3.object.key
}).promise();
var meta = head['Metadata']
meta['bucket'] = event.Records[0].s3.bucket.name,
meta['key'] = event.Records[0].s3.object.key
console.log(meta)
const result = await insertIntoDb(db, meta)
console.log(result)
return {
statusCode: 201,
body: JSON.stringify(result)
}
};
我运行了我的代码,它将一堆图像插入到 s3 中。这在 mongodb 中生成了大约 25 个连接,我怎样才能使 lambda 的连接保持在低水平?我认为从 mongoDB 网站复制的代码可以让我这样做
【问题讨论】:
标签: node.js amazon-s3 aws-lambda