SequelizeJS Не удается подключиться к инстансу RDS в "МОЕМ" интернете - PullRequest
0 голосов
/ 10 апреля 2019

У меня есть и работает 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}`)
    }
}

Испытанные решения

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

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

1 Ответ

0 голосов
/ 11 апреля 2019

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

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