Я использую шланг 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:
Я забыл добавить атрибут сборки сериализатора в исходный блок кода который в конечном итоге стал источником проблемы.