【问题标题】:NodeJS script works locally but not in the handler of lambdaNodeJS 脚本在本地工作,但不在 lambda 的处理程序中
【发布时间】:2023-03-24 01:22:01
【问题描述】:

我有一个 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 或安全组相关? 提出了一些想法和建议。 谢谢。

【问题讨论】:

    标签: amazon-web-services aws-lambda amazon-kinesis aws-sdk-js


    【解决方案1】:

    如果你已经把上面的 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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 另外,(IIRC) 确保您的 Lambda 函数的子网是您的 VPC 中的私有子网,而不是 VPC 的公有子网中。
      • @JeffLearman 是的,它们必须是为了有到 NAT 网关的路由。
      • 谢谢@MarkB!删除 VPC 和安全组有效。也感谢您提供有关 NAT 网关的信息。
      猜你喜欢
      • 2014-11-02
      • 2019-01-31
      • 2021-07-22
      • 1970-01-01
      • 2019-10-31
      • 1970-01-01
      • 2019-04-20
      • 2017-06-05
      • 2023-03-12
      相关资源
      最近更新 更多