AWS Lambda с использованием функции s3 getObject ничего не происходит - PullRequest
0 голосов
/ 07 декабря 2018

Это код node.js с использованием встроенного редактора:

const AWS = require('aws-sdk');
const s3 = new AWS.S3();

console.log('Loading function');

exports.handler = async (event) => {
    // TODO implement
    var responseMsg = '';
    var bucket = '';
    var key = '';
    if ('Records' in event) {
        var s3Data = event.Records[0].s3;
        console.log('s3Data: ' + JSON.stringify(s3Data));
        bucket = s3Data.bucket.name;
        key = s3Data.object.key;
    }
    console.log('Bucket:' + bucket);
    console.log('Key:' + key);
    var params = { 
        Bucket: bucket,
        Key: key
    };
    console.log('Params:' + JSON.stringify(params));
    s3.getObject(params, function (err, data) {
       console.log('getObject');
       if (err) {
           console.log(err, err.stack);
           return err;
       } 
       responseMsg = data;
    });
    const response = {
        statusCode: 200,
        body: JSON.stringify(responseMsg),
    };
    return response;
};

Я знаю, что ключ и корзина, с которыми я тестирую, существуют в моей консоли S3.Я знаю, что могу получить к ним доступ, используя C # в LINQPad.

Когда я запускаю это, я не получаю никаких ошибок.Я получаю пустую строку в теле ответа, а не содержимое объекта.Я также не получаю никаких сообщений журнала изнутри s3.getObject.

1 Ответ

0 голосов
/ 07 декабря 2018

Вызов s3.getObject является асинхронным вызовом.Выполнение кода продолжается, пока выполняется код s3.Вам необходимо явно await, чтобы обещание вызова разрешилось.

Вот как вы это сделаете (обратите внимание на изменение в вызове s3.getObject):

const AWS = require('aws-sdk');
const s3 = new AWS.S3();

exports.handler = async (event) => {
    var params = { 
        Bucket: <bucket>,
        Key: <key>,
    };

    const data = await s3.getObject(params).promise();

    const response = {
        statusCode: 200,
        body: JSON.stringify(data),
    };
    return response;
};

Вы можетеиспользуйте блок try/catch для обработки ошибок.

Здесь важно понять время выполнения.Основной код в вашей функции вызывается последовательно, когда вызывается лямбда.Функция обратного вызова, которую вы передаете в вызов s3.getObject, вызывается, когда приходит ответ от S3, спустя долгое время после того, как ваша лямбда закончила свое выполнение.

Ваш вызов return выполняется до выполнения обратного вызова, и поэтому вы видите результат JSON.strigify(responseMsg), где responseMsg содержит начальное значение, которое вы ему дали, то есть пустую строку ''.

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