node.js - Lambda 随机丢失文件,在 S3 中创建欺骗
问题描述
我有一个 lambda 函数来从 S3 存储桶中摄取图像,获取一些元数据,将其存储到 AWS RDS 实例,然后重新上传图像。应该很简单,但我担心以下其中一项会导致问题。
- 有时会创建重复项
- 有时会丢失文件
这似乎发生在更大的图像集上。我上传了不到 1000 个资产,它似乎运作良好。3000+似乎不靠谱。该函数未设置为过早超时(30 秒应该没问题)它具有良好的内存分配 512MB(如果这些假设是错误的,请告诉我。我是这方面的业余爱好者,也是 Lambda 的新手,所以请告诉我你认为我做了什么。
const AWS = require('aws-sdk')
const uuidv4 = require('uuid/v4');
AWS.config.update({
accessKeyId: 'XXX',
secretAccessKey: 'XXX'
})
const s3 = new AWS.S3({
signatureVersion: 'v4',
region: 'eu-west-2'
})
const hasha = require('hasha')
const { Pool, Client } = require('pg')
const pool = new Pool({
user: 'XXX',
host: 'XXX',
database: 'XXX',
password: 'XXX',
port: 5432,
})
exports.handler = async (event, context) => {
const bucket = event.Records[0].s3.bucket.name;
const key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
console.log("Processing: " + key)
//Get file
try {
const file = await s3.getObject({
Bucket: bucket,
Key: key
}).promise()
const hash = await hasha(file.Body, { algorithm: 'md5' })
const id = uuidv4()
newfile = await s3.putObject({
Bucket: 'XXX',
Key: id,
Body: file.Body,
ContentType: file.ContentType
}).promise()
var fileString = key.split('/')
var fileName = fileString[fileString.length - 1]
const text = 'INSERT INTO original(original_filename, mime, file_size, file_path, file_name, hash) VALUES($1, $2, $3, $4, $5, $6) RETURNING *'
const values = [fileName, file.ContentType, file.ContentLength, key, id, hash]
const res = await pool.query(text, values)
console.log(res.rows[0])
return "Done"
} catch (err) {
console.log("####### Error #######: ", err)
return "Error"
}
}
我期望上传 X 个文件,并且相同数量的文件在目标存储桶和我的数据库表中。情况并非总是如此,并且很难找出出错的地方。我相信有一种更优雅的方法可以做到这一点。
解决方案
推荐阅读
- sql-server - 如何使用列的值对我的存储过程进行多次调用?
- java - 将 JSONObject 放入 JSONArray
- php - 如何知道与 PHP Zend 框架版本一起使用的合适的 PHP 版本?
- bash - 如何使用脚本对包含名称的文件进行排序?
- java - 关于反转 JAVA 单词顺序的基本 Java 编码问题
- java - java程序下载工件并进行比较
- javascript - 如何在 javascript 中创建具有多个用户的动态 memoize 函数
- laravel - 3张表的雄辩关系
- opencv - 查找轮廓在模拟图像上发现太多轮廓
- ios - 如何创建免费的苹果开发者帐户以创建 ips 文件而无需在 swift 中配置配置文件