我在 AWS Lambda 上启动并运行了一个 NodeJS/无服务器框架 API。它连接到工作正常的 AWS RDS,但是突然之间,它无法连接到我办公室互联网上的 RDS 实例。API 和数据库连接在我的家庭互联网甚至移动数据上都可以正常工作。
数据库连接错误
SequelizeConnectionError: connect ETIMEDOUT
当部署在 AWS Lambda 和 EC2 实例(成功的数据库连接)上时,该 API 工作正常。安全组已为 PORT 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 连接到我办公室互联网上的数据库。
- Ran 代码作为一个简单的 NodeJS 脚本。无法从本地计算机在办公室互联网上工作。在多台本地机器上试过。
- 将简单的 NodeJS 代码部署到新的 EC2 实例。它连接到数据库 API 工作正常。
- 删除 Sequelize 并使用 npm mysql包连接到 RDS 实例。使用办公室互联网从本地计算机连接到 RDS。
- 使用办公室互联网从本地计算机上的 Laravel (PHP) 存储库连接到 RDS 实例。工作!
- 更改了数据库连接配置设置。1) 获取时间增加到 1000000。2) 添加 ssl:true & dialectOptions{ ssl: "Amazon RDS" }。
- 在 serverless.yml 文件中添加了子网 ID和安全组 ID 。所以 lambda 和 RDS 实例在同一个 VPC 中。
- 尝试了多个 RDS 实例。开发和登台实例上的连接失败。
- 为测试创建了新的 RDS 实例。它从办公室互联网上的本地机器连接到数据库(有时)。
你可以在这里找到回购。