AWS Тайм-аут лямбда-выражения при вызове службы AWS после запроса MySQL без использования сервера - PullRequest
0 голосов
/ 05 мая 2020

Я работаю с некоторым бизнес-кодом, который обрабатывает данное событие, запрашивает MySQL БД и затем загружает отформатированный объект в DynamoDB. Код выглядит так:

var mysql = require('mysql');
var AWS = require('aws-sdk');
var dynamodb = new AWS.DynamoDB({ apiVersion: '2012-08-10' });

var pool = mysql.createPool({
  host: process.env.DB_HOST,
  user: process.env.DB_USER,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_DATABASE
});

module.exports.handle = (event, context, callback) => {
  context.callbackWaitsForEmptyEventLoop = false;
  console.time("query");

  // more code

  pool.getConnection(function (err, connection) {
    if (err) callback(Error(`could not get a pool connection: ${err}`));

    connection.query(query, (err, res, fields) => {
      connection.release();
      if (err) {
        callback(Error(`could not execute query: ${err}`));
      } else {
        console.timeEnd("query");
        console.time("parsing");

        // more code

        let inputItem = {
          Item: item,
          TableName: "some_table"
        }

        console.timeEnd("parsing");
        console.time("putItem");

        // here it hangs... no err, no data

        dynamodb.putItem(inputItem, function (err, data) {
          if (err) callback(Error(`could not putItem: ${err}`))
          console.timeEnd("putItem");
          callback(null, JSON.stringify({
            message: "OK"
          }));
        });

      }
    });
  });
}

Я использовал Serverless для объединения этого кода и развернул его на AWS. Когда я выполняю лямбду локально, используя sls invoke local, она работает, но когда я пытаюсь запустить развернутую (либо из sls, либо из консоли AWS), я каждый раз получаю тайм-аут.

Это ДЕЙСТВИТЕЛЬНО странно, потому что если я удалю код MySQL, он работает, т.е. помещает элемент в DynamoDB. Фактически исходный код был лямбдой Go. С этим кодом у меня была точно такая же ошибка при вызове одной службы AWS: нет проблем, при вызове MySQL, а затем службы AWS зависает ... Пробовал все разные версии Go, AWS -SDK packages, et c ... Решил перенести его на Node, думая, что это проблема Go. Я действительно не знаю, что происходит ...

С точки зрения ролей и разрешений все в порядке, как я уже сказал, код РАБОТАЕТ, если я вызываю службу AWS только во время выполнения Lambda.

Есть идеи, что может быть не так, или я просто идиот что-то упустил?

Думаю, уникальным решением будет связать лямбды ...

1 Ответ

0 голосов
/ 11 мая 2020

Я провел небольшое исследование и выяснил, что это связано с настройкой VP C. Оказывается, Lambda не имеет доступа к inte rnet из VP C, поэтому вам нужно либо:

  1. Настроить прокси БД (не рекомендуется для производства, поскольку он в бета-версии) и подключитесь к БД через это.
  2. Настройте VP C для доступа к Inte rnet.

Источники:

...