AWS RDS / EC2: TimeoutError: Knex: время ожидания для установления соединения. Бассейн, вероятно, полон - PullRequest
0 голосов
/ 10 ноября 2018

Я пытаюсь получить пользовательскую модель из Node js 8.12.0 API, используя knex и bookshelf ORM. База данных 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);
    });
});

Knexfile:

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 голосов
/ 10 ноября 2018

Вам необходимо проверить список контроля доступа к сети (NACL) в вашем VPC и убедиться, что ваши INBOUND и OUTBOUND настроены правильно.Группы безопасности находятся на уровне безопасности экземпляра, а NACL - это безопасность на уровне подсети.

В большинстве случаев при возникновении ошибки тайм-аута при подключении к чему-либо в пользовательском VPC возникает проблема конфигурациигруппа безопасности или NACL или оба.

...