【问题标题】:How do I include an image (jpg) with a lambda function?如何包含带有 lambda 函数的图像 (jpg)?
【发布时间】:2022-02-15 12:29:48
【问题描述】:

我正在尝试编写一个在图像上添加水印的 lambda,然后将结果保存到 S3。我正在使用Sharp library 这样做。我正在使用Serverless Framework 进行部署。

我不确定如何在 lambda 中“包含”图像。我将为数百万张图像添加水印,因此我想避免每次都从 S3 中“读取”图像,我希望将其包含在 lambda 包中。

let overlayResp;
    try {
        const overlayImg = await Sharp(sourceImage.Body)
        .composite([{input: './logos/white.png', gravity: 'southeast' }])
        .toFormat('jpeg').toBuffer();
        overlayResp = await s3.putObject({
            Bucket: IMAGE_BUCKET,
            Body: overlayImg,
            Key: `${filename.replace('original', 'overlay')}`
        }).promise();

    } catch (err) {
        console.error('Overlay err :>> ', err);  //TODO: DLQ
    }

我尝试将图像包含在我的 processNewImage.js 文件夹旁边的“logos”文件夹中,如下所示:

使用上面的代码。提示“输入文件丢失”时出错。

我尝试导入图像const WHITE = require('/logos/white.png'); 并将复合行更改为.composite([{input: WHITE, gravity: 'southeast' }]),结果代码甚至无法运行(Cannot find module '/logos/white.png)。

感觉好像 lambda 包没有包含图像。如何包含它和/或引用它?

【问题讨论】:

    标签: javascript aws-lambda serverless-framework


    【解决方案1】:

    您使用的路径 (/logos/white.png) 是绝对路径,这意味着您的代码在错误的位置“寻找”。

    我不是 100% 确定,但以下两个选项之一应该可以解决您的问题:

    1. 使用相对路径 (./logos/white.png)
    2. 使用LAMBDA_TASK_ROOT 环境变量:
    let path = `${process.env.LAMBDA_TASK_ROOT}/logos/white.png`
    

    文档:https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html#configuration-envvars-runtime

    另一种选择是将应用程序代码和图片等资产分开。该图像将进入一个 Lambda 层,您可以在 Lambdas 磁盘上的另一个目录中找到该层:

    https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html#configuration-layers-path

    【讨论】:

    • 问题归结为无服务器,包括项目的整个文件夹结构......它不是 ./logos ......它是 ./lambdas/processNewImage/logos ......谢谢!
    猜你喜欢
    • 2017-11-02
    • 2020-12-24
    • 2018-04-02
    • 1970-01-01
    • 2020-07-07
    • 2021-12-10
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    相关资源
    最近更新 更多