У меня есть лямбда-функция для загрузки изображений из корзины S3, получения метаданных, сохранения их в экземпляре AWS RDS и повторной загрузки изображения.Должно быть просто, но я боюсь, что одно из следующего вызывает проблемы.
- Иногда создает дубликаты
- Иногда пропускает файлы
Кажется, это происходит с большиминаборы изображений.Я загрузил менее 1000 активов, и это, кажется, работает достаточно хорошо.3000+ кажется ненадежным.Функция не установлена на тайм-аут слишком рано (30 секунд должно быть хорошо), она имеет хорошее распределение памяти 512 МБ (пожалуйста, скажите, если это ложные предположения. Я любитель в этом и новичок в 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 номеров файлов, и одно и то же число находится в целевом буфере и в моей таблице БД. Это не всегда так и сложнораспаковывать, где это идет не так. Я уверен, что есть более элегантный способ сделать это.