Не получают никаких показаний консоли от AWS Lambda при попытке подключения к RDS

Я пытаюсь проверить, могу ли я подключиться к своей базе данных RDS, но ничего не регистрируется в обещании/обратном вызове соединения. Мне удалось подключиться с моей локальной машины, но не на AWS. У меня нет идей о том, как еще я могу отладить это, поскольку я сделал все, что мог найти в Интернете.

Я проверил, что экземпляр RDS и Lambda функционируют в одном и том же VPC, группе безопасности VPC и подсетях, как это было предложено этот вопрос. Для этой группы безопасности VPC я добавил 0.0.0.0/0 и ::/0, а правила входящего трафика можно увидеть ниже: введите здесь описание изображения

Экземпляр RDS настроен как общедоступный, и установка недоступного для всех значения не имеет значения. Ниже приведен вывод, который я получаю при запуске лямбда-функции.

START RequestId: 9567a1be-d8d1-4b61-b9c4-4dd06ff36a4b Version: $LATEST
2021-07-21T23:52:47.115Z    9567a1be-d8d1-4b61-b9c4-4dd06ff36a4b    INFO    Lambda invoked
END RequestId: 9567a1be-d8d1-4b61-b9c4-4dd06ff36a4b
REPORT RequestId: 9567a1be-d8d1-4b61-b9c4-4dd06ff36a4b  Duration: 52.71 ms  Billed Duration: 53 ms  Memory Size: 128 MB Max Memory Used: 71 MB  Init Duration: 193.40 ms

Я использую код pg, полученный из документации node-postgres. Я изучил руководство Amazon по подключению лямбда-функция для rds, присвоив ей роль с AWSLambdaVPCAccessExecutionRole (я не использовал CLI, как они, я использовал графический интерфейс на веб-сайте). Я также читал, что консольный объект внутри обещаний не всегда возвращается, поэтому я завернул каждое обещание в блок try catch, и все равно ничего не возвращается.

const {Client, Pool} = require('pg')

const pool = new Pool({
  user: 'myusername', 
  password: 'mypassword', 
  host: 'blahblah.somestuff.us-east-2.rds.amazonaws.com', 
  port: 5432, 
  database: 'postgres'
})

pool.on('error', (err, client) => {
  console.error('Unexpected error on idle client', err)
  process.exit(-1)
})


exports.handler = function(event, context) {
  console.log('Lambda invoked') // this logs just fine
  
  try {
    var client = pool.connect((err, client, done) => {
      if (err) throw err
      console.log('connected')
      try {
        client.query('SELECT * FROM users WHERE id = $1', [1], (err, res) => {
          done()
          console.log('query has run')
          if (err) {
            throw err;
            // console.log(err.stack)
          } else {
            console.log(res.rows[0])
          }
        })
      } catch(err) {
        throw err
      }
    })
  }
  catch(err) {
    console.warn(err)
  }
};

Узел-postgres 6.4.2, PostgreSQL 12.6R1


person humanlikely    schedule 22.07.2021    source источник
comment
Почему журнал не показывает сообщение об ошибке? Ваш код, похоже, улавливает все ошибки.   -  person John Rotenstein    schedule 22.07.2021


Ответы (1)


Правильная конфигурация групп безопасности будет следующей:

  • Группа безопасности в функции Lambda (Lambda-SG) с параметрами по умолчанию "Разрешить все исходящие подключения".
  • Группа безопасности в базе данных Amazon RDS (DB-SG) с правилом для входящего трафика, которое разрешает трафик от Lambda-SG через порт 5432 (для PostgreSQL).

То есть DB-SG специально ссылается на Lambda-SG как на допустимый для входящего трафика. Это гораздо чище, чем помещение ресурсов в одну и ту же группу безопасности, что является неправильной моделью, поскольку группы безопасности применяются к каждому ресурсу индивидуально.

person John Rotenstein    schedule 22.07.2021
comment
Это хорошо знать. Я просто пытаюсь начать работу, следуя документации AWS по подключению Lambda к RDS, которая использует ту же группу безопасности, что и я: docs.aws.amazon.com/lambda/latest/dg/services-rds-tutorial.html. Я не вижу причин, по которым они будут предоставлять документацию, которая не работает сразу. - person humanlikely; 22.07.2021
comment
В этом документе не описывается конфигурация группы безопасности. Это стоит сделать, потому что это может решить вашу проблему, и это более конкретное определение разрешений безопасности, чем полагаться на совместное членство в существующей группе безопасности. - person John Rotenstein; 22.07.2021
comment
Я создал две новые группы безопасности. Lambda-SG с правилом для исходящего трафика IPv4, всем трафиком, всем протоколом, всеми портами, с пунктом назначения 0.0.0.0/0 и без правил для входящего трафика. Я также создал DB-SG с типом правила для входящих подключений PostgreSQL, протоколом TCP, диапазоном портов 5432 и источником Lambda-SG с установленным по умолчанию правилом для исходящих подключений (весь трафик IPv4, все протоколы, все порты, место назначения 0.0.0.0/0). Он ничего не регистрирует, как и раньше. - person humanlikely; 22.07.2021
comment
Хорошо, я нашел проблему. Моя версия pg не была совместима с версией узла, на котором работала Lambda. Извините за суету, и я ценю помощь! - person humanlikely; 22.07.2021