nodeJS S3.getObject () тайм-аут (есть ли лучшие варианты для изображений?) В Lambda - PullRequest
0 голосов
/ 03 апреля 2020

Так что я храню и получаю доступ к изображениям в Amazon S3. Мой код (nodeJS в лямбда-выражении) для доступа к изображениям ниже ...

//...Other unerelated Code
    var s3Params = {
        "Bucket": "example-bucket",
        "Key": "example-image-key"
    };
    try{
            //some unrelated code getting item from DynamoDB
            image : await s3.getObject(s3Params).promise()


    }catch(err)
    {
        //Handling
    }

Так что это прекрасно работает ... для небольших изображений (почти 39,3 КБ почти мгновенно), но время ожидания для большего изображения (3,1 МБ будет отключено через 20 секунд).

Есть ли лучший способ сделать это? Или я просто ожидал, что это займет больше времени и увеличит время ожидания?

Редактировать: Полный код ниже

const AWS = require('aws-sdk');
exports.handler = async (event) => {
AWS.config.update({region: 'ap-southeast-2'});
const db = new AWS.DynamoDB.DocumentClient;
const s3 = new AWS.S3();
let itemParamters = {
Key: {
    name: event.name,
},
TableName: 'records'
};
var s3Params = {
    "Bucket": "Example-BucketName",
    "Key": "Example key" + event.name + ".jpg"
};
var msg;
var code;


try{
    code = 200;
    msg ={
        item : await db.get(itemParamters).promise(),
        image : await s3.getObject(s3Params).promise()
    };

}catch(err)
{
    code = 500;
    msg = "Error: " + err;
}

var response = {
    headers: {
        "Access-Control-Allow-Origin" :"*"
    },
    statusCode: code,
    body: msg
};

return response;

};

РЕДАКТИРОВАТЬ 2:

После дальнейшего тестирования тайм-аут кажется произойти во время настройки ответа, в частности, изображения.

1 Ответ

0 голосов
/ 05 апреля 2020

Так что это потому, что вы пытаетесь вернуть объект, возвращенный из S3 через JSON, который включает в себя данные буфера. Чем больше изображение, тем больше данных будет. Вот почему вы увидите тайм-аут.

Пример объекта, возвращенного из вызова на .getObject()

{
 AcceptRanges: 'bytes',
 LastModified: 2020-04-05T13:52:07.000Z,
 ContentLength: 78392,
 ETag: '"d009e410*****"',
 ContentType: 'image/jpeg',
 Metadata: {},
 Body: <Buffer ff d8 ff e0 00 10 ... 124764 more bytes>
}

Если вы пытались получить га sh только из Для сравнения вы можете сделать что-то вроде:

const AWS = require('aws-sdk')

const s3 = new AWS.S3()

exports.handler = async () => {
    const s3Params = {
        Bucket: 'bucket',
        Key: 'test.jpg',
    }

    const { ETag } = await s3.getObject(s3Params).promise()

    return {
        headers: {
            'Access-Control-Allow-Origin': '*',
        },
        statusCode: 200,
        hash: ETag,
    }
}

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

http://docs.aws.amazon.com/apigateway/latest/developerguide/integrating-api-with-aws-services-s3.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...