如何在 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% 确定,但以下两个选项之一应该可以解决您的问题:
- 使用相对路径(
./logos/white.png
)
- 使用
LAMBDA_TASK_ROOT
环境变量:
let path = `${process.env.LAMBDA_TASK_ROOT}/logos/white.png`
另一种选择是将应用程序代码和图像等资产分开。该图像将进入 Lambda 层,您可以在 Lambdas 磁盘上的另一个目录中找到该层:
https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html#configuration-layers-path
我正在尝试编写一个在图像上添加水印的 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% 确定,但以下两个选项之一应该可以解决您的问题:
- 使用相对路径(
./logos/white.png
) - 使用
LAMBDA_TASK_ROOT
环境变量:
let path = `${process.env.LAMBDA_TASK_ROOT}/logos/white.png`
另一种选择是将应用程序代码和图像等资产分开。该图像将进入 Lambda 层,您可以在 Lambdas 磁盘上的另一个目录中找到该层:
https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html#configuration-layers-path