AWS Kinesis Firehose không phản hồi Lambda

Nov 05 2020

Đây là mã Lambda:

const AWS = require('aws-sdk');
var firehose = new AWS.Firehose({ region: 'ap-southeast-2' });

exports.handler = async (event, context) => {

var params = {
    DeliveryStreamName: 'TestStream', 
    Record: {
        Data: 'test data'
    }
};
console.log('params', params);

firehose.putRecord(params, function (err, data) {
    if (err) console.log(err, err.stack); // an error occurred
    else console.log('Firehose Successful',  data);           // successful response
});

}

Và chính sách là:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "firehose:DeleteDeliveryStream",
            "firehose:PutRecord",
            "firehose:PutRecordBatch",
            "firehose:UpdateDestination"
        ],
        "Resource": [
            "arn:aws:firehose:ap-southeast-2:xxxxxxxxxxxxx:deliverystream/TestStream"
        ]
    }
]

}

Tôi thực sự đã cắt mọi thứ khác ra ngoài. Và phản hồi mà tôi thấy trong cloudwatch là:

2020-11-05T18:08:17.564+13:00   START RequestId: 3bed96b1-54af-4b08-bc06-be3732bba9ea Version: $LATEST

2020-11-05T18:08:17.568+13:00   2020-11-05T05:08:17.567Z 3bed96b1-54af-4b08-bc06-be3732bba9ea INFO params { DeliveryStreamName: 'TestStream', Record: { Data: <Buffer 74 65 73 74 20 64 61 74 61> } }

2020-11-05T18:08:17.621+13:00   END RequestId: 3bed96b1-54af-4b08-bc06-be3732bba9ea

2020-11-05T18:08:17.621+13:00   REPORT RequestId: 3bed96b1-54af-4b08-bc06-be3732bba9ea Duration: 57.38 ms Billed Duration: 100 ms Memory Size: 960 MB Max Memory Used: 85 MB Init Duration: 399.22 ms

Vì vậy, việc thực hiện đạt đến các đường lửa, và đi thẳng qua chúng, mà không làm gì cả ...

Trả lời

1 Marcin Nov 05 2020 at 12:29

Vì bạn đang sử dụng trình xử lý không đồng bộ, tôi nghĩ rằng vấn đề là chức năng của bạn hoàn thành trước khi mã firehose có cơ hội chạy.

Một cách để khắc phục điều này là thông qua việc sử dụng Promisenhư được hiển thị trong tài liệu AWS . Ví dụ:

const AWS = require('aws-sdk');
var firehose = new AWS.Firehose({ region: 'ap-southeast-2' });

exports.handler = async (event, context, callback) => {

    const promise = new Promise(function(resolve, reject) {

     var params = {
       DeliveryStreamName: 'TestStream', 
       Record: {
          Data: 'test data'
       }
     };
     console.log('params', params);

    firehose.putRecord(params, function (err, data) {
       if (err) console.log(err, err.stack); // an error occurred
       else console.log('Firehose Successful',  data);           //         successful response
     });
  })

  return promise;   
};

Những thay đổi trên chỉ là ví dụ, do đó có lẽ vẫn cần một số điều chỉnh.