首页 > 解决方案 > 如何使用 AWS Lambda (nodeJS) 查询 AWS 外部的 MySQL 数据库?

问题描述

我无法从 AWS Lambda 访问外部数据库,这真的可能吗?难道我做错了什么?

(我已经在本地通过 npm 安装了 mysql 并将带有模块的 .zip 导入控制台)

谢谢!

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

exports.handler = (event,context,callback) => {
    context.callbackWaitsForEmptyEventLoop = false;
    pool.getConnection(function(error,connection){
        connection.query(`SELECT * from dot LIMIT 10`,function (error,results,fields){
            connection.release();
            if (error) callback(error);
            else callback(null,results);
        });
    });
};

我得到以下回复:

{
  "errorType": "TypeError",
  "errorMessage": "Cannot read property 'query' of undefined",
  "trace": [
    "TypeError: Cannot read property 'query' of undefined",
    "    at /var/task/index.js:18:21",
    "    at Handshake.onConnect (/var/task/node_modules/mysql/lib/Pool.js:58:9)",
    "    at Handshake.<anonymous> (/var/task/node_modules/mysql/lib/Connection.js:526:10)",
    "    at Handshake._callback (/var/task/node_modules/mysql/lib/Connection.js:488:16)",
    "    at Handshake.Sequence.end (/var/task/node_modules/mysql/lib/protocol/sequences/Sequence.js:83:24)",
    "    at Protocol.handleNetworkError (/var/task/node_modules/mysql/lib/protocol/Protocol.js:369:14)",
    "    at PoolConnection.Connection._handleNetworkError (/var/task/node_modules/mysql/lib/Connection.js:418:18)",
    "    at Socket.emit (events.js:376:20)",
    "    at emitErrorNT (internal/streams/destroy.js:106:8)",
    "    at emitErrorCloseNT (internal/streams/destroy.js:74:3)"
  ]
}

标签: node.jsdatabaseaws-lambda

解决方案


此端点是否在您的 AWS 账户中?如果是这样,并且您的 MYSQL 数据库位于 VPC 中,那么如果您将 Lambda 配置为在同一 VPC 中运行,那么您将能够访问它。

否则,端点必须可以通过互联网访问。我会尝试从 Lambda 内部 ping 您的数据库端点,看看是否可行。


推荐阅读