AWS RDSDataService 查询不 运行
AWS RDSDataService query not running
我正在尝试使用 RDSDataService 查询 Aurora Serverless 数据库。当我尝试查询时,我的 lambda 只是超时(我将其设置为 5 分钟只是为了确保这不是问题)。我的数据库中有 1 条记录,当我尝试查询它时,没有得到任何结果,也没有调用错误或数据流。我已经通过从我的参数中删除 dbClusterOrInstanceArn 来验证调用了 executeSql,它抛出了没有它的异常。
我还在查询编辑器中 运行 SHOW FULL PROCESSLIST 以查看查询是否仍在 运行ning 而不是。我已经为 lambda 提供了 AmazonRDSFullAccess 和 AmazonRDSDataFullAccess 策略,但也没有任何运气。你可以通过下面的代码看到,我已经尝试了issue #2376中推荐的方法。
这并不重要,但这个 lambda 是由 Kinesis 事件触发器触发的。
const AWS = require('aws-sdk');
exports.handler = (event, context, callback) => {
const RDS = new AWS.RDSDataService({apiVersion: '2018-08-01', region: 'us-east-1'})
for (record of event.Records) {
const payload = JSON.parse(new Buffer(record.kinesis.data, 'base64').toString('utf-8'));
const data = compileItem(payload);
const params = {
awsSecretStoreArn: 'arn:aws:secretsmanager:us-east-1:149070771508:secret:xxxxxxxxx,
dbClusterOrInstanceArn: 'arn:aws:rds:us-east-1:149070771508:cluster:xxxxxxxxx',
sqlStatements: `select * from MY_DATABASE.MY_TABLE`
// database: 'MY_DATABASE'
}
console.log('calling executeSql');
RDS.executeSql(params, (error, data) => {
if (error) {
console.log('error', error)
callback(error, null);
} else {
console.log('data', data);
callback(null, { success: true })
}
});
}
}
编辑:我们通过 aws cli 运行 命令,它 returns 结果。
编辑 2:我可以使用 mysql2
包连接到它并通过 URI 连接到它,所以这无疑是 aws-sdk
或我的方式的问题使用它。
Node Js 执行不等待结果,这就是进程在完成请求之前退出的原因。
使用 mysql 库 https://www.npmjs.com/package/serverless-mysql
或者
使用 context.callbackWaitsForEmptyEventLoop =false
问题是 RDS 必须装在 VPC 中,而 Lambda 不在其中
我正在尝试使用 RDSDataService 查询 Aurora Serverless 数据库。当我尝试查询时,我的 lambda 只是超时(我将其设置为 5 分钟只是为了确保这不是问题)。我的数据库中有 1 条记录,当我尝试查询它时,没有得到任何结果,也没有调用错误或数据流。我已经通过从我的参数中删除 dbClusterOrInstanceArn 来验证调用了 executeSql,它抛出了没有它的异常。
我还在查询编辑器中 运行 SHOW FULL PROCESSLIST 以查看查询是否仍在 运行ning 而不是。我已经为 lambda 提供了 AmazonRDSFullAccess 和 AmazonRDSDataFullAccess 策略,但也没有任何运气。你可以通过下面的代码看到,我已经尝试了issue #2376中推荐的方法。
这并不重要,但这个 lambda 是由 Kinesis 事件触发器触发的。
const AWS = require('aws-sdk');
exports.handler = (event, context, callback) => {
const RDS = new AWS.RDSDataService({apiVersion: '2018-08-01', region: 'us-east-1'})
for (record of event.Records) {
const payload = JSON.parse(new Buffer(record.kinesis.data, 'base64').toString('utf-8'));
const data = compileItem(payload);
const params = {
awsSecretStoreArn: 'arn:aws:secretsmanager:us-east-1:149070771508:secret:xxxxxxxxx,
dbClusterOrInstanceArn: 'arn:aws:rds:us-east-1:149070771508:cluster:xxxxxxxxx',
sqlStatements: `select * from MY_DATABASE.MY_TABLE`
// database: 'MY_DATABASE'
}
console.log('calling executeSql');
RDS.executeSql(params, (error, data) => {
if (error) {
console.log('error', error)
callback(error, null);
} else {
console.log('data', data);
callback(null, { success: true })
}
});
}
}
编辑:我们通过 aws cli 运行 命令,它 returns 结果。
编辑 2:我可以使用 mysql2
包连接到它并通过 URI 连接到它,所以这无疑是 aws-sdk
或我的方式的问题使用它。
Node Js 执行不等待结果,这就是进程在完成请求之前退出的原因。
使用 mysql 库 https://www.npmjs.com/package/serverless-mysql
或者
使用 context.callbackWaitsForEmptyEventLoop =false
问题是 RDS 必须装在 VPC 中,而 Lambda 不在其中