SequelizeJS无法连接到“ MY”互联网上的RDS实例

时间:2019-04-10 07:02:27

标签: node.js sequelize.js amazon-rds serverless-framework serverless-offline

我有一个NodeJS / Serverless Framework API并在AWS Lambda上运行。它已连接到可以正常工作的AWS RDS,但是突然之间,它不能仅在我的办公室Internet上连接到RDS实例。 API和数据库连接在我的家庭Internet甚至移动数据上都可以正常工作。

数据库连接错误

SequelizeConnectionError: connect ETIMEDOUT

将API部署在AWS Lambda和EC2实例上(成功的数据库连接)后,它可以正常工作。 安全组已为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连接到我办公室Internet上的数据库。
  • 运行代码作为简单的NodeJS脚本。无法通过本地计算机在办公室互联网上使用。在多台本地计算机上尝试过。
  • 将简单的NodeJS代码部署到新的EC2实例。它已连接到数据库API并正常工作。
  • 删除了Sequelize,并使用npm mysql软件包连接到RDS实例。使用办公室Internet从本地计算机连接到RDS。
  • 使用Office Internet从本地计算机上的Laravel(PHP)存储库连接到RDS实例。工作了!
  • 更改了数据库连接配置设置。 1)将获取时间增加到1000000。2)添加了ssl:true和DialectOptions {ssl:“ Amazon RDS”}。
  • 在serverless.yml文件中添加了子网ID 安全组ID 。因此,lambda和RDS实例位于同一VPC中。
  • 尝试了多个RDS实例。在 development staging 实例上连接失败。
  • 创建了新的RDS实例进行测试。它有时通过办公室互联网上的本地计算机连接到数据库。

您可以找到仓库here

1 个答案:

答案 0 :(得分:0)

要使Lambda正常运行,请检查以下几件事:

  1. Lambda是否与RDS实例位于同一VPC中?您在AWS Console中的网络设置是否显示此信息?
  2. 您是否在Lambda中提供凭据以访问RDS实例,或者执行角色需要具有该访问权限?
  3. 您的RDS安全组是否允许来自Lambda所在子网的连接?
  4. 您的子网是内部的子网,需要网桥或网关来访问RDS吗? (尝试使用与有效的EC2相同的子网)
  5. 您是否需要在设置上设置RDS的CA证书?对于RDS,通常需要此。.
dialectOptions: {
 ssl: {
   ca: 'certPathDownloadedFromAWS'
 }
}