Я использую функцию lambda @ edge для изменения размера изображений на лету. это работает довольно хорошо - за исключением случаев вызова этой функции, например, 5x в то же время. тогда поиск изображения на s3 занимает ~ 4 секунды. поскольку функции лямбда @ ребра имеют только макс. тайм-аут 5 с, у меня осталось только 1 с, что слишком мало для обработки изображения.
Итак, я спрашивал себя, почему предел ооочень низкий на 5 с?
Может быть, я могу оптимизировать поиск по s3 для изображения, которое занимает 4 секунды при многократном вызове функции (когда вызывается только для 1 изображения, это действительно быстро при 200 мс).
поиск s3:
export async function s3ObjectExists(Key: string, Bucket = BucketFiles) {
try {
await s3HeadObject(Key, Bucket);
} catch (e) {
if (e && e.code === 'NotFound') {
return false;
}
throw new Error(e);
}
return true;
}
весь код функции lambda @ edge (упрощенно):
exports.handler = async (e) => {
const { request, response } = e.Records[0].cf;
const q = getQuery(request.querystring);
const { uri } = request;
const match = uri.match(/^\/((.+)\.(png|jpg|jpeg))/i);
const key = match[1];
const keyWithoutExt = match[2];
const keyExt = match[3] as 'jpg' | 'png';
const ext = q.format === 'webp' ? 'webp' : keyExt.toLowerCase();
const newKey = getKey(`${keyWithoutExt}${JSON.stringify(q)}.${keyExt}`);
if (await s3ObjectExists(newKey, bucketTmp)) {
const file = await s3GetObject(newKey, bucketTmp);
response.body = file.Body.toString('base64');
} else {
const file = await s3GetObject(key, bucket);
let sharpConfig = sharp(file.Body as Buffer);
if (q.width || q.height) {
sharpConfig = sharpConfig.resize(q.width, q.height, {
withoutEnlargement: true
});
}
const buffer = await sharpConfig.toBuffer();
await s3PutObject(bucketTmp, newKey, buffer, {
CacheControl: 'max-age=31536000',
Tagging: 'ImageCache=true'
});
response.body = buffer.toString('base64');
}
response.status = 200;
response.bodyEncoding = 'base64';
response.headers['content-type'] = [
{
key: 'Content-Type',
value: 'image/' + ext === 'jpg' ? 'jpeg' : ext
}
];
return response;
};