как использовать node pg в aws lambda?

ОБНОВЛЕНИЕ/РЕШЕНО ... проблема заключалась в том, что плагин pgpass искал $HOME/.pgpass, а $HOME не был определен в лямбда-выражении, что привело к сбою join(undefined, '.pgpass'). На самом деле не стоит приписывать себе ответ на это ....

У меня есть следующий тестовый код в лямбда-обработчике (скомпилирован из машинописного текста):

const db = new Pool()
const {rows} = await db.query('select 1 as x')
console.log('rows', JSON.stringify(rows))

Соединение создается через PGHOST PGPORT PGUSER PGDATABASE в среде. Я знаю, что конфигурация «почти правильная», потому что при первой попытке я получил:

{"errorMessage":"ошибка: нет записи pg_hba.conf для хоста \"10.1.1.249\", пользователя \"foo\", базы данных \"bar\", отключен SSL\n в Connection.parseE (/var/task /handler.js:9209:11)\n в Connection.parseMessage (/var/task/handler.js:9034:19)\n в Socket. (/var/task/handler.js:8777:22)\n в emitOne (events.js:96:13)\n в Socket.emit (events.js:188:7)\n в readableAddChunk (_stream_readable.js:176:18)\n в Socket.Readable.push (_stream_readable. js:134:10)\n в TCP.onread(net.js:547:20)"}

Это казалось обнадеживающим. Я изменил конфигурацию postgres, разрешив доступ из подсети, и повторил попытку. Однако теперь я получаю:

2018-02-06 18:14:21.183 (-05:00)    76761ca5-0b93-11e8-8783-a74d098c9f4a    select
2018-02-06 18:14:21.202 (-05:00)    76761ca5-0b93-11e8-8783-a74d098c9f4a    TypeError: Path must be a string. Received undefined
    at assertPath (path.js:7:11)
    at Object.join (path.js:1211:7)
    at Object.module.exports.getFileName (/var/task/handler.js:32434:16)
    at module.exports (/var/task/handler.js:32355:23)
    at Connection.<anonymous> (/var/task/handler.js:31255:9)
    at emitOne (events.js:96:13)
    at Connection.emit (events.js:188:7)
    at Socket.<anonymous> (/var/task/handler.js:8781:12)
    at emitOne (events.js:96:13)
    at Socket.emit (events.js:188:7)
END RequestId: 76761ca5-0b93-11e8-8783-a74d098c9f4a

Что здесь происходит? Казалось, что он попал в базу данных и подключился с первого раза... Теперь он не работает на query. Есть ли какой-то вариант, который я должен использовать?


person shaunc    schedule 06.02.2018    source источник
comment
Пожалуйста, покажите исходный код вашего обработчика. Поскольку мы не можем видеть, когда и как вы подключаетесь к базе данных относительно вашей функции обработчика. Машинопись в порядке.   -  person Noel Llevares    schedule 07.02.2018
comment
@dashmug Handler просто переносит опубликованные строки. Соединение обрабатывается неявно при вызове запроса. (См. github.com/brianc/node-pg- pool#your-new-favorite-helper-method) Все параметры находятся в окружении.   -  person shaunc    schedule 08.02.2018
comment
Пробовали console.log(process.env.PGHOST) проверить, установлены ли переменные среды?   -  person Noel Llevares    schedule 08.02.2018
comment
Да... распечатал process.env, и он включает PGHOST и т. д. PGHOST - это IP-адрес (а не имя хоста), но это должно работать.   -  person shaunc    schedule 09.02.2018
comment
Возможно, вам следует пересмотреть свое решение и просто не использовать пул соединений. В любом случае они бесполезны на AWS Lambda.   -  person Noel Llevares    schedule 09.02.2018
comment
Вы должны похвалить себя за ответ. Решил мою проблему.   -  person asr9    schedule 10.01.2019
comment
Пока он не объединен, вы можете использовать эту ветку pgpass: github.com/beekeeper- studio/pgpass/tree/blank-home. Если вы используете пряжу, вы можете добавить раздел разрешений: разрешения: {pg/pgpass: beekeeper-studio/pgpass#blank-home},   -  person Matthew Rathbone    schedule 08.05.2020


Ответы (1)


Во-первых, вы не вызываете pool.connect для получения клиента из пула. .

Во-вторых, текущая среда выполнения Node.js 6.10 на AWS Lambda не поддерживает асинхронные функции. . (Если вы не транспилируете свой код в ES5, используя непосредственно Babel или какой-либо другой шаблон, использующий Babel, например es2017-лямбда-шаблон)

Сказав это, вам придется использовать либо обратные вызовы, либо обещания (затем/поймать). Например:

const {Pool} = require("pg");

const db = new Pool({
  host: "localhost",
  user: "database-user",
  // ... rest of config options
});

db.connect((err, client, release) => {
  if (err) {
    console.error("Error acquiring client.", err.stack);
  } else {
    client.query("SELECT 1 AS x", (err, result) => {
      release();
      if (err) {
        console.error("Error executing query.", err.stack);
      } else {
        console.log(result.rows);
      }
    })
  }
})
person Khalid T.    schedule 07.02.2018
comment
(1) нет необходимости вызывать соединение - будет автоматически подключаться на pool.query() (2) На самом деле, использование машинописного текста, поэтому асинхронность не является проблемой (и если бы это было, это вызвало бы синтаксическую ошибку). Поскольку он пытался подключиться, эти проблемы не являются проблемой. Ошибка, похоже, заключается в том, что оболочка запрашивает имя файла из сокета tcp, у которого нет имени файла. (Но почему?) - person shaunc; 08.02.2018