【发布时间】:2020-05-05 19:49:22
【问题描述】:
我正在处理一些处理给定事件、查询 MySQL 数据库然后将格式化对象上传到 DynamoDB 的业务代码。代码如下所示:
var mysql = require('mysql');
var AWS = require('aws-sdk');
var dynamodb = new AWS.DynamoDB({ apiVersion: '2012-08-10' });
var pool = mysql.createPool({
host: process.env.DB_HOST,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_DATABASE
});
module.exports.handle = (event, context, callback) => {
context.callbackWaitsForEmptyEventLoop = false;
console.time("query");
// more code
pool.getConnection(function (err, connection) {
if (err) callback(Error(`could not get a pool connection: ${err}`));
connection.query(query, (err, res, fields) => {
connection.release();
if (err) {
callback(Error(`could not execute query: ${err}`));
} else {
console.timeEnd("query");
console.time("parsing");
// more code
let inputItem = {
Item: item,
TableName: "some_table"
}
console.timeEnd("parsing");
console.time("putItem");
// here it hangs... no err, no data
dynamodb.putItem(inputItem, function (err, data) {
if (err) callback(Error(`could not putItem: ${err}`))
console.timeEnd("putItem");
callback(null, JSON.stringify({
message: "OK"
}));
});
}
});
});
}
我使用无服务器来捆绑此代码并将其部署到 AWS。
当我使用 sls invoke local 在本地执行 lambda 时,它可以工作,但是当我尝试运行已部署的(从 sls 或 AWS 控制台)时,我每次都会超时。
这真的很奇怪,因为如果我删除 MySQL 代码,它就可以工作,即将项目放入 DynamoDB。事实上,原始代码是一个 Go lambda。使用该代码,我在调用一项 AWS 服务时遇到了完全相同的错误:没问题,在调用 MySQL 和 AWS 服务时,挂起……尝试了所有不同版本的 Go、AWS-SDK 包等……决定将其迁移到 Node,认为这是一个 Go 问题。我真的不知道发生了什么......
就角色和权限而言,它们是可以的,正如我所说,如果我只在 Lambda 执行期间调用 AWS 服务,代码就可以工作。
有什么想法可能是错的,或者我只是一个白痴错过了什么?
我想唯一的解决方案是链接 Lambdas...
【问题讨论】:
-
您的 MySQL 服务器在哪里运行?是RDS吗?最终听起来好像是防火墙类型的问题阻止了 Lambda 连接到 MySQL。
-
不,我连接到 SQL 没有问题。数据库位于 VPC 内的 RDS 中。 lambda 有它的 sec 组和所有,所以它可以连接到它。
-
“在 Lambda 执行期间调用 AWS 服务”是什么意思?如何在 Lambda 执行之外调用它?
-
例如,我的意思是调用 DynamoDB 或 Eventbridge。
标签: mysql amazon-web-services aws-lambda amazon-dynamodb serverless