我无法通过lambda函数连接到EC2 Postgres DB
我在S3 createAll事件之后创建了一个lambda函数,在此lambda函数中,我需要更新数据库中的数据。我所做的是我在本地测试了数据库连接。工作正常。但是,在我发布到lambda之后,client.connect函数中的每个console.log都不会被触发。我以为那是我的lambda角色,所以我给了管理员足够的权限。另外,在EC2规则中,我使传入流量向所有人开放。并传给所有人。 1. EC2是ubuntu,Postgres是DB 2.用于Lambda函数的Node.js
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)
})
};
我的Package.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函数中的所有日志。请帮我谢谢
答案 0 :(得分:1)
您的问题可能是EC2安全组,因为您发现可以从本地计算机进行连接,但不能从Lambda函数进行连接。安全组使用IP和端口白名单来确定是否允许连接。首次设置EC2实例时,其默认安全组通常仅允许HTTP / HTTPS之类的简单流量。它没有为PostgreSQL打开端口(5432)。此外,由于Lambda函数支持实例的IP随每次调用而变化,因此必须从任何IP允许这些连接。
如果是这种情况,我的解决方案将是:
您可能还会考虑使用VPC来提高安全性。参见https://docs.aws.amazon.com/lambda/latest/dg/vpc.html
还请注意,如果您使用VPC路线:
AWS Lambda使用此信息来设置弹性网络接口 (ENI),使您的功能可以安全地连接到其他 您的私人VPC中的资源。
使用ENI可能会导致Lambda的冷启动时间更长,直到AWS整理出有关ENI设置时间的问题为止。