# Welcome to your CDK project!
# IoT Data visulaization with Amazon Kinesis
The `cdk.json` file tells the CDK Toolkit how to execute your app.
This project is set up like a standard Python project. The initialization
process also creates a virtualenv within this project, stored under the `.venv`
directory. To create the virtualenv it assumes that there is a `python3`
(or `python` for Windows) executable in your path with access to the `venv`
package. If for any reason the automatic creation of the virtualenv fails,
you can create the virtualenv manually.
To manually create a virtualenv on MacOS and Linux:
```
$ python3 -m venv .venv
```
After the init process completes and the virtualenv is created, you can use the following
step to activate your virtualenv.
```
$ source .venv/bin/activate
```
If you are a Windows platform, you would activate the virtualenv like this:
```
% .venv\Scripts\activate.bat
```
Once the virtualenv is activated, you can install the required dependencies.
```
$ pip install -r requirements.txt
```
At this point you can now synthesize the CloudFormation template for this code.
```
$ cdk synth
```
To add additional dependencies, for example other CDK libraries, just add
them to your `setup.py` file and rerun the `pip install -r requirements.txt`
command.
## Useful commands
* `cdk ls` list all stacks in the app
* `cdk synth` emits the synthesized CloudFormation template
* `cdk deploy` deploy this stack to your default AWS account/region
* `cdk diff` compare deployed stack with current state
* `cdk docs` open CDK documentation
## Context parameters
There are multiple context parameters that you need to set before synthesizing or delpoying this CDK stack. You can specify a context variable either as part of an AWS CDK CLI command, or in `cdk.json`.
To create a command line context variable, use the __--context (-c) option__, as shown in the following example.
```
$ cdk cdk synth -c bucket_name=mybucket
```
To specify the same context variable and value in the cdk.json file, use the following code.
```
{
"context": {
"bucket_name": "mybucket"
}
}
```
In this project, these are the following parameters to be set:
* `topic_sql`
It is required for IoT Core rule creation to add a simplified SQL syntax to filter messages received on an MQTT topic and push the data elsewhere.
__Format__: Enter an SQL statement using the following: ```SELECT FROM WHERE ```. For example: ```SELECT temperature FROM 'iot/topic' WHERE temperature > 50```. To learn more, see AWS IoT SQL Reference.
* `kinesis_destination_bucket_name` ``
To specify the destination settings for your delivery stream, a s3 bucket must be created and this parameter is for setting the name of it.
__Format__: Bucket name must be unique and must not contain spaces or uppercase letters. [See rules for bucket naming](https://docs.aws.amazon.com/console/s3/bucket-naming)
* `kinesis_delivery_stream_name` ``
The name of the Kinesis delivery stream to get your data and send them to the s3 bucket.
__Format__: Acceptable characters are uppercase and lowercase letters, numbers, underscores, hyphens, and periods.
* `kinesis_delivery_stream_role_name` ``
An IAM role should be created to grant Firehose access to your s3 bucket. This parameter is for setting the name of this role.
__Format__: Enter a unique role name that contains alphanumeric characters, hyphens, and underscores. A role name can't contain any spaces.
* `kinesis_iot_rule_name` ``
The name of the IoT Core rule that is going to be created.
__Format__: Should be an alphanumeric string that can also contain underscore (_) characters, but no spaces.
* `kinesis_iot_role_name` ``
An IAM role should be created to grant AWS IoT access to your endpoint. This parameter is for setting the name of this role.
__Format__: Enter a unique role name that contains alphanumeric characters, hyphens, and underscores. A role name can't contain any spaces.
* `glue_crawler_name` ``
A Glue crawler should be created to crawl the data in your s3 bucket. This parameter is for setting the name of this cralwer.
* `glue_db_name` ``
A Glue database should be created to connect to the crawler and store data. This parameter is for setting the name of this database.
* `glue_crawler_role_name` ``
An IAM role should be created to grant Glue access to your s3 bucket. This parameter is for setting the name of this role.
__Format__: Enter a unique role name that contains alphanumeric characters, hyphens, and underscores. A role name can't contain any spaces.
Enjoy!