Erik Robertson
06/10/2022, 10:08 AMArpad
06/10/2022, 10:28 AMErik Robertson
06/10/2022, 2:10 PMJonathan Poissant
06/10/2022, 2:34 PMJonathan Poissant
06/10/2022, 2:36 PM# Firehose used to handle writing all data into S3
IoTFirehoseDataLake:
Type: AWS::KinesisFirehose::DeliveryStream
Properties:
DeliveryStreamName: !Sub ${namespace}-IoTFirehose
DeliveryStreamType: DirectPut
ExtendedS3DestinationConfiguration:
BucketARN: !Ref dataLakeBucketArn
BufferingHints:
IntervalInSeconds: 300
SizeInMBs: 32
CompressionFormat: GZIP
Prefix: "iot/"
RoleARN: !GetAtt IoTFirehoseDataLakeStreamRole.Arn
Erik Robertson
06/10/2022, 6:04 PMTimothée Clain
06/17/2022, 6:54 PMTimothée Clain
06/17/2022, 6:56 PMconst glueRole = new Role(this, "glue-catalog-role", {
assumedBy: new ServicePrincipal("<http://glue.amazonaws.com|glue.amazonaws.com>"),
managedPolicies: [
ManagedPolicy.fromAwsManagedPolicyName(
"service-role/AWSGlueServiceRole"
),
],
inlinePolicies: {
readS3Files: new PolicyDocument({
statements: [
new PolicyStatement({
actions: ["s3:*"],
effect: Effect.ALLOW,
resources: [`${this.datalakeBucket.s3Bucket.bucketArn}/*`],
}),
],
}),
},
});
const eventsCrawler = new Glue.CfnCrawler(
this,
"crawler",
{
role: glueRole.roleArn,
schedule: {
scheduleExpression: "cron(0/30 * * * ? *)",
},
databaseName: "lake",
targets: {
s3Targets: [
{
path: `s3://${datalakeBucket.bucketName}/${rootS3Paths.platformEvents}`,
},
],
},
}
);
// athena
const athenaWg = new Athena.CfnWorkGroup(this, `athenawg-${scope.stage}`, {
name: `pillardatalake-${scope.stage}`,
workGroupConfiguration: {
enforceWorkGroupConfiguration: true,
publishCloudWatchMetricsEnabled: true,
resultConfiguration: {
outputLocation: `s3://${datalakeBucket.bucketName}/athena-results`,
},
},
});
// kinesis
const productEventsdatalakeBucketDestination =
// FIXME: type are not compatible
new KinesisFirehoseDestinationsConstruct.S3Bucket(
datalakeBucket.s3Bucket,
{
dataOutputPrefix: `${rootS3Paths.platformEvents}/`,
}
);
// event streams
this.productEventStream = new sst.KinesisStream(
this,
`productEventsStream-${scope.stage}`,
{
kinesisStream: {
streamName: `productEventsStream-${scope.stage}`,
},
}
);
// s3 delivery routing for product events
new KinesisFirehoseConstruct.DeliveryStream(this, "Delivery Stream", {
sourceStream: this.productEventStream.kinesisStream,
destinations: [productEventsdatalakeBucketDestination],
});
}
// a snippet with support for athena / kinesis / s3 / firehose. hope it’s helpfulTimothée Clain
06/17/2022, 6:56 PM