简体   繁体   English

AWS Lambda NodeJS连接到RDS Postgres数据库

[英]AWS Lambda NodeJS Connect to RDS Postgres Database

I'm trying to test connectivity between my Lambda and an RDS instance. 我正在尝试测试我的Lambda和RDS实例之间的连接。 I have them both on the same private subnets with all ports open in the security group. 我将它们都放在同一个私有子网上,并在安全组中打开所有端口。 When I trigger the Lambda I do see a connection opened on the RDS instance. 当我触发Lambda时,我确实看到在RDS实例上打开了一个连接。 However, the Lambda times out after 4 minutes, 40 seconds. 但是,Lambda在4分40秒后超时。 The PG environment variables are set in the Lambda configuration. 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.log(res);
    var response = {
        "statusCode": 200,
        "headers": {
            "Content-Type" : "application/json"
        },
        "body": JSON.stringify(hello),
        "isBase64Encoded": false
    };
    callback(null, response);
};

How can I get back the response from the connection in the Lambda's logs - or even better in the response body? 如何从Lambda日志中的连接中获取响应 - 甚至在响应正文中更好?

You need to handle the client connection better. 您需要更好地处理客户端连接。 That means catching any exceptions that the client may through and releasing the connection properly. 这意味着捕获客户端可能通过的任何异常并正确释放连接。 This code will return the output of the query to the response body: 此代码将返回查询的输出到响应正文:

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.log(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.log('Database ' + err)
      callback(null, 'Database ' + err);
    }
};

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM