Node.js 无法从lambda Nodejs连接到EC2 Postgres DB

Node.js 无法从lambda Nodejs连接到EC2 Postgres DB,node.js,postgresql,lambda,Node.js,Postgresql,Lambda,我无法从lambda函数连接到EC2 Postgres DB const { Client } = require('pg'); exports.handler = async (event,context,callback) => { context.callbackWaitsForEmptyEventLoop = true; var client = new Client({ host:'example.com', port:5432, user:'postgr

我无法从lambda函数连接到EC2 Postgres DB

const { Client } = require('pg');
exports.handler = async (event,context,callback) => {
context.callbackWaitsForEmptyEventLoop = true;
var client = new Client({
    host:'example.com',
    port:5432,
    user:'postgres',
    password:'examplepassword',
    database:'db'
});
console.log('start connecting db : log client');
client.connect().then(() => {
    console.log('DB is connected');
    const text1 = 'SELECT * FROM unime.lecture_content';
    const text = 'INSERT INTO uni.institute_type(name) VALUES($1) 
RETURNING *';
    const values = ['Test Data 2'];
    callback('DB Connected')
}).catch(e => {console.error('connection error', e.stack)
  callback('DB failure',e.stack)
 })
 };
我在S3CreateAll事件之后创建了一个lambda函数,在这个lambda函数中,我需要更新数据库中的数据。我所做的是在本地测试DB连接。它很好用。但是,在我发布到lambda之后,client.connect函数中的每个console.log都不会被触发。我认为这将是我的lambda角色的许可,所以我给了管理员这个角色的完全权限。另外,在EC2规则中,我使传入的流量对所有人开放。也向所有人开放。 1.EC2是ubuntu,Postgres是DB 2.Lambda函数的Nodejs

const { Client } = require('pg');
exports.handler = async (event,context,callback) => {
context.callbackWaitsForEmptyEventLoop = true;
var client = new Client({
    host:'example.com',
    port:5432,
    user:'postgres',
    password:'examplepassword',
    database:'db'
});
console.log('start connecting db : log client');
client.connect().then(() => {
    console.log('DB is connected');
    const text1 = 'SELECT * FROM unime.lecture_content';
    const text = 'INSERT INTO uni.institute_type(name) VALUES($1) 
RETURNING *';
    const values = ['Test Data 2'];
    callback('DB Connected')
}).catch(e => {console.error('connection error', e.stack)
  callback('DB failure',e.stack)
 })
 };
mypackage.json

  {
 "name": "node_postgres",
 "version": "1.0.0",
 "description": "node postgres api",
 "main": "index.js",
 "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "deploy": " — zip-file fileb://Lambda-Deployment.zip",
    "predeploy": "zip -r Lambda-Deployment.zip * -x *.zip *.log"
 },
 "keywords": [
    "postgres"
 ],
 "author": "JUNXILI",
 "license": "ISC",
 "dependencies": {
     "pg": "^7.0.3"
 }
}


我想显示client.connect函数中的所有日志。请帮助我,谢谢

您的问题可能是您的EC2安全组,因为您发现您可以从本地计算机进行连接,但不能从Lambda函数进行连接。安全组使用IP和端口白名单来确定是否允许连接。首次设置EC2实例时,其默认安全组通常只允许HTTP/HTTPS等简单通信。它没有为PostgreSQL打开端口(5432)。此外,必须允许从任何IP进行这些连接,因为Lambda函数支持实例的IP在每次调用时都会发生变化

如果是这种情况,我的解决方案是:

  • 更改EC2实例的安全组以允许从任何IP连接PostgreSQL端口(5432)
  • 确保您在EC2实例上的PostgreSQL配置只允许安全连接(使用密码和证书进行的连接更好)。它将是公开的,所以它必须是安全的
您还可以考虑使用专有网络来提高安全性。看

另请注意,如果您选择VPC路线:

AWS Lambda使用此信息设置弹性网络接口 (ENIs),使您的功能能够安全地连接到其他 私有专有网络中的资源


在AWS解决ENI配置时间问题之前,使用ENIs可能会导致Lambda的冷启动时间更长。

现在,我只需在connect函数之外应用回调函数即可获取日志。但是,如果我将回调放在connect函数中,回调就不会发生。