1

我有一个NodeJS Lambda 函数,它从 Kinesis 流中读取数据,进行一些处理并将其写入另一个 Kinesis 流。写作部分导致 lambda 出现错误。我们使用 aws-sdk npm 模块来写入数据。当我们调用 putRecord 时,不会触发回调并且 lambda 会超时。当作为笔记本电脑上的节点应用程序在本地运行时,此编写代码运行良好。

本地配置: - 具有 Kinesis 完全访问权限策略的编程用户的凭据存储在凭据文件中,并且 putRecord 运行成功,返回 shardId、序列号等。

Lambda 函数: - putRecord 的代码不返回并且挂起。也不会抛出任何错误。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 或安全组相关?提出了一些想法和建议。谢谢。

4

2 回答 2

4

如果您已经将上面的确切 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);
    }
  });
};

请注意,您应该调用而不是使用console.logor 。console.errorcallback

于 2017-09-08T16:03:22.440 回答
3

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

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

于 2017-09-08T17:37:09.753 回答