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

问题描述 投票:0回答:1

我在AWS Lambda上启动并运行了NodeJS / Serverless Framework API。它连接到AWS RDS,它工作正常,但突然之间,它无法仅在我的办公室互联网上连接到RDS实例。 API和数据库连接在我的家庭互联网甚至移动数据上都能正常工作。

Database Connection Error

SequelizeConnectionError: connect ETIMEDOUT

在AWS Lambda和EC2实例(成功的数据库连接)上部署时,API工作正常。安全组为PORT 3306开放入站流量访问

Database Connection File

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}`)
    }
}

Solutions Tried

  • remotemysql.com设置一个虚拟数据库。 API连接到我办公室互联网上的数据库。
  • 将代码作为简单的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实例。它连接到数据库(有时)从办公室互联网上的本地机器。

你可以找到repo here

node.js sequelize.js amazon-rds serverless-framework serverless-offline
1个回答
0
投票

要让Lambda工作检查几件事:

  1. Lambda与RDS实例位于同一个VPC中吗? AWS控制台中的网络设置是否显示此内容?
  2. 您是否在Lambda中提供凭据以访问您的RDS实例,或者您的执行角色是否需要具有该访问权限?
  3. 您的RDS安全组是否允许来自Lambda所在子网的连接?
  4. 您的子网是否需要网桥或网关才能访问RDS? (尝试使用与工作的EC2相同的子网)
  5. 您是否需要在设置上为RDS设置CA证书?对于RDS,您通常需要这个..
dialectOptions: {
 ssl: {
   ca: 'certPathDownloadedFromAWS'
 }
}
© www.soinside.com 2019 - 2024. All rights reserved.