我有一个可公开访问的AWS RDS,我想使用AWS Lambda连接到该RDS。我正在使用API网关创建一个名为" / hello"的Rest API,它需要返回RDS连接状态。
Lambda代码如下所示。
var mysql = require('mysql');
var ApiBuilder = require('claudia-api-builder'),
api = new ApiBuilder();
var con = mysql.createConnection({
host: "host",
user: "user",
password: "password"
});
module.exports = api;
api.get('/hello', function () {
//any code written here, works perfectly, when this is called
con.connect(function(err) { //this part doesn't work
if (err) return err;
return "connected";
});
});
即使从我的本地计算机,数据库也可公开访问。 Lambda函数还具有AWS RDS所需的权限。
我在浏览器上得到的响应如下
{}
我检查了云监视日志,如下所示。
08:16:11
START RequestId: bf804be1-4797-11e8-8b3f-5b09118631a6 Version: $LATEST
08:16:11
END RequestId: bf804be1-4797-11e8-8b3f-5b09118631a6
08:16:11
REPORT RequestId: bf804be1-4797-11e8-8b3f-5b09118631a6 Duration: 34.28 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 26 MB
Lambda函数不会超过con.connect(...)
,其中没有任何错误显示在任何地方(甚至在RDS日志中也没有)。 API网关可以工作,因为con.connect(...)
之前的任何代码都可以正常工作。这可能是什么问题?
答案 0 :(得分:1)
<?PHP
error_reporting(-1);
error_reporting(E_ALL);
ini_set('display_errors',1);
$sender = 'info@mydomain.com';
$recipient = 'abc@gmail.com';
$subject = "php mail test";
$message = "php test message";
$headers = 'From:' . $sender;
$headers = "MIME-Version: 1.0"."\r\n";
if (mail($recipient, $subject, $message, $headers))
{
echo "Message accepted";
}
else
{
echo "Error: Message not accepted";
}
?>
这是一个异步调用。在连接回调函数之前,lambda将完成并退出。
将此更改为
con.connect(function(err) {
if (err) return err;
return "connected";
});
答案 1 :(得分:0)
正如@ConfusedCoder所解释的那样,这是由于con.connect(...)
是异步调用引起的。在Lambda中使用上下文不是一个选项,因为使用API网关调用Lambda,并且场景中没有使用exports.myhandler
。因此,上下文对象不能用于控制Lamda的流程。
exports.myHandler = function(event, context) {
...
}
我尝试使用promises,异步等待和其他技术,直到找到名为sync-mysql的节点包。这使得对mysql数据库的同步查询,其中AWS Lambda在不执行数据库调用的情况下不继续。下面给出了更新后的代码,使用了“sync-mysql
”。
var ApiBuilder = require('claudia-api-builder'), api = new ApiBuilder();
var MySql = require('sync-mysql');
var connection = new MySql({
host: "host",
user: "user",
password: "password"
});
module.exports = api;
api.get('/hello', function(request) {
return connection.query('SELECT * FROM DB.DummyTable');
});