AWS Kinesis Firehose가 Lambda에 응답하지 않음

Nov 05 2020

다음은 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
});

}

정책은 다음과 같습니다.

{
"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"
        ]
    }
]

}

나는 말 그대로 다른 모든 것을 잘라 냈습니다. 그리고 내가 Cloudwatch에서보고있는 응답은 다음과 같습니다.

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

따라서 사형 집행은 소방 호스 라인에 도달하고 아무것도하지 않고 바로지나갑니다 ...

답변

1 Marcin Nov 05 2020 at 12:29

비동기 처리기를 사용하고 있기 때문에 문제는 firehose 코드가 실행되기 전에 함수가 완료된다는 것입니다.

이를 수정하는 한 가지 방법 Promise은 AWS 문서에 표시된대로를 사용하는 것입니다 . 예를 들면 :

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;   
};

위의 변경 사항은 예시 일 뿐이므로 일부 조정이 여전히 필요합니다.