繁体   English   中英

AWS Lambda 与 RDS Postgresql - 未知问题

[英]AWS Lambda with RDS Postgresql - Unknown Issue

我已经为这个问题苦苦挣扎了 3 天,无法弄清楚出了什么问题。 我在我的 Lambda function 中将我所有的登录凭据设置为环境变量。我的 RDS 实例对公众开放,安全组也打开传入和传出端口。

我的 PostgresQL 代码有很多变体,最新的一个来自这个AWS Lambda NodeJS 连接到 RDS Postgres 数据库

我当前的 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 'thaison' as ")
      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);
    }
};

我可以在pool.connect()之前和之后成功执行console.log 我也可以在client.query()之前但不能在之后使用console.log 问题出在client.query()之后,什么也没有发生。 我检查了 Cloudwatch 日志和指标,日志上没有任何内容,也没有任何错误报告。 代码必须在某处失败,但我无法弄清楚在哪里。 响应是 null,查询后我无法记录任何内容,甚至在catch(err)块中也没有。 我做的最后一件事是将 PG 端点更改为甚至不存在的东西,但我仍然没有收到任何错误。 这东西就这么默默的失败了。

我究竟做错了什么?

由于您使用的是Publicly Available = Yes ,数据库的 DNS 名称将解析为公共地址 IP 这意味着 Lambda function需要 Inte.net 访问

这可以通过将 Lambda function 附加到 VPC 或通过将 Lambda function 附加到私有 su.net然后使用公共 su.net 中的NAT 网关提供对 Inte.net 的访问来完成。 安全组应允许从0.0.0.0/0进行访问(这对安全性非常不利)。

配置此类系统的更“安全”的方法是:

  • 使用Publicly Available = No ,这只会将 RDS 数据库的 DNS Name 解析为私有地址 IP
  • 将 Lambda function 附加到与 RDS 数据库相同的 VPC 中的 su.net
  • 将安全组附加到 Lambda function ( Lambda-SG ),允许默认“允许所有”出站访问
  • 将安全组附加到 RDS 数据库 ( RDS-SG ),允许在端口 5432 (PostgreSQL) 上进行入站访问, Source = Lambda-SG

也就是说, RDS-SG Lambda-SG 这将允许 Lambda function 访问 RDS 数据库。

但是,请注意,RDS 数据库只能从 VPC 内部访问。 您将无法从您自己的计算机在 Inte.net 上连接到它(因为它现在更安全)。 如果需要,您可以使用带有端口转发的跳转盒进行连接。

暂无
暂无

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

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