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, проверьте пару вещей:
- Лямбда находится в том же VPC, что и экземпляр RDS? Ваши настройки сети в Консоли AWS показывают это?
- Предоставляете ли вы в своей Lambda учетные данные для доступа к вашему экземпляру RDS, или ваша роль "Выполнение" должна иметь такой доступ?
- Разрешает ли ваша группа безопасности RDS соединение из подсети, в которой находится Lambda?
- Является ли ваша подсеть внутренней, для которой требуется доступ к RDS? (Попробуйте использовать ту же подсеть, что и EC2, которая работала)
- Вам нужно установить сертификат CA для RDS в ваших настройках? Для RDS это обычно нужно
dialectOptions: {
ssl: {
ca: 'certPathDownloadedFromAWS'
}
}