AWS Лямбда-функция преобразования Firehose выдает ошибку Lambda.MissingRecordId для каждой записи - PullRequest
0 голосов
/ 28 мая 2020

Я использую шланг AWS с резервной копией S3 и целевым сегментом S3, и он отлично работает. Проблема возникает, когда я пытаюсь преобразовать данные с помощью лямбда-функции.

Я использую. NET AWS SDK, моя лямбда-функция написана в C# и использует включенный пожарный шланг Пример преобразования:

[assembly:LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.JsonSerializer))]

namespace LambdaFunctions
{
    public class Function
    {
        public KinesisFirehoseResponse FunctionHandler(KinesisFirehoseEvent evnt, ILambdaContext context)
        {
            context.Logger.LogLine($"InvocationId: {evnt.InvocationId}");
            context.Logger.LogLine($"DeliveryStreamArn: {evnt.DeliveryStreamArn}");
            context.Logger.LogLine($"Region: {evnt.Region}");

            KinesisFirehoseResponse response = new KinesisFirehoseResponse
            {
                Records = new List<KinesisFirehoseResponse.FirehoseRecord>()
            };

            foreach (KinesisFirehoseEvent.FirehoseRecord record in evnt.Records)
            {
                context.Logger.LogLine($"\tRecordId: {record.RecordId}");
                context.Logger.LogLine($"\t\tApproximateArrivalEpoch: {record.ApproximateArrivalEpoch}");
                context.Logger.LogLine($"\t\tApproximateArrivalTimestamp: {record.ApproximateArrivalTimestamp}");
                context.Logger.LogLine($"\t\tData: {record.DecodeData()}");

                // Transform data: For example ToUpper the data
                KinesisFirehoseResponse.FirehoseRecord transformedRecord = new KinesisFirehoseResponse.FirehoseRecord
                {
                    RecordId = record.RecordId,
                    Result = KinesisFirehoseResponse.TRANSFORMED_STATE_OK
                };

                transformedRecord.EncodeData(record.DecodeData().ToUpperInvariant());

                response.Records.Add(transformedRecord);
            }

            return response;
        }
    }
}

Данные успешно и правильно обрабатываются лямбда-функцией преобразования (как показано в тестах и ​​журналах).

Однако данные не были успешно возвращены лямбда-функцией в целевую корзину S3, все записи обрабатываются безуспешно.

Эта ошибка возвращается для каждой записи:

{
    "attemptsMade": 1,
    "arrivalTimestamp": 1590656820209,
    "errorCode": "Lambda.MissingRecordId",
    "errorMessage": "One or more record Ids were not returned. Ensure that the Lambda function returns all received record Ids.",
    "attemptEndingTimestamp": 1590656883464,
    "rawData": "dGVzdDE=",
    "lambdaArn": "arn:aws:lambda:Region:AccountNumber:function:transform-function:$LATEST"
}

Я не понимаю, почему и где возникает эта ошибка. Я знаю, что функция Lambda возвращает правильный ответ, включая recordId.

Я воссоздал все ресурсы, применил и повторно применил разрешения, сделал практически все, что мог придумать.

Эта проблема не возникает при использовании Node.js или Python, кажется, уникальна для реализации. NET.

EDIT:

Я забыл добавить атрибут сборки сериализатора в исходный блок кода который в конечном итоге стал источником проблемы.

1 Ответ

0 голосов
/ 28 мая 2020

Пример C#, предоставленный AWS, устарел, особенно этот пакет сериализации:

Amazon.Lambda.Serialization.SystemTextJson

Чтобы решить эту проблему, просто замените пакет следующим:

Amazon.Lambda.Serialization.Json

и обновите атрибут сборки следующим образом:

[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))]

namespace LambdaFunctions
{
    ...

Этот пакет сериализации упомянут в AWS Документации здесь в разделе «Сериализация лямбда-функций».

Однако Amazon еще не обновил примеры SDK, чтобы отразить это изменение (или, по крайней мере, конкретно этот пример), что привело к сбою функции при развертывании.

...