【问题标题】:AWS Serverless Image Handler Error HandlingAWS 无服务器图像处理程序错误处理
【发布时间】:2021-04-07 09:35:33
【问题描述】:

我正在使用最新版本的 AWS 无服务器图像处理程序堆栈形成,根据 documentation AWS Lambda 的请求和响应负载限制为 6MB。我的图片已经存储在 S3 存储桶上,我想修改 Image Handler,如果在转换过程中出现任何错误,则返回存储在原始 S3 存储桶上的对象的 URL,即对象 URL对于原始未编辑的对象。解决此问题的最佳方法是什么?

【问题讨论】:

  • 在回答这个问题之前,您可能需要添加一个代码示例,说明您现在拥有的内容以及您已经尝试过的内容以及您无法解决的任何错误。我已对此进行了标记以获取更多信息。
  • 我使用的是AWS Serverless Image Handler stack的默认配置

标签: amazon-web-services amazon-s3 aws-lambda


【解决方案1】:

所以根据documentation,模板有三个变量

EnableDefaultFallbackImage、FallbackImageS3Bucket 和 FallbackImageS3Key。在启用此功能之前,如果您在备用图像 Amazon S3 存储桶中使用 Amazon S3 存储桶策略,则必须编辑存储桶策略以允许 CustomResourceFunction 和 ImageHandlerFunction AWS Lambda 函数获取默认的备用图像对象。

在相应的code 中,您可以使用上传对象的原始源存储桶以及您尝试修改的密钥。

特别是这部分代码

        try {
        data = await s3.headObject({ Bucket: bucket, Key: key }).promise();
        break;
    } catch (error) {
        if (retry === retryCount || !['AccessDenied', 'Forbidden'].includes(error.code)) {
            console.error(`Either the object does not exist or you don't have permission to access the object: ${bucket}/${key}`);
            throw {
                code: 'FallbackImageError',
                message: `Either the object does not exist or you don't have permission to access the object: ${bucket}/${key}`
            };
        } else {
            console.log('Waiting for retry...');
            await sleep(retry);
        }
    }

【讨论】:

  • 如果源图像大于6MB,这不会失败,再次给出相同的异常吗?
  • 你不必返回对象本身,你可以返回一个one time url。我分享上述信息的观点是,无需太多工作即可实现。因为lambda request response size 不允许更大的对象。
【解决方案2】:

我会做的两件事:

  1. 在嵌套的 resize 对象 compressionLevel: 9 中添加图像压缩以缓解这种情况(最大为 9,我们目前看到图像从 20mb 下降到 3mb 左右)
  2. 将签名的 url 一起传递给客户端,并使用错误处理程序并将其呈现在错误的位置

【讨论】:

    猜你喜欢
    • 2019-12-03
    • 2019-05-28
    • 2020-03-30
    • 2020-11-07
    • 2018-01-09
    • 2010-09-13
    • 2023-04-07
    • 1970-01-01
    • 2011-02-04
    相关资源
    最近更新 更多