如何在 lambda 函数中包含图像 (jpg)?

How do I include an image (jpg) with a lambda function?

我正在尝试编写一个在图像上添加水印的 lambda,然后将结果保存到 S3。我正在使用 Sharp library to do so. I'm deploying with Serverless Framework.

我不确定如何 'include' 使用 lambda 的图像。我将为数百万张图片添加水印,因此我想避免每次都必须 'read' 来自 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
    }

我试过将图像包含在 'logos' 文件夹中,连同我的 processNewImage.js 文件夹,如下所示:

使用上面的代码。它错误地说 'Input file is missing'.

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

感觉好像lambda包没有包含图片。如何包含它 and/or 引用它?

您使用的路径 (/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