Amazon web services NodeJS脚本在本地工作,但不在lambda的处理程序中工作

Amazon web services NodeJS脚本在本地工作,但不在lambda的处理程序中工作,amazon-web-services,aws-lambda,amazon-kinesis,aws-sdk-js,Amazon Web Services,Aws Lambda,Amazon Kinesis,Aws Sdk Js,我有一个NodeJSLambda函数,它从一个运动流读取数据,进行一些处理并将其写入另一个运动流。写入部分导致lambda出错。我们使用aws sdk npm模块来编写数据。当我们调用putRecord时,不会触发回调,lambda超时。 当在笔记本电脑上作为节点应用程序在本地运行时,编写的代码工作得很好 本地配置: -编程用户的凭据使用Kinesis完全访问策略存储在凭据文件中,并且putRecord运行时成功返回shardie、序列号等 Lambda函数: -putRecord的代码不返回,

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

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

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或安全组相关? 收到了一些想法和建议。
谢谢。

如果您已经将上面的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.log
console.error
,而是应该调用
callback

如果您已将上面的确切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.log
console.error
,而是应该调用
callback

向专有网络添加函数时,它只能访问该专有网络内的资源。任何访问专有网络外部资源的尝试都将挂起并最终超时。由于专有网络中不存在动态信息,因此您无法访问它


修复方法是在VPC外部运行Lambda功能,或者向VPC添加NAT网关。

当向VPC添加功能时,它只能访问该VPC内部的资源。任何访问专有网络外部资源的尝试都将挂起并最终超时。由于专有网络中不存在动态信息,因此您无法访问它


解决方法是在VPC外部运行Lambda功能,或者在VPC中添加NAT网关。

此外,(IIRC)确保Lambda功能的子网是VPC中的私有子网,而不是VPC的公共子网。@JeffLearman对,它们必须是为了有到NAT网关的路由。谢谢@MarkB!删除VPC和安全组起到了作用。也感谢您提供有关NAT网关的信息。此外,(IIRC)确保Lambda功能的子网是VPC中的私有子网,而不是VPC的公共子网。@JeffLearman对,它们必须是,才能有到NAT网关的路由。谢谢@MarkB!删除VPC和安全组起到了作用。也感谢您提供有关NAT网关的信息。