AWS Lambda NodeJS 连接到 RDS Postgres 数据库

Posted

技术标签:

【中文标题】AWS Lambda NodeJS 连接到 RDS Postgres 数据库【英文标题】:AWS Lambda NodeJS Connect to RDS Postgres Database 【发布时间】:2019-05-27 16:06:34 【问题描述】:

我正在尝试测试我的 Lambda 和 RDS 实例之间的连接。我将它们都放在同一个私有子网上,所有端口都在安全组中打开。当我触发 Lambda 时,我确实看到 RDS 实例上打开了一个连接。但是,Lambda 在 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.log(res);
    var response = 
        "statusCode": 200,
        "headers": 
            "Content-Type" : "application/json"
        ,
        "body": JSON.stringify(hello),
        "isBase64Encoded": false
    ;
    callback(null, response);
;

如何在 Lambda 的日志中从连接中获取响应,或者在响应正文中获取更好的响应?

【问题讨论】:

【参考方案1】:

您需要更好地处理客户端连接。这意味着捕获客户端可能通过的任何异常并正确释放连接。此代码会将查询的输出返回到响应正文:

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);
    
;

【讨论】:

为什么在 lambda 中使用 pool?我们应该使用简单的客户端吗? Lambda 本身是并发的。在这里创建池不是没用吗? 这不完全正确,lambda 将保持活动状态,并且将为每个后续调用调用处理程序。调用处理程序时,上下文(参数、处理程序之外的变量)不会重新初始化。此外,如果您在处理程序中打开/连接,您的连接可以保持对 db 开放,基本上会消耗 RDS 上的所有资源。不幸的是,您要么需要配置池并限制上限,要么需要限制 lambda 本身。

以上是关于AWS Lambda NodeJS 连接到 RDS Postgres 数据库的主要内容,如果未能解决你的问题,请参考以下文章

使用 AWS Lambda 连接到 Oracle RDS 时出现错误 (DPI-1047)

如何从 AWS Lambda .Net Core 应用程序 API 连接到 AWS RDS SQL Server?

无法从 AWS Lambda 连接到 AWS RDS MySql DB。 ClassNotFoundException:com.mysql.jdbc

无法通过 AWS.RDS.Signer 连接到 RDS

阿波罗服务器 RDS 和 aws lambda

出于开发目的,无法从本地主机连接到 AWS RDS Postgresql