【问题标题】:AWS Lambda function failing to access MySQL Database from an EC2 Instance : SequelizeConnectionError connect ETIMEDOUTAWS Lambda 函数无法从 EC2 实例访问 MySQL 数据库:SequelizeConnectionError connect ETIMEDOUT
【发布时间】:2020-03-14 20:21:11
【问题描述】:

我正在尝试访问安装在 EC2 实例中的 MySQL 数据库。我用 express js 编写了一个简单的 AWS Lambda 函数。 lambda 函数需要访问 MySQL。当它试图在 EC2 上建立数据库连接时,我得到了下面的每个人:

{
    "errorType": "SequelizeConnectionError",
    "errorMessage": "connect ETIMEDOUT",
    "name": "SequelizeConnectionError",
    "parent": {
        "errorType": "Error",
        "errorMessage": "connect ETIMEDOUT",
        "code": "ETIMEDOUT",
        "errorno": "ETIMEDOUT",
        "syscall": "connect",
        "fatal": true,
        "stack": [
            "Error: connect ETIMEDOUT",
            "    at Connection._handleTimeoutError (/var/task/node_modules/mysql2/lib/connection.js:173:17)",
            "    at ontimeout (timers.js:436:11)",
            "    at tryOnTimeout (timers.js:300:5)",
            "    at listOnTimeout (timers.js:263:5)",
            "    at Timer.processTimers (timers.js:223:10)"
        ]
    },
    "original": {
        "errorType": "Error",
        "errorMessage": "connect ETIMEDOUT",
        "code": "ETIMEDOUT",
        "errorno": "ETIMEDOUT",
        "syscall": "connect",
        "fatal": true,
        "stack": [
            "Error: connect ETIMEDOUT",
            "    at Connection._handleTimeoutError (/var/task/node_modules/mysql2/lib/connection.js:173:17)",
            "    at ontimeout (timers.js:436:11)",
            "    at tryOnTimeout (timers.js:300:5)",
            "    at listOnTimeout (timers.js:263:5)",
            "    at Timer.processTimers (timers.js:223:10)"
        ]
    },
    "stack": [
        "SequelizeConnectionError: connect ETIMEDOUT",
        "    at Utils.Promise.tap.then.catch.err (/var/task/node_modules/sequelize/lib/dialects/mysql/connection-manager.js:149:19)",
        "    at tryCatcher (/var/task/node_modules/bluebird/js/release/util.js:16:23)",
        "    at Promise._settlePromiseFromHandler (/var/task/node_modules/bluebird/js/release/promise.js:512:31)",
        "    at Promise._settlePromise (/var/task/node_modules/bluebird/js/release/promise.js:569:18)",
        "    at Promise._settlePromise0 (/var/task/node_modules/bluebird/js/release/promise.js:614:10)",
        "    at Promise._settlePromises (/var/task/node_modules/bluebird/js/release/promise.js:689:18)",
        "    at Async._drainQueue (/var/task/node_modules/bluebird/js/release/async.js:133:16)",
        "    at Async._drainQueues (/var/task/node_modules/bluebird/js/release/async.js:143:10)",
        "    at Immediate.Async.drainQueues [as _onImmediate] (/var/task/node_modules/bluebird/js/release/async.js:17:14)",
        "    at runCallback (timers.js:705:18)",
        "    at tryOnImmediate (timers.js:676:5)",
        "    at processImmediate (timers.js:658:5)"
    ]
}

ec2的配置是:-

入站规则:

出站规则

Lambda 函数

注意:vpc、子网和安全组在 EC2 和 lambda 中是相同的

这是我的代码:- Lambda Function Code

非常感谢任何帮助!

【问题讨论】:

  • 目前,您可以使用 ssh 访问 ec2 实例吗?
  • 是的,我可以使用 SSH 访问它
  • 这意味着 ec2 实例通过互联网 GW 而不是通过 NAT 网关访问互联网
  • 什么意思?我不明白!

标签: amazon-web-services express amazon-ec2 aws-lambda sequelize.js


【解决方案1】:

如果您想从 lambda 函数连接到 ec2 实例。

首先,Ec2 instances 和 lambda 函数在同一个 VPC 中,并且

其次,您必须为 lambda 函数创建 NAT gateway。 EC2 实例的子网和 lambda 函数的子网应该通过相同的NAT gateway 路由。

例如:

【讨论】:

猜你喜欢
  • 2021-11-23
  • 2019-11-25
  • 2018-04-18
  • 1970-01-01
  • 2017-10-10
  • 2019-11-10
  • 1970-01-01
  • 2017-05-22
  • 1970-01-01
相关资源
最近更新 更多