AWS CLIを使ったKinesisチュートリアル

# 概要
kinesisの管理画面では、Data Streamの中にデータが入っているのかわからない。
結果として、AWS CLIでKinesisに直接データを突っ込んで様子をみるのが一番わかりやすい。
この記事では、Kinesisのレコードに実際にデータを追加し、管理画面でどのように表示されるかを確認するまでやります。
主に以下のURLを参考にチュートリアルを進めていきます。

[**AWS DOCS - 基本的なストリームオペレーションの実行**](https://docs.aws.amazon.com/ja_jp/streams/latest/dev/fundamental-stream.html)

# AWS CLIでKinesisに直接データをつっこむ


以下、Kinesis Data Streams のアーキテクチャの概要
[![Kinesis Data Streams のアーキテクチャの概要](https://docs.aws.amazon.com/ja_jp/streams/latest/dev/images/architecture.png)](https://docs.aws.amazon.com/ja_jp/streams/latest/dev/images/architecture.png)

## ストリームの作成
KinesisでData Streamを作成する。
`--stream-name`はストリームの名前、`--shard-count`はシャードの個数を指定。
ストリームの中に、シャードというキューを作るイメージ。
シャードは１つのストリームに複数個作成できて、そこに並列でデータを投入できる。

__※ awsコマンドを実行する際、必要な人は --profile, --region オプションを追加してください__

```Bash
# ↓ 必要な場合は --profile, --region オプションを追加する
aws kinesis create-stream --stream-name <ストリーム名> --shard-count <シャード数>
```

## ストリームの確認
ストリームが作られているかは、以下のコマンドで確認

### ストリームの状態を表示

```Bash
aws kinesis describe-stream --stream-name <ストリーム名>
# "StreamStatus": "ACTIVE" となれば、ストリームが完成
```
### ストリームの一覧を表示

```Bash
aws kinesis list-streams
# "StreamNames": に設定したストリーム名があればOK
```

## レコードを入力する
KinesisのData Streamの中にシャード（キューのようなもの）があり、その中にレコード（データ）を追加していく。

### 文字列をレコードに登録する場合

```Bash
# `--partition-key` はどのシャードにデータを送るかをハッシュ値を使って決めてくれる 

# "ShardId": "shardId-000000000000" と出力されればOK
aws kinesis put-record --stream-name <ストリーム名> --partition-key 123 --data <レコードに保存したい文字列>
```

### jsonファイルをレコードに登録する場合 
#### a. jsonファイルの作成

```Json
{
  "Records": [
    {
      "Data": "<レコードに保存したい文字列1>",
      "PartitionKey": "123"
    },
    {
      "Data": "<レコードに保存したい文字列2>",
      "PartitionKey": "123"
    }
  ],
  "StreamName": "<ストリーム名>"
}
```

#### b. jsonファイルの登録

```Bash
# "FailedRecordCount": 0 と出力されればOK
aws kinesis put-records --cli-input-json file://<jsonファイルへのフルパス>
```

### 参考URL
- [Qiita - AWS Kinesisのシャード割り当てのルール](https://qiita.com/ssossan/items/8acfb380493cbfc7fbee)
- [Qiita - [JAWS-UG CLI] Kinesis:#4 複数データレコードの一括入力 / 取得](https://qiita.com/daikumatan/items/7e42247acd92a4b37c24)

- [Developers.IO - Kinesisの複数PUT対応APIを試してみた](https://dev.classmethod.jp/cloud/aws/kinesis-put-records-cli/)

## レコードの確認

**get-record.sh** というファイルを作成し、以下をコピペ、<ストリーム名>を修正

```Bash
#!/bin/bash
SHARD_ITERATOR=$(aws kinesis get-shard-iterator --shard-id shardId-000000000000 --shard-iterator-type TRIM_HORIZON --stream-name <ストリーム名> --query 'ShardIterator')

aws kinesis get-records --shard-iterator $SHARD_ITERATOR
```
スクリプトを実行

```Bash
./get-record.sh
# "Data":"XXXXXXX", の部分が入力したデータ
```

get-recordした結果、Dataによくわからない文字列が入っている。
これは、入力したデータをKinesisがBase64 エンコーディングしているから文字化けしているように見える。
Base64 デコーディングをすると元のデータが見れる。
Base64 デコーディングしてくれるサイト: https://www.base64decode.org/ 

## ストリームの削除
一度作ったストリームは課金されるので、必要ない場合は削除する

```Bash
aws kinesis delete-stream --stream-name <ストリーム名>
```
ストリームが本当に削除されたかを確認

```Bash
aws kinesis describe-stream --stream-name <ストリーム名>
# A client error (ResourceNotFoundException) が出力されればOK
```

# AWSコンソールでKinesisのData Streamにデータが送られていたかを確認

AWS Kinesis → Data Stream → ストリーム名 → モニタリングへ移動
`受信データ (バイト) — 合計 ` と　`受信データ (数) — 合計 ` の図を確認

※ 以下は画像が古いが、こんな感じでモニタリングできる
[![ストリームの詳細](https://docs.aws.amazon.com/ja_jp/streams/latest/dev/images/sample_graphs.png)](https://docs.aws.amazon.com/ja_jp/streams/latest/dev/images/sample_graphs.png)

図の中に青い丸、もしくは青い線があればOK
※ 上の赤い線は制限値(Maxの値)なので無視してOK

# まとめ
Kinesis はライブラリから使うことが多いので、実際の動きを把握できていないひとも多いと思う。
AWS CLIを使ってKinesisにデータがどのように追加されるのかを確認すると理解が捗る。
また、データが追加されたときの管理画面の挙動もわかるのでおすすめ。

# その他、参考URL
[Qiita - PythonでKinesis操作する](https://qiita.com/shuuhei/items/6397917558ac343a79fa)
[Developers.IO - AWS SDK for JavaでKinesisにアクセスする](https://dev.classmethod.jp/cloud/aws/java-kinesis/)

お読みいただき誠にありがとうございました。 m(_ _)m