AWS Лямбда nodeJS раз, не могу понять, почему. Логи бесполезны - PullRequest
0 голосов
/ 10 апреля 2020

Вот моя скромная функция NodeJS, которая отключается через 5 минут. Журналы CloudWatch не дают мне никакой информации о том, что произошло, только время ожидания истекло.

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

exports.handler = async (event, context, callback) => {
    const srcBucket = event.Records[0].s3.bucket.name;
    const srcKey = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " "));

    const params = {
        Bucket: srcBucket,
        Key: srcKey
    };
    console.log(params)
    var data = await s3.getObject(params).promise();
    console.log(data)

};

Execution Env Node 12, время ожидания 5 минут. Я проверил правильность ввода триггера s3 и то, что код работает в моей локальной nodeJS среде.

В роли выполнения я добавил практически все, кроме кухонной раковины - AmazonRDSFullAccess AmazonS3FullAccess CloudWatchLogsFullAccess AmazonRDSDataFullAccess AmazonVPCFullAccess AWSLambdaExecuVase * AWSLambdaExecuCAP AWS управляемая политика

любая помощь очень ценится, сходит с ума в этой точке.

1 Ответ

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

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

exports.handler = async (event) => {

  try {
    const srcBucket = event.Records[0].s3.bucket.name;
    const srcKey = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " "));

    const params = {
      Bucket: srcBucket,
      Key: srcKey
    };
    console.log(params)
    var data = await s3.getObject(params).promise();
    console.log(data)
  } catch (err) {
    console.log(err)
  }
};

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

Вы получаете тайм-аут, так как обратный вызов не вызывается в течение настроенного периода времени ожидания для функции (в данном случае 5 минут).

вот версия обратного вызова.

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

  try {
    const srcBucket = event.Records[0].s3.bucket.name;
    const srcKey = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " "));

    const params = {
      Bucket: srcBucket,
      Key: srcKey
    };
    console.log(params)
    var data = await s3.getObject(params).promise();
    callback(null, 'completed successfully')
  } catch (err) {
    console.log(err)
    callback(err)
  }
};

надеюсь, это поможет.

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