首页 > 解决方案 > aws lambda 和 Rds 中的握手不活动超时错误

问题描述

var mysql = require('mysql');
var config = require('./config.json');

var pool  = mysql.createPool({
    host     : config.dbhost,
    user     : config.dbuser,
    password : config.dbpassword,
    database : config.dbname
  });

  module.exports.handler = (event, context, callback) => {
    //prevent timeout from waiting event loop
    context.callbackWaitsForEmptyEventLoop = false;
    pool.getConnection(function(err, connection) {
      // Use the connection
      if(err){
        return callback(err,null);
      }
      connection.query("Select * from allBlogs", function (error, results, fields) {
        connection.release();
        // Handle error after the release.
        console.log(results);
        var len = results.length;
        var i = 0;
        for(i ; i < len; i++) {
          var tagArray = results[i].tag.split(",");
          results[i].tag = tagArray;
          tagArray = [];
        };
        if (error) {callback( {statusCode: 400, headers: { "Access-Control-Allow-Origin": "*" }, body: JSON.stringify(error)} ,null)}
        else {
        callback(null, { statusCode: 200, headers: { "Access-Control-Allow-Origin": "*" }, body: JSON.stringify(results) });
        }
        });
    });
  };

我正在使用 Aws lambda、API 网关和 RDS 数据库,但我面临握手不活动错误。下面是我用 node.js 编写的代码

标签: amazon-web-servicesaws-lambdaamazon-rds

解决方案


由于 lambda 在 VPC 中,它在尝试连接到 RDS 时超时的一个可能原因是因为 VPC 中的 lambda 函数没有互联网访问权限,也没有公共 ip。来自文档

将函数连接到公共子网不会为其提供 Internet 访问权限或公共 IP 地址。

由于该问题未提供 VPC 详细信息或 RDS 设置的详细信息,因此应该指出,如果您的 RDS 不在 VPC 中,您的 lambda 将无法连接到没有NAT 网关的公共 RDS 。

另一方面,如果 RDS 在不同的 VPC 中,则 可以在两个 VPC 之间建立对等连接,以启用您的 lambda 函数和 RDS 之间的交互。


推荐阅读