SequelizeJS Не удается подключиться к инстансу RDS в "МОЕМ" интернете

У меня есть NodeJS/Serverless Framework API, работающий на AWS Lambda. Он подключен к AWS RDS, который работал нормально, однако внезапно он не может подключиться к экземпляру RDS только через Интернет в моем офисе. API и соединение с базой данных отлично работают в моем домашнем интернете и даже на мобильных данных.

Ошибка подключения к базе данных

SequelizeConnectionError: connect ETIMEDOUT

API отлично работает при развертывании в AWS Lambda & EC2 Instance (успешные подключения к базе данных). Группа безопасности имеет доступ к входящему трафику, открытый для ПОРТА 3306

Файл подключения к базе данных

const Sequelize = require('sequelize')

const sequelize = new Sequelize(
    process.env.DB_NAME,
    process.env.DB_USERNAME,
    process.env.DB_PASSWORD,
    {
        ssl: true,
        host: process.env.DB_HOST,
        port: process.env.DB_PORT,
        dialect: process.env.DB_DIALECT,
        dialectOptions: {
            ssl: 'Amazon RDS'
        }
    }
)

// Models
const User = require('./models/User')(sequelize, Sequelize)
const Post = require('./models/Post')(sequelize, Sequelize)
const Comment = require('./models/Comment')(sequelize, Sequelize)

let connection= {}
let Models = {
    User, 
    Post,
    Comment
}

/**
 * Creating Associations
 */
Object.keys(Models).forEach(function(modelName) {
    if (Models[modelName].associate) {
      Models[modelName].associate(Models);
    }
})

module.exports = async () => {
    if(connection.isConnected){
        console.log("use existing connection")
        return Models
    } 

    try {
        // await sequelize.sync()
        await sequelize.authenticate()
        connection.isConnected = true
        console.log("use new connection")

        return Models
    } catch (error) {
        console.log(`Connection Error: ${error}`)
    }
}

Решения пробовали

  • Настройте фиктивную базу данных на https://remotemysql.com/. API подключается к базе данных в моем офисе Интернет.
  • Запускал код как простой скрипт NodeJS. Не работал в офисе интернет с локальной машины. Пробовал на нескольких локальных машинах.
  • Развертывание простого кода NodeJS в новом экземпляре EC2. Это связано с базой данных API работает нормально.
  • Удален Sequelize и подключен к инстансу RDS с помощью пакета npm mysql. Подключен к RDS с локальной машины через офисный интернет.
  • Подключено к хранилищу RDS Instance из Laravel (PHP) на локальном компьютере с использованием офисного Интернета. Работал!!
  • Изменены настройки конфигурации подключения к базе данных. 1) Увеличено время получения до 1000000. 2) Добавлены ssl:true & dialectOptions{ ssl: "Amazon RDS" }.
  • Добавлены идентификаторы подсетей и идентификаторы групп безопасности в файле serverless.yml. Так что лямбда и RDS экземпляр находятся в одном и том же VPC.
  • Пробовал несколько экземпляров RDS. Сбой соединения при разработке и постановке экземпляров.
  • Создан новый экземпляр RDS для тестирования. Он подключается к базе данных (иногда) с локальной машины в офисе Интернет.

Вы можете найти репо здесь.

1 ответ

Чтобы заставить работать Lambda, проверьте пару вещей:

  1. Лямбда находится в том же VPC, что и экземпляр RDS? Ваши настройки сети в Консоли AWS показывают это?
  2. Предоставляете ли вы в своей Lambda учетные данные для доступа к вашему экземпляру RDS, или ваша роль "Выполнение" должна иметь такой доступ?
  3. Разрешает ли ваша группа безопасности RDS соединение из подсети, в которой находится Lambda?
  4. Является ли ваша подсеть внутренней, для которой требуется доступ к RDS? (Попробуйте использовать ту же подсеть, что и EC2, которая работала)
  5. Вам нужно установить сертификат CA для RDS в ваших настройках? Для RDS это обычно нужно
dialectOptions: {
 ssl: {
   ca: 'certPathDownloadedFromAWS'
 }
}
Другие вопросы по тегам