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
),
)
)
],
)