Лямбда случайным образом пропускает файлы, создаю дупы в S3 - PullRequest
1 голос
/ 20 апреля 2019

У меня есть лямбда-функция для загрузки изображений из корзины 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 номеров файлов, и одно и то же число находится в целевом буфере и в моей таблице БД. Это не всегда так и сложнораспаковывать, где это идет не так. Я уверен, что есть более элегантный способ сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...