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.logconsole.error

当您向 VPC 添加函数时,它只能访问该 VPC 内的资源。任何访问 VPC 外部资源的尝试都将挂起并最终超时。由于您的 VPC 中不存在 Kinesis,因此您无法访问它。

解决方法是 运行 VPC 外部的 Lambda 函数,或者将 NAT 网关添加到您的 VPC。