0

我在 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 实例。它从办公室互联网上的本地机器连接到数据库(有时)。

你可以在这里找到回购。

4

1 回答 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'
 }
}
于 2019-04-11T07:05:59.590 回答