#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()
?