def get_analytics_dataset()

in cdk-iot-analytics/cdk_sap_blog/analytics/analytics.py [0:0]


def get_analytics_dataset(scope, datastore_name, input_name):
    bucket_name = f"cdksap-{scope.account}-{scope.thing_name}"
    dataset_name = "CDKSAPBlogAnalyticsDataset"

    bucket_service_role = iam.Role(
        scope=scope,
        id="CDKSAPBlogDatasetBucketRole",
        role_name="CDKSAPBlogDatasetBucketRole",
        assumed_by=iam.ServicePrincipal('iotanalytics.amazonaws.com')
    )
    bucket_service_role.add_to_policy(
        iam.PolicyStatement(
            effect=iam.Effect.ALLOW,
            resources=[f'arn:aws:s3:::{bucket_name}/*'],
            actions=['s3:PutObject',]
        )
    )
    bucket = s3.Bucket(
        scope=scope,
        id=bucket_name,
        bucket_name=bucket_name,
        block_public_access=s3.BlockPublicAccess.BLOCK_ALL,
        public_read_access=False,
        removal_policy=core.RemovalPolicy.DESTROY
    )

    # outputß
    core.CfnOutput(
        scope=scope,
        id="AnalyticsBucketURI",
        export_name=f"AnalyticsBucketURI",
        value=f"s3://{bucket.bucket_name}"
    )


    dataset_service_role = iam.Role(
        scope=scope,
        id="CDKSAPBlogDatasetInputRole",
        role_name="CDKSAPBlogDatasetInputRole",
        assumed_by=iam.ServicePrincipal('iotanalytics.amazonaws.com')
    )
    dataset_service_role.add_to_policy(
        iam.PolicyStatement(
            effect=iam.Effect.ALLOW,
            resources=[f'arn:aws:iotevents:{scope.region}:{scope.account}:input/{input_name}'],
            actions=['iotevents:BatchPutMessage',]
        )
    )
    return analytics.CfnDataset(
        scope=scope,
        id=dataset_name,
        dataset_name=dataset_name,
        actions=[
            analytics.CfnDataset.ActionProperty(
                action_name="QueryAnalyticsDatastore",
                query_action=analytics.CfnDataset.QueryActionProperty(
                    sql_query=f'''SELECT max(timestamp) AS endTime, (to_unixtime(from_iso8601_timestamp(max(timestamp))) - to_unixtime(from_iso8601_timestamp(min(timestamp)))) AS durS, max_by(thingname, timestamp) as thingname, avg(temperature_degC) AS temperature_degC_mean, avg(humidity_percent) AS humidity_percent_mean, avg(dewpoint_degC) AS dewpoint_degC_mean, avg(heatIndex_degC) AS heatIndex_degC_mean, max_by(range.temperature.max, timestamp) AS maxTemp_degC, max_by(range.temperature.min, timestamp) AS minTemp_degC, max_by(location, timestamp) AS location, max_by(FunctLoc, timestamp) as FunctLoc, max_by(Equipment, timestamp) as Equipment, max_by(Type, timestamp) as Type FROM {datastore_name}''',
                    filters=[
                        analytics.CfnDataset.FilterProperty(
                            delta_time=analytics.CfnDataset.DeltaTimeProperty(
                                offset_seconds=-5,
                                time_expression='from_iso8601_timestamp(timestamp)'
                            )
                        )
                    ]
                )
            )
        ],
        triggers=[
            analytics.CfnDataset.TriggerProperty(
                schedule=analytics.CfnDataset.ScheduleProperty(
                    schedule_expression='cron(0/1 * * * ? *)'
                )
            )
        ],
        retention_period=analytics.CfnDataset.RetentionPeriodProperty(
            number_of_days=90,
            unlimited=False
        ),
        versioning_configuration=analytics.CfnDataset.VersioningConfigurationProperty(
            unlimited=True
        ),
        content_delivery_rules=[
            analytics.CfnDataset.DatasetContentDeliveryRuleProperty(
                destination=analytics.CfnDataset.DatasetContentDeliveryRuleDestinationProperty(
                    s3_destination_configuration=analytics.CfnDataset.S3DestinationConfigurationProperty(
                        bucket=bucket_name,
                        key=f"{dataset_name}/Version/!{{iotanalytics:scheduleTime}}_!{{iotanalytics:versionId}}.csv",
                        role_arn=bucket_service_role.role_arn
                    ),
                )
            ),
            analytics.CfnDataset.DatasetContentDeliveryRuleProperty(
                destination=analytics.CfnDataset.DatasetContentDeliveryRuleDestinationProperty(
                    iot_events_destination_configuration=analytics.CfnDataset.IotEventsDestinationConfigurationProperty(
                        input_name=input_name,
                        role_arn=dataset_service_role.role_arn
                    ),
                )
            )
        ],
    )