AWS RDS / EC2:超时错误:Knex:超时获取连接。池可能已满

时间:2018-11-10 16:18:37

标签: node.js postgresql amazon-ec2 amazon-rds amazon-elastic-beanstalk

我正在尝试使用Node js 8.12.0knexbookshelf ORM API中检索用户模型。数据库为Postgres 10.4

该API在本地运行良好,但是托管在ElasticBeanstalk EC2和RDS上,但出现错误:

  

未处理的拒绝TimeoutError:Knex:超时获取一个   连接。游泳池可能已满。你想念一个   .transacting(trx)调用?

我能够通过连接字符串/密码分别连接并向RDS实例查询(输入此密码后会提示输入pw):

psql -h myinstance.zmsnsdbakdha.us-east-1.rds.amazonaws.com -d mydb -U myuser

安全组:

  • EC2安全组(由EB设置)为sg-0fa31004bd2b763ce,并且RDS对PostgreSQL / TCP /端口5432 /匹配源(sg-0fa31004bd2b763ce)具有入站安全规则,因此它没有安全组似乎不是问题

RDS是在VPC中创建的,但是VPC的安全规则也已打开:

- security groups attached (multiple)
    - name: mysgname
    - group ID: sg-05d003b66fe1a4a94
    - Inbound rules: 
        - All Traffic (0.0.0.0/0) 
        - HTTP (80) for TCP (0.0.0.0/0) 
        - SSH (22) for TCP (0.0.0.0/0) 
        - PostgreSQL (5432) for TCP (0.0.0.0/0) 

可公开访问:Yes

用户控制器:

router.get('/users', function(req, res) {
    new User.User({'id': 1})
        .fetch({withRelated: ['addresses']})
        .then((user) => {
            res.send(user);
    });
});

Knex文件:

production: {
    client: 'pg',
    version: '7.2',
    connection: {
        host: process.env.PG_HOST || 'localhost',
        port: process.env.PG_PORT || '5432',
        user: process.env.PG_USER || 'myuser',
        password: process.env.PG_PASSWORD || '',
        database: process.env.PG_DB || 'mydb',
        charset: 'utf8',
    },
    pool: {
        min: 2,
        max: 20
    },
},

首先,为什么这仅在AWS托管环境中而不在本地发生。其次,如何解决此问题?我应该为池增加max吗?

1 个答案:

答案 0 :(得分:0)

您需要检查VPC中的网络访问控制列表(NACL),并确保正确配置了INBOUND和OUTBOUND。安全组处于实例安全级别,而NACL是子网级安全。

在大多数情况下,在连接到自定义VPC上的某个内容时遇到超时错误时,将是安全组或NACL或两者都有的配置问题。