【问题标题】:Fetch multiple files and write to AWS S3 with nodejs Lambda function使用 nodejs Lambda 函数获取多个文件并写入 AWS S3
【发布时间】:2023-01-24 23:05:06
【问题描述】:

我有一组从 SQS 消息中获取的图像 url。我需要下载图像并将它们存储在 S3 存储桶中。如果下载或存储图像失败,我需要捕获错误,以便将图像推送到另一个 SQS 队列以便稍后重试。

到目前为止,我确实下载并存储了图像,但我不知道如何访问 fetch 和 putObject 函数的结果。此外,我不确定我是否以正确的方式进行此操作,或者是否有更有效/更好/优雅的方式来执行此操作。

这就是我现在所拥有的

const AWS = require("aws-sdk");
const fetch = require("node-fetch")
const s3 = new AWS.S3();

exports.handler = function(event, context) {

    // SQS may invoke with multiple messages
    for (const message of event.Records) {
        const bodyData = JSON.parse(message.body);
        const bucket = 'my_images_bucket';
        const images = bodyData.images;

        let urls = [];

        for (const image of images) {
            urls.push(image);
        }

        let promises = urls.map(image => {
            fetch(image)
                .then((response) => {
                    if (!response.ok) {
                        throw new Error('An error occurred while fetching ' + image + ': ' + response.statusText);
                    }
                    return response;
                })
                .then(async res => {
                    try {
                        const buffer = await res.buffer();

                        console.log(image);

                        // store
                        return s3.putObject(
                            {
                                Bucket: bucket,
                                Key: image,
                                Body: buffer,
                                ContentType: "image/jpeg"
                            }
                        ).promise();

                    } catch (e) {
                        console.log('An error occurred while storing image ' + image + ': ' + e);
                    }
                })
                .catch((error) => {
                    console.error(error);
                });
        });

        Promise.all(promises)
            .then(d => {
                console.log('All images downloaded.');
                console.log('PromiseAll result: ' + d);
            }).catch(e => {
            console.log('Whoops something went wrong!', e);
        });
    }
}

我从中得到的输出:

INFO All images downloaded.
INFO PromiseAll result: ,,,,
INFO https://myserver/10658272812/image14.jpg
INFO https://myserver/10658272810/image12.jpg
INFO https://myserver/10658272804/image6.jpg
INFO https://myserver/10658272813/image15.jpg
INFO https://myserver/10658272816/image18.jpg 

【问题讨论】:

    标签: node.js amazon-s3 aws-lambda promise


    【解决方案1】:

    我附上我为类似问题编写的代码。

         const s3Put = (filename, data, mime, s3Params = {}) => {
            return new Promise((resolve, reject) => {
                s3.putObject({
                    Bucket: bucket,
                    Key: filename,
                    Body: data,
                    ContentType: 
                    ...s3Params
                }, (err, data) => {
                    if (err) {
                        return reject(err);
                    }
                    return resolve(data);
                });
            });
        };
    
        let filePromise = s3Put(to, content, fileMime, s3Params)
                        .then(() => console.log("MyCode"))
                        .catch(err => {
                            const error = {
                                message: `S3: ${(err.pri && err.pri.message) || (err.internal && err.internal.message)}`,
                                to
                            };
                            errors.push(error);
                            return onError(error);
                        });
    

    【讨论】:

      猜你喜欢
      • 2017-03-04
      • 2019-07-06
      • 2018-03-13
      • 1970-01-01
      • 2020-08-20
      • 2023-03-11
      • 2015-08-19
      • 2018-08-03
      • 1970-01-01
      相关资源
      最近更新 更多