Обработка ошибок бессерверного обработчика изображений AWS

#amazon-web-services #amazon-s3 #aws-lambda

#amazon-веб-сервисы #amazon-s3 #aws-lambda

Вопрос:

Я использую последнюю версию формирования стека бессерверного обработчика изображений AWS, согласно документации, AWS Lambda имеет ограничение в 6 МБ для полезной нагрузки запросов и ответов. Мои изображения уже хранятся в корзине S3, я хотел бы изменить обработчик изображений таким образом, чтобы в случае возникновения какой-либо ошибки в процессе преобразования возвращался URL-адрес объекта, хранящегося в исходной корзине S3, то есть URL-адрес объекта для исходного неотредактированного объекта. Каков наилучший способ сделать это?

Комментарии:

1. Прежде чем на этот вопрос можно будет ответить, вам, вероятно, потребуется добавить пример кода того, что у вас есть прямо сейчас, а также того, что вы уже пробовали, и любых ошибок, которые вы не можете устранить. Я отметил это для получения дополнительной информации.

2. Я использую конфигурацию стека бессерверного обработчика изображений AWS по умолчанию

Ответ №1:

Итак, согласно документации, в шаблоне есть три переменных

EnableDefaultFallbackImage, FallbackImageS3Bucket и FallbackImageS3Key. Перед включением этой функции, если вы используете политику корзины Amazon S3 в корзине резервных изображений Amazon S3, необходимо отредактировать политику корзины, чтобы разрешить CustomResourceFunction и ImageHandlerFunction AWS Lambda-функции получать объект резервного изображения по умолчанию.

В соответствующем коде вы можете использовать корзину исходного кода, в которую загружаются объекты, и с ключом, который вы пытаетесь изменить.

в частности, эта часть кода

         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);
        }
    }
 

Комментарии:

1. Не произойдет ли сбой в случае, если размер исходного изображения превышает 6 МБ, что приведет к повторному возникновению того же исключения?

2. вам не нужно возвращать сам объект, вы можете вернуть одноразовый URL -адрес. Я хочу поделиться приведенной выше информацией о том, что это достижимо без особых усилий. Поскольку размер ответа на лямбда-запрос не допускает больших объектов.

Ответ №2:

2 вещи, которые я бы сделал:

  1. добавьте сжатие изображения, чтобы уменьшить это внутри вложенного resize объекта compressionLevel: 9 (9 — это максимум, и в настоящее время мы видим, что изображения уменьшаются с 20 МБ до 3 МБ или около того)
  2. совместно передайте подписанный URL-адрес клиенту, получите обработчик ошибок и отобразите его на своем месте при ошибке