#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 вещи, которые я бы сделал:
- добавьте сжатие изображения, чтобы уменьшить это внутри вложенного
resize
объектаcompressionLevel: 9
(9 — это максимум, и в настоящее время мы видим, что изображения уменьшаются с 20 МБ до 3 МБ или около того) - совместно передайте подписанный URL-адрес клиенту, получите обработчик ошибок и отобразите его на своем месте при ошибке