Код Node.js работает локально, но не работает на AWS Lambda. - PullRequest
0 голосов
/ 17 ноября 2018

У меня есть функция node.js для AWS Lambda.Он читает файл JSON из корзины S3 в виде потока, анализирует его и выводит проанализированные объекты на консоль.Я использую модуль stream-json для анализа.

Он работает в моей локальной среде и выводит объекты на консоль.Но он не печатает объекты в потоках журналов (CloudWatch) на Lambda.Это просто время ожидания после максимальной продолжительности.Он печатает другие операторы журнала, но не значения объекта.

    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 голосов
/ 17 ноября 2018

Я понял, что это потому, что моя лямбда-функция выполняется внутри частного VPC.

(Я должен запустить его внутри частного VPC, потому что ему нужен доступ к моему экземпляру ElastiCache. Я удалил связанный код, когда опубликовал код, для упрощения).

Код может получить доступ к S3 с моего локального компьютера, но не с частного VPC.

Существует процесс, обеспечивающий доступ к S3 из вашего VPC. Здесь размещено https://aws.amazon.com/premiumsupport/knowledge-center/connect-s3-vpc-endpoint/

Вот еще одна ссылка, объясняющая, как настроить конечную точку VPC, чтобы иметь доступ к ресурсам AWS из VPC https://aws.amazon.com/blogs/aws/new-vpc-endpoint-for-amazon-s3/

...