在 RDS 中访问 MySQL 或 MS SQL 时,AWS Lambda node.js ETIMEDOUT
AWS Lambda node.js ETIMEDOUT when accessing MySQL or MS SQL in RDS
我正在尝试将 AWS Lambda 函数连接到 RDS 中的数据库,我遵循了一些 post 建议它们都需要在同一个 VPC 内的建议,但亚马逊告诉我支持事实并非如此。
尽管我尝试过使用 nat 网关和安全组允许访问每个的多子网 VPC,但没有成功。
我可以在 SQL management studio 或 MySQL workbench 中毫无问题地与数据库实例对话。
10:13:00
2017-05-16T10:13:00.509Z回调connection.connect()
10:13:00
2017-05-16T10:13:00.547Z 错误 ETIMEDOUT
我现在尝试了几种不同的连接方法,我使用了 post 中的示例,唯一的区别是这个数据库不在 RDS 中。
我已经尝试了 MSSQL 和 MSSQL 数据库实例,两者都遇到连接超时。我已将所有相关政策附加到 lambda 函数。
我在下面包含了我的一个简单测试,只是为了尝试建立连接。
下面添加了测试代码,而不是在 alexa 调用的底部。
function mysqltest2() {
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'endpoint.rds.amazonaws.com',
user : 'user',
password : 'pass',
database : 'db'
});
var test;
console.log(`Intent Request`);
console.log('Then run MySQL code:');
connection.connect(function(err) {
console.log('Inside connection.connect() callback');
if (!err) {
console.log("Database is connected ... ");
connection.query("SELECT 1 + 1 AS solution",
function(err, result) {
console.log("Inside connection.query() callback")
if (!err) {
console.log(result);
console.log("Query Successful! Ending Connection.");
test = result;
connection.end();
} else {
console.log("Query error!");
}
});
} else {
console.log("Error connecting database ..." + err.message);
}
});
return test;
}
有两个问题。
1 VPC 设置
VPC 设置,阅读@Michael - sqlbot post 关于 VPC 的内容帮助很大。
在 VPC 中使用 lambda 时,需要考虑以下因素。
- Lambda 执行角色需要能够创建、描述和删除网络接口。
- Lambda 函数和 RDS 实例需要在同一个 VPC 中。
- Lambda 函数和 RDS 实例需要在相同的子网中。
- Lambda函数和RDS实例需要共享一个安全组。
- 该安全组需要有一个规则允许来自同一安全组中其他实体的流量。
子网需要有备用地址 space 以允许 lambda 创建弹性网络接口。
来源亚马逊网络服务支持
2。 Node.js 回调
第二个基本上是 node.js
中的回调地狱
由于该函数是从 Alexa intent 调用的,因此它在触发回调之前执行了 content.success。这导致下次执行代码时超时,因为它仍在忙于执行上一个命令。我通过嵌套所有回调并在回调中生成 SpeechletResponse 来解决这个问题。
我正在尝试将 AWS Lambda 函数连接到 RDS 中的数据库,我遵循了一些 post 建议它们都需要在同一个 VPC 内的建议,但亚马逊告诉我支持事实并非如此。 尽管我尝试过使用 nat 网关和安全组允许访问每个的多子网 VPC,但没有成功。
我可以在 SQL management studio 或 MySQL workbench 中毫无问题地与数据库实例对话。
10:13:00 2017-05-16T10:13:00.509Z回调connection.connect() 10:13:00 2017-05-16T10:13:00.547Z 错误 ETIMEDOUT
我现在尝试了几种不同的连接方法,我使用了 post 中的示例,唯一的区别是这个数据库不在 RDS 中。
我已经尝试了 MSSQL 和 MSSQL 数据库实例,两者都遇到连接超时。我已将所有相关政策附加到 lambda 函数。
我在下面包含了我的一个简单测试,只是为了尝试建立连接。
下面添加了测试代码,而不是在 alexa 调用的底部。
function mysqltest2() {
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'endpoint.rds.amazonaws.com',
user : 'user',
password : 'pass',
database : 'db'
});
var test;
console.log(`Intent Request`);
console.log('Then run MySQL code:');
connection.connect(function(err) {
console.log('Inside connection.connect() callback');
if (!err) {
console.log("Database is connected ... ");
connection.query("SELECT 1 + 1 AS solution",
function(err, result) {
console.log("Inside connection.query() callback")
if (!err) {
console.log(result);
console.log("Query Successful! Ending Connection.");
test = result;
connection.end();
} else {
console.log("Query error!");
}
});
} else {
console.log("Error connecting database ..." + err.message);
}
});
return test;
}
有两个问题。
1 VPC 设置
VPC 设置,阅读@Michael - sqlbot post 关于 VPC 的内容帮助很大。
在 VPC 中使用 lambda 时,需要考虑以下因素。
- Lambda 执行角色需要能够创建、描述和删除网络接口。
- Lambda 函数和 RDS 实例需要在同一个 VPC 中。
- Lambda 函数和 RDS 实例需要在相同的子网中。
- Lambda函数和RDS实例需要共享一个安全组。
- 该安全组需要有一个规则允许来自同一安全组中其他实体的流量。
子网需要有备用地址 space 以允许 lambda 创建弹性网络接口。
来源亚马逊网络服务支持
2。 Node.js 回调
第二个基本上是 node.js
中的回调地狱由于该函数是从 Alexa intent 调用的,因此它在触发回调之前执行了 content.success。这导致下次执行代码时超时,因为它仍在忙于执行上一个命令。我通过嵌套所有回调并在回调中生成 SpeechletResponse 来解决这个问题。