constructor()

in lib/stacks/data-lake-stack.ts [31:145]


    constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
        super(scope, id);

        /* PARAMETERS */
        const assetModelId = new cdk.CfnParameter(this, 'TurbineAssetModelID', {
            type: 'String',
            description: 'Provide an ID for a Turbine asset model.'
        });

        const shardCount = new cdk.CfnParameter(this, 'DataLakeIngestStreamShardCount', {
            type: 'Number',
            description: 'Provide an ID for a Turbine asset model.',
            default: 1
        });

        const bufferingIntervalSeconds = new cdk.CfnParameter(this, 'BufferingIntervalSeconds', {
            type: 'Number',
            description: 'Provide a buffering interval in seconds for delivery to S3.',
            default: 60
        });

        const bufferingIntervalMB = new cdk.CfnParameter(this, 'BufferingIntervalMB', {
            type: 'Number',
            description: 'Provide a buffering interval in MB for delivery to S3.',
            default: 1
        });

        const memoryStoreRetentionPeriodInHours = new cdk.CfnParameter(this, 'MemoryStoreRetentionPeriodInHours', {
            type: 'Number',
            description: 'Numbner of hours to store data in memory in Timestream.',
            default: 24
        });

        const magneticStoreRetentionPeriodInDays = new cdk.CfnParameter(this, 'MagneticStoreRetentionPeriodInDays', {
            type: 'Number',
            description: 'Number of days to store data on magnetic volumes in Timestream..',
            default: 7
        });

        /* RESOURCES */
        this.ingestionStream = new DataLakeIngestionStream(this, 'DataLakeIngestionStream', {
            name: 'data-lake-ingest-stream',
            shardCount: shardCount.valueAsNumber
        });

        this.iotRule = new SendToDataLakeRule(this, 'SendToDataLakeIoTRule', {
            dataLakeIngestStream: this.ingestionStream,
            assetModelId: assetModelId.valueAsString
        });

        this.targetTimestream = new TimestreamAssetDataTarget(this, 'TimestreamAssetDataTarget', {
            tableName: 'TimestreamAssetDataTargetTable',
            databaseName: 'TimestreamAssetDataTargetDatabase',
            memoryStoreRetentionPeriodInHours: memoryStoreRetentionPeriodInHours.valueAsNumber,
            magneticStoreRetentionPeriodInDays: magneticStoreRetentionPeriodInDays.valueAsNumber
        });

        this.targetBucket = new s3.Bucket(this, 'S3AssetDataTarget', {
            bucketName: `${uid.vend().toLowerCase()}-asset-data`
        });

        this.mapBucket = new s3.Bucket(this, 'AssetPropertyAliasMapBucket', {
            bucketName: `${uid.vend().toLowerCase()}-asset-property-alias-map-bucket`
        });


        this.deliveryStream = new FirehoseToS3DeliveryStream(this, 'DataLakeFirehoseToS3', {
            name: 'DataLakeFirehoseToS3',
            targetS3Bucket: this.targetBucket,
            bufferingIntervalSeconds: bufferingIntervalSeconds.valueAsNumber,
            bufferingIntervalMB: bufferingIntervalMB.valueAsNumber
        });

        this.forkLambda = new DataLakeIngestionForkLambda(this, 'DataLakeIngestionForkLambda', {
            assetMapBucket: this.mapBucket,
            dataLakeIngestStream: this.ingestionStream.stream,
            firehoseToS3DeliveryStream: this.deliveryStream.deliveryStream,
            timestreamTargetTable: this.targetTimestream.table
        });

        const assetMapperLambda = new AssetMapperLambda(this, 'AssetMapperLambda', {
            assetModelId: assetModelId.valueAsString,
            assetMapBucket: this.mapBucket
        });

        const assetMapProvider = new cr.Provider(this, 'AssetMapProvider', {
            onEventHandler: assetMapperLambda.lambda,
            logRetention: logs.RetentionDays.ONE_DAY
        });

        const assetMap = new cdk.CustomResource(this, 'AssetMap', {
            serviceToken: assetMapProvider.serviceToken
        });

        /* OUTPUTS */
        new cdk.CfnOutput(this, 'TargetS3BucketName', {
            value: this.targetBucket.bucketName,
            description: 'Name of S3 bucket for accumulating asset data.'
        });

        new cdk.CfnOutput(this, 'MapBucketName', {
            value: this.mapBucket.bucketName,
            description: 'Name of S3 bucket for accumulating asset data.'
        });

        new cdk.CfnOutput(this, 'TargetTimestreamDatabaseName', {
            value: this.targetTimestream.database.databaseName || '',
            description: 'Name of Timestream database for accumulating asset data.'
        });

        new cdk.CfnOutput(this, 'TargetTimestreamTableName', {
            value: this.targetTimestream.table.tableName || '',
            description: 'Name of Timestream table for accumulating asset data.'
        });
    }