[英]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 解析为私有地址 IPLambda-SG
),允许默认“允许所有”出站访问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.