Java Лямбда не считывает записи из событий Kinesis

#java #amazon-web-services #aws-lambda #amazon-kinesis

Вопрос:

Я пытаюсь считывать события из потока данных Kinesis в Лямбду, написанную как на Java, так и на Python. События передаются в Kinesis из DMS и, наконец, читаются на Java.

Вот мой java-код

 public class RequestEventHandler implements RequestHandlerlt;KinesisEvent, Voidgt; {   @Override  public Void handleRequest(KinesisEvent kinesisEvent, Context context) {  System.out.println("kinesis handler called");  System.out.println("kinesisEvent::: "   kinesisEvent);  System.out.println("kinesisContext::: "   context);  for (KinesisEvent.KinesisEventRecord record : kinesisEvent.getRecords()) {  System.out.println("KinesisEventRecord:::"   record);  System.out.println("KinesisRecord:::"   record.getKinesis());  /* String data = new String(Base64.decode(record.getKinesis().getData().array()));  System.out.println("data from kinesis record "   data);*/  }  return null;  } }   

Добавленные зависимости находятся в pom.xml является

 lt;dependencygt;  lt;groupIdgt;com.amazonawslt;/groupIdgt;  lt;artifactIdgt;aws-java-sdk-corelt;/artifactIdgt;  lt;versiongt;1.11.619lt;/versiongt;  lt;scopegt;compilelt;/scopegt; lt;/dependencygt; lt;dependencygt;  lt;groupIdgt;com.amazonawslt;/groupIdgt;  lt;artifactIdgt;aws-java-sdk-eventslt;/artifactIdgt;  lt;versiongt;1.11.619lt;/versiongt; lt;/dependencygt; lt;dependencygt;  lt;groupIdgt;com.amazonawslt;/groupIdgt;  lt;artifactIdgt;aws-java-sdk-kinesislt;/artifactIdgt;  lt;versiongt;1.11.619lt;/versiongt; lt;/dependencygt; lt;dependencygt;  lt;groupIdgt;com.amazonawslt;/groupIdgt;  lt;artifactIdgt;aws-lambda-java-corelt;/artifactIdgt;  lt;versiongt;1.1.0lt;/versiongt; lt;/dependencygt; lt;dependencygt;  lt;groupIdgt;com.amazonawslt;/groupIdgt;  lt;artifactIdgt;aws-lambda-java-eventslt;/artifactIdgt;  lt;versiongt;1.3.0lt;/versiongt; lt;/dependencygt;  

Вот мой код на Python

 from __future__ import print_function import json import base64 import time def lambda_handler(event, context):  print("Hello world Trigger")  print("event:", event)  for record in event['Records']:  #print(record)  #Kinesis data is base64 encoded so decode here  print(record["kinesis"]["data"])  payload=base64.b64decode(record["kinesis"]["data"])  print("Decoded payload: "   str(payload))  print("Lambda function ARN:", context.invoked_function_arn)  print("CloudWatch log stream name:", context.log_stream_name)  print("CloudWatch log group name:", context.log_group_name)  print("Lambda Request ID:", context.aws_request_id)  print("Lambda function memory limits in MB:", context.memory_limit_in_mb)  # We have added a 1 second delay so you can see the time remaining in get_remaining_time_in_millis.  time.sleep(1)   print("Lambda time remaining in MS:", context.get_remaining_time_in_millis())  

То, что мы замечаем, относится к одному и тому же событию, которое выглядит примерно так

 {  "Records": [  {  "kinesis": {  "partitionKey": "partitionKey-03",  "kinesisSchemaVersion": "1.0",  "data": "SGVsbG8sIHRoaXMgaXMgYSB0ZXN0IDEyMy4=",  "sequenceNumber": "49545115243490985018280067714973144582180062593244200961",  "approximateArrivalTimestamp": 1428537600  },  "eventSource": "aws:kinesis",  "eventID": "shardId-000000000000:49545115243490985018280067714973144582180062593244200961",  "invokeIdentityArn": "arn:aws:iam::EXAMPLE",  "eventVersion": "1.0",  "eventName": "aws:kinesis:record",  "eventSourceARN": "arn:aws:kinesis:EXAMPLE",  "awsRegion": "us-east-1"  }  ] }  

Код Python способен извлекать записи и данные из события, но обработчик java не может анализировать записи и kinesisEvent.GetRecords() всегда имеет значение null, код java регистрирует его как

 kinesis handler called kinesisEvent::: {[{eventSource: aws:kinesis,kinesis: {SequenceNumber: 49545115243490985018280067714973144582180062593244200961,ApproximateArrivalTimestamp: Thu Apr 09 00:00:00 UTC 2015,Data: java.nio.HeapByteBuffer[pos=0 lim=26 cap=26],PartitionKey: partitionKey-03,KinesisSchemaVersion: 1.0},eventId: shardId-000000000000:49545115243490985018280067714973144582180062593244200961,invokeIdentityArn: arn:aws:iam::EXAMPLE,eventName: aws:kinesis:record,eventSourceARN: arn:aws:kinesis:EXAMPLE,eventSourceARN: arn:aws:kinesis:EXAMPLE,awsRegion: us-east-1}]}  

вы заметите, что в kinesisEvent нет записей, я пробовал использовать несколько версий событий aws-lambda-java, но проблема та же. В чем может быть проблема, стоящая за этим

Комментарии:

1. Значит, ты получаешь NullPointerException «а», когда звонишь kinesisEvent.getRecords() ?