AWSでストリーミングデータをテストするときにKDGをつかってみる


# はじめに
### KDG(Amazon Kinesis Data Generator)とは
AWSでストリーミングデータ処理サービス(Kinesis Data Streams, Data Firehose)を実装する際、
検証としてダミーのストリーミングデータを使いたい場合があるかと思います。
この時、ストリーミングデータのテストを行うときのツールとして、
Amazon Kinesis Data Generator (以下KDG)が提供されています[^4]。

:::note notice
Data Firehoseのコンソールからも「デモデータでテスト」が可能ですが、
KDGを使うと、[送信間隔](#送信頻度の設定)など細かい設定が可能です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618752/ed51b900-baa8-e649-3d27-0c9f654eb3e3.png)
:::


### 本記事の内容
本記事では、KDGを使うまでの手順を残しています。
以下ページを参考にしています。

https://awslabs.github.io/amazon-kinesis-data-generator/web/help.html




# 準備
### Firehoseの作成
KDGのデータ配信先として設定するData Firehoseを事前に作成しておきます。
 - 送信先：任意のS3バケット／プレフィックス名を指定しました
 - バッファ間隔：早めに繰り返し確認できるように、300秒 → 10秒に設定しました
 - その他：デフォルト設定のまま
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618752/82e3b2dd-6a21-b882-eb77-ef7af2c39154.png)


### GitHubプロジェクトをクローン
KDGのGitHubプロジェクト[^2]をローカルリポジトリにクローンします。


### デプロイファイルを準備
KDGの実行環境はCloudFormationテンプレートを使ってデプロイするため、
テンプレートyamlファイルの格納先となるS3バケットへの記述となるようにスクリプトを修正します。
```bash: deployディレクトリ内 deploy.sh の記述を更新
#!/bin/bash
aws s3 cp ../setup/cognito-setup.yaml s3://<テンプレートyamlファイル格納先S3バケット>/cognito-setup.yaml
```


コマンドラインからCLIアップロードします。
```bash: 
$ cd amazon-kinesis-data-generator/deploy/
$ ./deploy.sh
upload: ../setup/cognito-setup.yaml to s3://qiita-tamabe-bucket/cognito-setup.yaml
```


# KDG実装
### CloudFormationでAmazon Cognitoユーザーを作成
アップロードしたyamlファイルからCloudFormationスタックを作成します。
まずYAMLファイル格納先のURLをコピーして、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618752/16fac95a-1cdc-69a1-5f2d-76a03f1d6968.png)


CloudFormationスタックの作成画面で貼り付けて、「次へ」。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618752/7141d799-042c-6da7-fdfa-fc3004f3c4bd.png)

Cognitoユーザー情報となる値（任意、KDGログイン時に使用）を登録し、「次へ」。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618752/a9e3e509-f59a-70b4-e2bc-270435c63f6b.png)


「AWS CloudFormation によって IAM リソースがカスタム名で作成される場合があることを承認します。」をチェックし、「次へ」

ここまでの設定確認画面の内容を最終確認し、「送信」

これで、KDGのデプロイが行われます。




# KDG利用
### KDGへのログイン
CloudFormationスタックの作成が完了したら、出力タブに移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618752/efa9f583-7d0e-d246-2351-bbe260d4dba0.png)


「KinesisDataGeneratorUrl」の値（KDGのURL）をクリックすると、KDGログイン画面に遷移するので、
先程Stack作成時に登録した、Cognitoユーザー情報を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618752/4ad16438-07a4-6c2c-923d-5599dd886a54.png)


### Firehoseとの接続設定
作成しておいたData Firehoseを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618752/905d5e0e-6297-14bf-e525-e1327617b47e.png)



### 送信頻度の設定
「Constant」と「Periodic」のモードが選択できて、
「Constant」の場合は、送信間隔（秒）、データ圧縮可否を選択できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618752/e146694b-1b1d-ec46-2d08-73c3a29a35d7.png)

「Periodic」の場合は、より細かい送信スケジューリングが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618752/d2cca2cb-c9e7-0c8c-987f-51f5cecec88a.png)



### データ用のレコードテンプレートを作成
テンプレートは、任意のデータ構造を設定できるようです。

```json:サンプルテンプレート
{ 
    "sensorId": {{random.number(50)}}, 
    "currentTemperature": {{random.number( 
        { 
            "min":10, 
            "max":150 
        } 
    )}}, 
    "status": "{{random.arrayElement( 
        ["OK","FAIL","WARN"] 
    )}}" 
}
```

画面下部の「Test template」をクリックすると、生成されるレコードのサンプルを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618752/7ad51fcc-8545-b6b0-53f4-0bc223810089.png)



### テストデータ生成
画面下部の「Send data」をクリックすると、実際にストリーミングデータが配信されます。

:::note warn
**データ配信開始後、「Stop Sening Data to Kinesis」を押さないとデータ配信が続くので注意ください**
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618752/78b716ac-ceb5-09fb-e419-1946055bc4bf.png)





### 送信結果の確認
Data Firehoseの送信先S3バケット／プレフィックスを確認すると、
「YYYY/MM/dd/HH」(UTC) のプレフィックスが自動作成され、その配下にデータを確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618752/e6057f30-e505-0ab1-5c18-54fdf61ea7aa.png)

データを開くと、テンプレートに基づいたデータ構造のレコードが入っていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618752/f1cec3d9-c5e2-66d4-85d9-0e973b956ec8.png)



# 参考URL
この記事で参考にしたURLです。
[^1]:AWS記事：サンプルデータを使用した Firehose ストリームのテスト
https://docs.aws.amazon.com/ja_jp/firehose/latest/dev/test-drive-firehose.html

[^2]:GitHub：amazon-kinesis-data-generator
https://github.com/awslabs/amazon-kinesis-data-generator

[^3]:GitHub：Configure Your AWS Account
https://awslabs.github.io/amazon-kinesis-data-generator/web/help.html

[^4]:AWSブログ：Amazon Kinesis Data Generatorを使用してストリーミングデータソリューションをテストする
https://aws.amazon.com/jp/blogs/news/test-your-streaming-data-solution-with-the-new-amazon-kinesis-data-generator/