【AWS】解説！Kinesisサービスの要点【Kinesis】

## はじめに

AWSのデータ分析に関する勉強を進める中で避けては通れない内容にKinesisサービスがあります。
Kinesisの主なサービスには「Amazon Kinesis Data Streams」「Amazon Data Firehose (旧 Amazon Kinesis Data Firehose)」「Amazon Managed Service for Apache Flink (旧:Amazon Kinesis Data Analytics)」などがあり、いずれもストリーミングデータを扱うサービスということでどのように使い分けるか混乱することがあります
今回の記事ではそれらのサービスの違いや、Kinesisを使ったよくあるユースケースなどの要点をまとめました

## 1．取り込みデータの種類
Kinesisは主にデータの収集に利用されますが、特に「ストリームデータ」の収集に利用されます
ストリームデータ以外のデータにも利用できないかといわれると決してそうではないのですが、例えばある大量のデータを定期的に一括でS3に投入するようなバッチデータの場合はAWS DataSyncのようなサービスが選択される場合があります。
#### 補足
##### ①ストリーミングデータとは？～継続的に取り込まれるデータ～
・低レイテンシー処理を目的とした継続する増分的な方法で大量に送信されるデータ
・ストリーミングデータには、企業がリアルタイムの分析と、そのビジネスのあらゆる側面に対する可視性のために使用する、ロケーション、イベント、およびセンサーデータが含まれている
参考：https://aws.amazon.com/jp/what-is/streaming-data/
##### ②バッチデータとは？～ストリーミングデータとは？～定期的に取り込まれるデータ～
・アプリケーションログやメディアファイルオブジェクトなどのデータ
・通常、大きなイベントペイロードを処理し、時間単位、日単位、週単位でそれらを取り込む
参考：https://explore.skillbuilder.aws/learn/course/12387/play/49638/exam-readiness-aws-certified-data-analytics-specialty-japanese

## 2．各サービスの概要
#### ①Amazon Kinesis Data Streams
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/1269912a-c082-a982-7acd-44616b347fcd.png)
・ストリームデータを処理するためのアプリケーションを独自に構築
・必要なキャパシティをセットしてストリームを作成するだけで利用可能。スループットやデータ量の変化に応じてスケール
##### (端的にいうと？)
・大量データでもリアルタイムで収集できるサービス

#### ②Amazon Data Firehose
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/1a1caa19-6f29-533f-9db2-acc4a676ebfe.png)

・ストリームデータを、Amazon S3、Amazon Redshift、Amazon OpenSearch Service へ簡単に配信する
・シャードの作成やパーティションキーの指定不要。データのスループットに応じて自動的にスケールする
・シンプルな設定でストリームデータのバッチ化・圧縮・暗号化が可能。秒単位でデータを配信
・Lambdaを利用したストリームデータの変形が可能
##### (端的にいうと？)
・ストリーミングデータをストレージサービスに送信できるがデータ配信は秒単位なので収集スピードはKinesisDataStreamsより遅い。Lambdaでデータカスタマイズもできる

#### ③Amazon Managed Service for Apache Flink (旧:Amazon Kinesis Data Analytics)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/5a9b9d91-8586-10e6-ccc2-cc07ac67f987.png)
・ストリームデータを標準的な SQLクエリでリアルタイムに分析する
・データのスループットに応じて処理能力を伸縮。オペレーションの介入不要
##### (端的にいうと？)
・データ収集されるデータを保存前に分析する。リアルタイムでストリーミングデータを分析して結果を次のサービスに流す



## 3．各サービスの比較

|  |Amazon Kinesis Data Streams |Amazon Data Firehose  |
|---|---|---|
|処理時間 ※1  |ミリ秒 ※2  |0秒 ~ 900秒 ※3 |
|レコード最大サイズ  |1 MB  |1 MB  |
|レコード保持期間 |標準 24 時間、最長 1 年  |24時間  |
|順序の保持  |〇  |×  |
|並列処理  |〇  |×  |
|可用性  |3つのAZ  |3つのAZ  |
|課金単位  |シャードの時間あたりの料金と、PUT ペイロード単位あたりの料金  |サービスを使用して取り込むデータの量と、データ形式の変換  |

※1
Kinesis Data Streamsは処理時間(レイテンシ)、Amazon Data Firehoseはバッファ間隔を記載 
※2
単体の標準コンシューマーで平均 200ms のレイテンシ、拡張コンシューマーで平均 70ms のレイテンシ
※3
間隔が長いほど、データを収集する時間が長くなり、データのサイズが大きくなる場合があります。間隔が短いほど、データが送信される頻度が高くなり、より短期サイクルでデータアクティビティを確認する場合のメリットが多くなる場合があります。


## 4．KinesisDataStreams の構成要素
#### ①データストリーム
・プロデューサーから送信されたデータレコードを保持するデータストア
・単一のデータストリームは複数のシャードから構成されている
・レコードはコンシューマーによって取得、処理される
#### ②シャード
・ストリーム内のリソースの一単位。書き込み、読み取りのスループットがシャードごとに割り当てられており、シャードを増減させることでストリーム全体のキャパシティをコントロールできる
・データの書き込み、取り出しはシャードを指定して行う
#### ③データレコード
・データストリームに送信されるメッセージの一単位
・Base 64 エンコードされたメッセージ本体(データ)、Unicode 文字列のパーティションキー、整数値のハッシュキー(オプション)で構成されている
##### データレコードの制約
・Base64 エンコードされた文字列。最大サイズは 1 MiB
・Unicode 文字。最大 256 文字まで
・整数。値の範囲は 0 から 2^128-1 まで

(2017/10/11 AWS Black Belt Online Seminar Amazon Kinesis より)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/e7e457e6-acf6-062f-aced-9cddfc4d7681.png)


## 5．KinesisDataStreams のキャパシティモード
#### ①オンデマンドモード
・容量計画を必要とせず、1 分あたりの書き込みおよび読み取りスループットのギガバイトを処理するように自動的にスケーリングされる
・オンデマンドモードでは、Kinesis Data Streams は必要なスループットを提供するために、シャードを自動的に管理する
・運用上のオーバーヘッドなしで、1 日あたり数十億ものレコードを取り込むことができる
###### (こんな場合に適している)
・イニシャルのスループット見積もりを行わずに、すぐに利用を開始したい
・予測不可能、不安定なワークロードのため、オートスケールを活用したい
#### ②プロビジョンドモード
・プロビジョンドモードのデータストリームの場合、データストリームのシャードカウントを指定する必要がある
・データストリームの総容量は、シャードの容量の合計です。必要に応じて、データストリームのシャードの数を増減することができる
###### (こんな場合に適している)
・予測可能で安定したワークロードであり、手動スケールで問題なく運用できる
・予測不可能、不安定なワークロードのため、オートスケールを活用したい

#### 料金目安（2023/4 Amazon Kinesis Data Streams AWS Black Belt Online Seminar より）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/6ede249d-2dd6-d824-51d1-6640d1ae09da.png)

## 6．Kinesisを使用したユースケース例

#### ①IoTサービスデータを分析して可視化する構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/9d206033-1056-24f7-0853-a851590d644e.png)
<構成の説明>
・複数のIoTデバイスから取得されるデータをIoTCoreを通してKinesisDataStreamsに送信する
・KinesiDataStreamsに送られたデータをKinesisDataAnalyticss(現 mazon Managed Service for Apache Flink)に送信して内容を分析/加工し、データを各可視化サービスが参照するデータストアへ送信する
・この構成での可視化サービスはよりリアルタイムに結果を確認したい場合は時系列データを保持するTimestreamにデータを保持してGafanaで可視化し、リフレッシュ間隔に依存しても良いような用途にはQuickSightを使用しています

#### ②EC2インスタンスのログをKinesisを通してQuickSightでの可視化する構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/e0ea9f28-984d-b7dd-9872-b18eb879d25e.png)
<構成の説明>
・EC2にインストールされたKinesisAgentを通してAmazon Data Firehoseにログデータが送られます(①)
・Amazon Data Firehoseで取得したログデータはそのままの状態のRawデータをS3に保存し(上②)、一方でKinesisDataAnalytics(現 mazon Managed Service for Apache Flink)に送信します(下②)
・Kinesis AnalyticsではSQLを実行して入力されたログデータを分析/加工し、結果をAmazon Data Firehoseに送信します(③)
・Amazon Data FirehoseはOpenSearchにデータを送信します(④)
・OpenSearchダッシュボードで可視化されたデータをデータ分析担当などのユーザが確認します

## 参考URL
・ストリーミングデータとは
https://aws.amazon.com/jp/what-is/streaming-data/
・データ収集
https://explore.skillbuilder.aws/learn/course/12387/play/49638/exam-readiness-aws-certified-data-analytics-specialty-japanese
・Kinesis Data Streams ブラックベルト
https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2023_AmazonKinesisDataStreams_0430_v1.pdf
・Amazon Kinesis ブラックベルト
https://pages.awscloud.com/rs/112-TZM-766/images/20180110_AWS-BlackBelt-Kinesis.pdf
・Kinesis Data Firehose AWSドキュメント
https://aws.amazon.com/jp/kinesis/data-firehose/features/
・ログ分析
https://d1.awsstatic.com/Projects/P4113850/aws-projects_build-log-analytics-solution-on-aws.pdf
・IoTデータ処理
https://aws.amazon.com/jp/blogs/news/best-practices-for-ingesting-data-from-devices-using-aws-iot-core-and-or-amazon-kinesis/