Ничего внутри обратного вызова getObject API S3 не выполняется в функции Lambda - PullRequest
0 голосов
/ 16 октября 2018

У меня проблема с тем, что я не могу прочитать свой файл с S3 ... или даже попасть внутрь обратного вызова S3.Я использую узел 8.10 для своей лямбды, и я проверил, что все работает, пока я не попытаюсь проникнуть внутрь getObject - console.log ниже даже не будет работать.Здесь что-то выглядит косо?Я предоставил полный доступ к лямбде и S3, поэтому не думаю, что это проблема.

const AWS = require('aws-sdk')

exports.handler = async (event, context, callback) => {

    const s3options = {
        accessKeyId: process.env.AWS_KEY,
        secretAccessKey: process.env.AWS_SECRET,
        apiVersion: '2006-03-01',
    }   

    const params = {
        Bucket: event.Records[0].s3.bucket.name,
        Key: event.Records[0].s3.object.key,
    }

    const s3 = new AWS.S3(s3options)    

    s3.getObject(params, (err, data) => {
        // callback(null, data.Body.toString('utf-8'))

        console.log('I am here!')
    })

}

1 Ответ

0 голосов
/ 17 октября 2018

Если вы пытаетесь использовать async / await функцию Node v8.x, тогда вы должны заключить код в try / catch block и использоватьобещание (я имею в виду, что нет необходимости переносить код функции, но вы все равно должны реализовать блок try / catch внутри своего приложения).

Примечание: AWS-SDK уже обещан, означает, что вы наделены не может обещать методы AWS-SDK или использовать обратные вызовы.Просто добавьте .promise () к вашему методу как хвост и добавьте ключевое слово await в качестве префикса к методу, который вы пытаетесь вызвать.

Пример:

До:

s3.getObject(params, (err, data) => {
        // callback(null, data.Body.toString('utf-8'))

После:

try 
{
    const s3Response = await s3.getObject(params).promise();

    // if succeed 
    // handle response here
}
catch (ex) 
{
    // if failed
    // handle response here (obv: ex object)
    // you can simply use logging
    console.error(ex);
}

Тогда ваш код должен выглядеть так:

// it's really cool to use ES6 syntax to import modules: import * as AWS from 'aws-sdk';
// btw, you don't have to import AWS-SDK inside the handler file

// const AWS = require('aws-sdk')

exports.handler = async (event) => {

    const s3options = 
    {
        accessKeyId: process.env.AWS_KEY,
        secretAccessKey: process.env.AWS_SECRET,
        apiVersion: '2006-03-01',
        // do not forget include a region (e.g. { region: 'us-west-1' })
    }   

    const params = 
    {
        Bucket: event.Records[0].s3.bucket.name,
        Key: event.Records[0].s3.object.key,
    }

    const s3 = new AWS.S3(s3options)    

    try 
    {
        const s3Response = await s3.getObject(params).promise();

        // if succeed 
        // handle response here
    }
    catch (ex) 
    {
        // if failed
        // handle response here (obv: ex object)
        // you can simply use logging
        console.error(ex);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...