【问题标题】:How can I interact with a RDS MySQL instance with Node.js Lambda function?如何使用 Node.js Lambda 函数与 RDS MySQL 实例交互?
【发布时间】:2018-06-12 11:44:34
【问题描述】:

我正在尝试通过亚马逊 Lambda 访问托管在亚马逊 RDS 上的 MySQL 数据库。我有 .js 文件,可以通过 Windows 上的 cmd 行运行,但是当我转移到 Lambda 时,我无法连接到数据库。我彻底研究了这个问题,即使在遵循本指南:Redstapler AWS 之后,我也会收到“在完成请求之前退出进程”错误消息。

我的代码,复制自上面的教程

var mysql = require('mysql');

var pool = mysql.createPool({
host: "",
user: "",
password: "",
database: ""
});
exports.handler = (event,context,callback) => {
context.callbackWaitFOrEmptyEventLoop = false;
    pool.getConnection(function(err,connection){
    if (err) throw err;
    connection.query("SELECT * FROM testdata limit 10", 
        function(error,result,fields){
        connection.release();
        if (error) callback(error)
        else callback(null,result)   
        });
    });
};

从 Amazon Lambda 收到的错误消息

回应: { “errorMessage”:“RequestId:b5151db1-6db8-11e8-8004-1b9e8072561c 进程在完成请求之前退出” } 请求编号: “b5151db1-6db8-11e8-8004-1b9e8072561c” 功能日志: 开始请求 ID:b5151db1-6db8-11e8-8004-1b9e8072561c 版本:$LATEST 2018-06-11T20:48:01.478Z b5151db1-6db8-11e8-8004-1b9e8072561c 错误:握手不活动超时 在握手。 (/var/task/node_modules/mysql/lib/protocol/Protocol.js:164:17) 在 emitNone (events.js:86:13) 在 Handshake.emit (events.js:185:7) 在 Handshake._onTimeout (/var/task/node_modules/mysql/lib/protocol/sequences/Sequence.js:129:8) 在 ontimeout (timers.js:386:14) 在 tryOnTimeout (timers.js:250:5) 在 Timer.listOnTimeout (timers.js:214:5) -------------------- 在 Protocol._enqueue (/var/task/node_modules/mysql/lib/protocol/Protocol.js:145:48) 在 Protocol.handshake (/var/task/node_modules/mysql/lib/protocol/Protocol.js:52:23) 在 PoolConnection.connect (/var/task/node_modules/mysql/lib/Connection.js:130:18) 在 Pool.getConnection (/var/task/node_modules/mysql/lib/Pool.js:48:16) 在exports.handler (/var/task/main.js:11:6) 结束请求 ID:b5151db1-6db8-11e8-8004-1b9e8072561c 报告请求 ID:b5151db1-6db8-11e8-8004-1b9e8072561c 持续时间:10074.63 毫秒计费持续时间:10100 毫秒内存大小:1280 MB 使用的最大内存:27 MB
RequestId: b5151db1-6db8-11e8-8004-1b9e8072561c 完成请求前进程退出

本教程评价很高,看起来很有名,但我无法复制它的成功。该错误似乎暗示 connection.release 位于错误的位置,或者我需要另一种方式来结束连接并将其返回到池中。

【问题讨论】:

    标签: mysql node.js amazon-web-services aws-lambda


    【解决方案1】:

    检查 RDS 实例安全组是否允许从 lambda IP 地址范围 (https://docs.aws.amazon.com/general/latest/gr/aws-ip-ranges.html) 进行访问,或者将 lambda 放置在可访问 RDS 实例的 VPC 中。默认情况下,lambda 不在 VPC 中...

    【讨论】:

      【解决方案2】:

      类似的问题: updated : AWS Lambda is not able to connect to MySQL

      放置控制台日志语句以了解您是否能够连接到 RDS。

      ...
      connection.release();
      console.log(result);
      if (error) callback(error)
      ...
      

      确保在调用回调函数之前调用 pool.end() 否则 lambda 函数执行将无法正确退出,因此您将收到超时错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-17
        • 2021-07-13
        • 1970-01-01
        • 2019-10-14
        • 1970-01-01
        • 1970-01-01
        • 2018-05-16
        • 2018-12-10
        相关资源
        最近更新 更多