Я пытаюсь проверить связь между моей Lambda и экземпляром RDS. У меня они оба находятся в одних и тех же частных подсетях, и все порты открыты в группе безопасности. Когда я запускаю Lambda, я вижу, что на экземпляре RDS открыто соединение. Однако лямбда отключается через 4 минуты 40 секунд. Переменные среды PG задаются в конфигурации Lambda.
const { Client } = require('pg');
const client = new Client();
var hello = [
{ name: 'test', description: 'testerface' }
];
exports.handler = async (event, context, callback) => {
// Postgres Connect
client.connect();
const res = client.query('SELECT $1::text as message', ['Hello world!']);
console.info(res);
var response = {
"statusCode": 200,
"headers": {
"Content-Type" : "application/json"
},
"body": JSON.stringify(hello),
"isBase64Encoded": false
};
callback(null, response);
};
Как я могу получить ответ от соединения в журналах Lambda или, что еще лучше, в теле ответа?





Вам нужно лучше обрабатывать клиентское соединение. Это означает перехват любых исключений, через которые может пройти клиент, и правильное освобождение соединения. Этот код вернет результат запроса в тело ответа:
const pg = require('pg')
const pool = new pg.Pool()
async function query (q) {
const client = await pool.connect()
let res
try {
await client.query('BEGIN')
try {
res = await client.query(q)
await client.query('COMMIT')
} catch (err) {
await client.query('ROLLBACK')
throw err
}
} finally {
client.release()
}
return res
}
exports.handler = async (event, context, callback) => {
try {
const { rows } = await query("select * from pg_tables")
console.info(JSON.stringify(rows[0]))
var response = {
"statusCode": 200,
"headers": {
"Content-Type" : "application/json"
},
"body": JSON.stringify(rows),
"isBase64Encoded": false
};
callback(null, response);
} catch (err) {
console.info('Database ' + err)
callback(null, 'Database ' + err);
}
};
Это не совсем правильно, лямбда останется активной и обработчик будет вызываться для каждого последующего вызова. Контекст (параметры, переменные вне обработчика) не будут повторно инициализированы при вызове обработчика. Кроме того, если вы открываете / подключаетесь внутри обработчика, ваше соединение может оставаться открытым для db, по существу потребляя все ресурсы RDS. К сожалению, вам нужно либо настроить пул и ограничить потолок, либо задушить саму лямбду.
Зачем использовать пул в лямбде? Должны ли мы использовать простой клиент? Сама лямбда является параллельной. Разве создание пула здесь не бесполезно?