Node.js代码在本地可用,但不适用于AWS Lambda

时间:2018-11-17 06:54:26

标签: node.js aws-lambda node.js-stream

我有一个适用于AWS Lambda的node.js函数。它从S3存储桶中以流的形式读取JSON文件,对其进行解析,然后将已解析的对象打印到控制台。我正在使用stream-json模块进行解析。

它可以在我的本地环境上运行并将对象打印到控制台。但是它不会将对象打印到Lambda上的日志流(CloudWatch)中。它只是在最大持续时间之后超时。它打印周围的其他日志语句,但不打印对象值。

    1. Using node.js 6.10 in both environments. 
    2. callback to the Lambda function is invoked only after the stream ends.
    3. Lambda has full access to S3
    4. Also tried Promise to wait until streams complete. But no change.

我想念什么?预先谢谢你。

const AWS = require('aws-sdk');
const {parser} = require('stream-json');
const {streamArray} = require('stream-json/streamers/StreamArray');
const {chain}  = require('stream-chain');


const S3 = new AWS.S3({ apiVersion: '2006-03-01' });

/** ******************** Lambda Handler *************************** */

exports.handler = (event, context, callback) => {
    // Get the object from the event and show its content type
    const bucket = event.Records[0].s3.bucket.name;
    const key = event.Records[0].s3.object.key;
    const params = {
            Bucket: bucket,
            Key: key
    };

    console.log("Source: " + bucket +"//" + key);

    let s3ReaderStream = S3.getObject(params).createReadStream();

    console.log("Setting up pipes");

    const pipeline = chain([
          s3ReaderStream,
          parser(),
          streamArray(),
          data => {
            console.log(data.value); 
          }
        ]);

        pipeline.on('data', (data) => console.log(data));
        pipeline.on('end', () => callback(null, "Stream ended"));
};

1 个答案:

答案 0 :(得分:1)

我发现这是因为我的Lambda函数在私有VPC中运行。

(我必须在私有VPC中运行它,因为它需要访问我的ElastiCache实例。为简化起见,我在发布代码时删除了相关代码)。

代码可以从我的本地计算机访问S3,但不能从私有VPC访问。

有一个过程可以确保可从VPC内访问S3。它发布在这里https://aws.amazon.com/premiumsupport/knowledge-center/connect-s3-vpc-endpoint/

这里是另一个链接,该链接解释了您应如何设置VPC端点以能够从VPC https://aws.amazon.com/blogs/aws/new-vpc-endpoint-for-amazon-s3/内访问AWS资源