package com.amazonaws.proserv.lambda; import com.amazonaws.services.kinesisfirehose.model.*; import com.amazonaws.services.kinesisfirehose.AmazonKinesisFirehoseClient; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.LambdaLogger; import com.amazonaws.services.lambda.runtime.events.KinesisEvent; import java.nio.ByteBuffer; import java.util.Date; /** * Created by dgraeber on 6/18/2015. */ public class KinesisToFirehose { private String firehoseEndpointURL = "https://firehose.us-east-1.amazonaws.com"; private String deliveryStreamName = "blogfirehose"; private String deliveryStreamRoleARN = "arn:aws:iam::<AWS Acct Id>:role/firehose_blog_role"; private String targetBucketARN = "arn:aws:s3:::dgraeberaws-blogs"; private String targetPrefix = "blogoutput/"; private int intervalInSec = 60; private int buffSizeInMB = 2; private AmazonKinesisFirehoseClient firehoseClient = new AmazonKinesisFirehoseClient(); private LambdaLogger logger; public void kinesisHandler(KinesisEvent event, Context context){ logger = context.getLogger(); setup(); for(KinesisEvent.KinesisEventRecord rec : event.getRecords()) { logger.log("Got message "); String msg = new String(rec.getKinesis().getData().array())+"\n"; Record deliveryStreamRecord = new Record().withData(ByteBuffer.wrap(msg.getBytes())); PutRecordRequest putRecordRequest = new PutRecordRequest() .withDeliveryStreamName(deliveryStreamName) .withRecord(deliveryStreamRecord); logger.log("Putting message"); firehoseClient.putRecord(putRecordRequest); logger.log("Successful Put"); } } private void setup(){ firehoseClient = new AmazonKinesisFirehoseClient(); firehoseClient.setEndpoint(firehoseEndpointURL); checkHoseStatus(); } private void checkHoseStatus(){ DescribeDeliveryStreamRequest describeHoseRequest = new DescribeDeliveryStreamRequest() .withDeliveryStreamName(deliveryStreamName); DescribeDeliveryStreamResult describeHoseResult = null; String status = "UNDEFINED"; try { describeHoseResult = firehoseClient.describeDeliveryStream(describeHoseRequest); status = describeHoseResult.getDeliveryStreamDescription().getDeliveryStreamStatus(); } catch (Exception e) { System.out.println(e.getLocalizedMessage()); logIt("Firehose Not Existent...will create"); createFirehose(); checkHoseStatus(); } if(status.equalsIgnoreCase("ACTIVE")){ logIt("Firehose ACTIVE"); //return; } else if(status.equalsIgnoreCase("CREATING")){ logIt("Firehose CREATING"); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } checkHoseStatus(); } else { logIt("Status = " + status); } } private void createFirehose(){ BufferingHints buffHints = new BufferingHints() .withIntervalInSeconds(intervalInSec) .withSizeInMBs(buffSizeInMB); S3DestinationConfiguration s3DestConf = new S3DestinationConfiguration() .withBucketARN(targetBucketARN) .withCompressionFormat(CompressionFormat.UNCOMPRESSED) .withPrefix(targetPrefix) .withBufferingHints(buffHints) .withRoleARN(deliveryStreamRoleARN); CreateDeliveryStreamRequest createHoseRequest = new CreateDeliveryStreamRequest() .withDeliveryStreamName(deliveryStreamName) .withS3DestinationConfiguration(s3DestConf); logIt("Sending create firehose request"); firehoseClient.createDeliveryStream(createHoseRequest); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } private void logIt(String message){ if(logger!=null) logger.log(message); else System.out.println(message); } private void listFirehose(){ ListDeliveryStreamsRequest listHosesRequest = new ListDeliveryStreamsRequest(); ListDeliveryStreamsResult lhr = firehoseClient.listDeliveryStreams(listHosesRequest); for(String name:lhr.getDeliveryStreamNames()){ logIt(name); } } private void deleteFirehose(){ deleteFirehose(deliveryStreamName); } private void deleteFirehose(String delivStreamName){ DeleteDeliveryStreamRequest deleteHoseRequest= new DeleteDeliveryStreamRequest(); deleteHoseRequest.setDeliveryStreamName(delivStreamName); firehoseClient.deleteDeliveryStream(deleteHoseRequest); } private void putSampleMessages(){ setup(); for(int i = 0; i<20000; i++) { String message = "{\"timestamp\":\"" + new Date().getTime() + "\"}"; Record record = new Record() .withData(ByteBuffer.wrap(message.getBytes())); PutRecordRequest putRecordInHoseRequest = new PutRecordRequest() .withDeliveryStreamName(deliveryStreamName) .withRecord(record); PutRecordResult res = firehoseClient.putRecord(putRecordInHoseRequest); logIt(res.toString()); } } //FOR TESTING LOCALLY ONLY // public static void main(String[] args){ //KinesisToFirehose kinesisToFirehose = new KinesisToFirehose(); //kinesisToFirehose.checkHoseStatus(); //kinesisToFirehose.listFirehose(); //kinesisToFirehose.setup(); //kinesisToFirehose.putSampleMessages(); // } }