【问题标题】:Cannot connect to EC2 Postgres DB from lambda Nodejs无法从 lambda Nodejs 连接到 EC2 Postgres DB
【发布时间】:2019-06-06 02:05:00
【问题描述】:

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

我在 S3 createAll 事件之后创建了一个 lambda 函数,在这个 lambda 函数中,我需要更新我的数据库中的数据。我所做的是我在本地测试了数据库连接。它工作正常。但是,在我发布到 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)
 })
 };

我的包.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 函数中显示所有日志。请帮帮我谢谢

【问题讨论】:

  • 现在我可以只在连接函数之外应用回调函数来获取日志。但是,如果我将回调放入连接函数中,则不会发生回调。

标签: node.js postgresql lambda


【解决方案1】:

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

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

  • 更改 EC2 实例的安全组以允许来自任何 IP 的 PostgreSQL 端口 (5432) 连接。
  • 确保您在 EC2 实例上的 PostgreSQL 配置仅允许安全连接(使用密码且最好还使用证书的连接)。它将是公开的,所以它必须是安全的。

您还可以考虑使用 VPC 来提高安全性。见https://docs.aws.amazon.com/lambda/latest/dg/vpc.html

如果您走 VPC 路线,请注意:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 2020-12-01
    • 2018-01-13
    • 2019-12-17
    相关资源
    最近更新 更多