AWS DynamoDB deleteTable не работает при вызове из NodeJs 8.10 Лямбда-функция - PullRequest
0 голосов
/ 21 ноября 2018

В рамках обучения Lambda я пытаюсь написать простое приложение, которое запускает функцию Lambda через API Gateway.Затем эта лямбда-функция подключается к DynamoDB через AWS SDK и пытается удалить существующую таблицу.

Лямбда-функция срабатывает, когда я выполняю POST для конечной точки шлюза API.Я получаю ответ обратно как {}, что означает, что result никогда не переназначалось сверх инициализированного значения.Насколько я могу судить, метод deleteTable никогда не срабатывает.Я никогда не вижу ни console.log(), ни console.error(), которые существуют внутри тела обратного вызова.

Пожалуйста, найдите детали ниже:

Настройка

Функция лямбда

  • Язык: Node.Js 8.10
  • Триггеры: шлюз API POST конечная точка
  • Права роли выполнения:
    • Базовый шаблон микросервиса (Примечание:Я также пытался дать ему полный доступ к DynamoDB Full Access и даже к Full Administrator, это ничего не помогло.

Вот код. У меня было кое-что гораздо более сложноено урезал его до этого, когда я не смог заставить удалить работать:

exports.handler = async (event) => {
    var aws = require('aws-sdk');
    var dynamodb = new aws.DynamoDB();

    var params = {
        TableName: "StudyGuideSections"
    };

    var result = {};

    dynamodb.deleteTable(params, function(err, data) {
        console.log('Entering deleteTable callback...');

       if (err) {
           console.log(err, err.stack);
       } else {
           console.log(data);

           result = data;
       }
    });

    return {
        statusCode: 200,
        "headers": {
            "Access-Control-Allow-Origin": "*"
        },
        body: JSON.stringify(result)
    };
};

API Gateway

  • Авторизация: Нет
  • Метод: POST

на стороне клиента

  • Почтальон (для тестирования)
  • Простое веб-приложение, выполняющее $.post

Имеюпросмотрел журналы CloudWatch и X-Ray , и я никогда не вижу ошибок и не вижу попыток console.log ()м внутри тела deleteTable() звонка.

В этот момент я почти вырываю волосы, так как это блокирует мои тренировки.Любая помощь будет принята с благодарностью.

Редактировать: Для дальнейшего уточнения я могу изменить тело возвращаемого значения на что-то вроде "Hello World!"и я получаю это как ответ.Кроме того, я могу поставить console.log('Attempting to delete table...") прямо перед вызовом deleteTable;когда я это делаю, я вижу это в CloudWatch.Я просто никогда не вижу журналы внутри метода deleteTable.

1 Ответ

0 голосов
/ 22 ноября 2018

Я наконец понял это.Поскольку я использовал Node.js 8.10, мне нужно было использовать структуру Promise вместо структуры Callback .

Редактировать:

Как упомянул Калев, тот факт, что я использую функцию async для обработчика, обусловил необходимость использования await и .promise(), а не тот факт, что я использовал Node.js 8.10,который по-прежнему поддерживает структуру обратного вызова.

Например, вместо того, что я пытался изначально, мне нужно было сделать что-то более похожее на это:

var aws = require('aws-sdk');

exports.handler = async (event) => {
    var ddb = new aws.DynamoDB();

    aws.config.update({
      region: "us-east-1"
    });

    var params = {
        TableName: "StudyGuideSections"
    };

    var result = {}

    try
    {
        result = await ddb.deleteTable(params).promise();
    }
    catch(ex) {
        result = ex;
    }

    return {
        statusCode: 200,
        "headers": {
            "Access-Control-Allow-Origin": "*"
        },
        body: JSON.stringify(result)
    };
};

Особое примечание result = await ddb.deleteTable(params).promise();поскольку это та часть, которую я испортил.

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