首页 > 解决方案 > 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 个文件,并且相同数量的文件在目标存储桶和我的数据库表中。情况并非总是如此,并且很难找出出错的地方。我相信有一种更优雅的方法可以做到这一点。

标签: node.jsaws-lambda

解决方案


推荐阅读