лямбда @ край тайм-аут и обработка изображений s3 - PullRequest
1 голос
/ 28 октября 2019

Я использую функцию 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;
};

1 Ответ

0 голосов
/ 28 октября 2019

Хорошо, я только что узнал, что у origin response может быть время ожидания до 30 с . Так что я могу увеличить его.

...