NodeJS 脚本在本地工作但不在 lambda 的处理程序中
NodeJS script works locally but not in the handler of lambda
我有一个 NodeJS Lambda 函数,它从 Kinesis 流中读取数据,进行一些处理并将其写入另一个 Kinesis 流。写作部分导致 lambda 错误。我们使用 aws-sdk npm 模块来写入数据。当我们调用 putRecord 时,没有回调被触发并且 lambda 超时。
当 运行 在本地作为笔记本电脑上的节点应用程序时,这种编写代码效果很好。
本地配置:
- 具有 Kinesis 完全访问策略的编程用户的凭据存储在凭据文件中,并且 putRecord 运行s 成功 returning shardId、序列号等
Lambda 函数:
- putRecord 的代码没有 return 并且挂起。也不会抛出任何错误。 Lambda 具有 Kinesis 完全访问策略的角色。
代码:
var AWS = require('aws-sdk');
var kinesis = new AWS.Kinesis({
region: 'us-east-1',
});
var randomNumber = Math.floor(Math.random() * 100000);
var data = 'data-' + randomNumber;
var partitionKey = 'pk-' + randomNumber;
var recordParams = {
Data: data,
PartitionKey: partitionKey,
StreamName: streamName
};
kinesis.putRecord(recordParams, function(err, data) {
console.log(data);
if (err) {
console.error(err);
}
});
知道是什么导致了这个问题。可能与 VPC 或安全组相关?
想法和建议表示赞赏。
谢谢
如果您已将上面的 Node.js 脚本代码完全上传到 Lambda,则肯定无法运行。
Lamda 要求您导出它将调用的处理程序函数。
所以,如果你想让它成为一个 Lambda 函数,你的脚本应该这样写......
'use strict';
var AWS = require('aws-sdk');
var kinesis = new AWS.Kinesis({
region: 'us-east-1',
});
exports.handler = function (event, context, callback) {
var randomNumber = Math.floor(Math.random() * 100000);
var data = 'data-' + randomNumber;
var partitionKey = 'pk-' + randomNumber;
var recordParams = {
Data: data,
PartitionKey: partitionKey,
StreamName: streamName,
};
kinesis.putRecord(recordParams, function (err, data) {
callback(null, data);
if (err) {
callback(err);
}
});
};
请注意,您应该调用 callback
,而不是使用 console.log
或 console.error
。
当您向 VPC 添加函数时,它只能访问该 VPC 内的资源。任何访问 VPC 外部资源的尝试都将挂起并最终超时。由于您的 VPC 中不存在 Kinesis,因此您无法访问它。
解决方法是 运行 VPC 外部的 Lambda 函数,或者将 NAT 网关添加到您的 VPC。
我有一个 NodeJS Lambda 函数,它从 Kinesis 流中读取数据,进行一些处理并将其写入另一个 Kinesis 流。写作部分导致 lambda 错误。我们使用 aws-sdk npm 模块来写入数据。当我们调用 putRecord 时,没有回调被触发并且 lambda 超时。 当 运行 在本地作为笔记本电脑上的节点应用程序时,这种编写代码效果很好。
本地配置: - 具有 Kinesis 完全访问策略的编程用户的凭据存储在凭据文件中,并且 putRecord 运行s 成功 returning shardId、序列号等
Lambda 函数: - putRecord 的代码没有 return 并且挂起。也不会抛出任何错误。 Lambda 具有 Kinesis 完全访问策略的角色。
代码:
var AWS = require('aws-sdk');
var kinesis = new AWS.Kinesis({
region: 'us-east-1',
});
var randomNumber = Math.floor(Math.random() * 100000);
var data = 'data-' + randomNumber;
var partitionKey = 'pk-' + randomNumber;
var recordParams = {
Data: data,
PartitionKey: partitionKey,
StreamName: streamName
};
kinesis.putRecord(recordParams, function(err, data) {
console.log(data);
if (err) {
console.error(err);
}
});
知道是什么导致了这个问题。可能与 VPC 或安全组相关? 想法和建议表示赞赏。 谢谢
如果您已将上面的 Node.js 脚本代码完全上传到 Lambda,则肯定无法运行。
Lamda 要求您导出它将调用的处理程序函数。
所以,如果你想让它成为一个 Lambda 函数,你的脚本应该这样写......
'use strict';
var AWS = require('aws-sdk');
var kinesis = new AWS.Kinesis({
region: 'us-east-1',
});
exports.handler = function (event, context, callback) {
var randomNumber = Math.floor(Math.random() * 100000);
var data = 'data-' + randomNumber;
var partitionKey = 'pk-' + randomNumber;
var recordParams = {
Data: data,
PartitionKey: partitionKey,
StreamName: streamName,
};
kinesis.putRecord(recordParams, function (err, data) {
callback(null, data);
if (err) {
callback(err);
}
});
};
请注意,您应该调用 callback
,而不是使用 console.log
或 console.error
。
当您向 VPC 添加函数时,它只能访问该 VPC 内的资源。任何访问 VPC 外部资源的尝试都将挂起并最终超时。由于您的 VPC 中不存在 Kinesis,因此您无法访问它。
解决方法是 运行 VPC 外部的 Lambda 函数,或者将 NAT 网关添加到您的 VPC。