Kinesis Data Streams と Kinesis Data Firehose の違いを初心者なりにまとめてみた

## 1. はじめに
- **本記事の目的説明**
  AWS SAA-03向けに勉強しているが、Kinesis Data StreamsとKinesis Data Firehoseの違いでよく混乱しているので、初心者なりにそれぞれの特徴をまとめてみた。

## 2.結論、一言で言うと
- **Kinesis Data StreamsとKinesis Data Firehoseをそれぞれ一言で**
    - Kinesis Data Streams
    **高度なカスタマイズ＆よりリアルタイムな**データストリーミングサービス
    - Kinesis Data Firehose
    **簡単なデータ変換＆よりシンプルな**データストリーミングサービス
　　
ここからはそれぞれの詳細をまとめてみる。
## 3. Kinesis Data Streamsとは？

- **そもそもデータストリームとは**
ストリームデータ処理とは、データが生成された瞬間にそれを継続的に処理・分析すること。例えば、IoTセンサーからのセンサーデータ、ウェブサイトのトラフィックログ、アプリケーションのログなど、データが生成されたらすぐにそれを活用するイメージ。
<img src="https://simpc.jp/tec/wp-content/uploads/sc-243.png" alt="ストリーム処理" width="400" height="300">

>出典：https://simpc.jp/tec/item/sc-243/

- **Kinesis Data Streamsの基本概念**  
  - シャード
  データストリームを構成する単位のこと。シャード＝処理する箱のイメージ。シャード数によってデータストリーム性能が決まる。シャード数が多ければ処理性能が良くなるが料金もかかる。
データストリームはシャードの集合体。
  - リシャーディング
シャードの数を増やしたり、減らしたりすること。以下２つのオペレーションがある。
    - 分割：シャードを分割して、**シャード数を増やす**
    ストリームへのデータの書き込み速度が増加した→分割する。
    - マージ：シャードをマージして、**シャード数を減らす**
    ストリームへのデータの書き込み速度が低下→マージする。
  - データレコード
  保存されるデータの単位のこと。1データレコードの最大サイズは1MB。
  - プロデューサー、コンシューマー
    - プロデューサー：データを送信する側
    例）EC2、クライアントPC、モバイルなど
    - コンシューマー：データを取得する側
    例）EC2、Lambdaなど

  - 概要図は以下
  <img src="https://docs.aws.amazon.com/images/streams/latest/dev/images/architecture.png" alt="概要図" width="550" hight="400">
>出典：https://docs.aws.amazon.com/streams/latest/dev/key-concepts.html
- **キャパシティモード**
  - オンデマンドモード
自動的にスケーリングしてくれる。ただしスケーリングの制限あり。
200(MiB/秒)・200,000(レコード/秒)まで、読み込みキャパシティはコンシューマーあたり400(MiB/秒)までの範囲。
  - プロビジョニングモード 
  データ ストリームのシャードの数を指定する必要がある。プロビジョニングされている場合はコチラの方がコストがいい場合も。

- **データ保持期間**
デフォルトで24時間。最大8760時間(365日)まで延長可能。延長分の料金がかかる。
詳細の計算は公式を参照。https://aws.amazon.com/jp/kinesis/data-streams/pricing/


## 4. Kinesis Data Firehoseとは？
- **Kinesis Data Firehoseの基本概念**
  - 配信ストリーム(Delivery Stream)
  データ配信の基礎となる、ある種のデータ処理工場のようなもの。
  - レコード
  配信ストリームに送信するデータ。レコード当たり最大サイズ1MB。
  - バッファサイズ/バッファ間隔
  受信ストリーミングデータを宛先に配信する前に、特定のサイズまたは一定期間バッファリングする。バッファサイズはMB単位、バッファ間隔は秒単位。
  
- **データ変換**
  - Lambdaと統合されたデータ変換機能の利用が可能。

- **データフローの例**
  - S3バケットへのデータ転送
>Amazon S3 宛先の場合、ストリーミング データは S3 バケットに配信されます。データ変換が有効な場合は、オプションでソース データを別の Amazon S3 バケットにバックアップできます。
  <img src="https://docs.aws.amazon.com/images/firehose/latest/dev/images/fh-flow-s3.png" alt="S3" width="600" height="300">

  - Redshiftへのデータ転送
  >Amazon Redshift の宛先の場合、ストリーミング データは最初に S3 バケットに配信されます。次に、Kinesis Data Firehose は Amazon Redshift COPYコマンドを発行して、S3 バケットから Amazon Redshift クラスターにデータをロードします。データ変換が有効な場合は、オプションでソース データを別の Amazon S3 バケットにバックアップできます。
 <img src="https://docs.aws.amazon.com/images/firehose/latest/dev/images/fh-flow-rs.png" alt="S3" width="600" height="300">

>出典：https://docs.aws.amazon.com/firehose/latest/dev/what-is-this-service.html

## 5. まとめ

- 特徴をまとめると
  - Kinesis Data Streams
    - シャード（スループット)を意識して設計する必要がある
    - レイテンシを1秒未満に抑えることができる。
    - 低レイテンシに複数の分析アプリと連携可能。
    **→よりリアルタイムで複雑なストリーム処理を行いたいときに使う**
 
  - Kinesis Data Firehose
    - シャードを意識する必要がない
    - バッファに蓄積して配信するため、レイテンシ数秒～かかる。
    **→バッファによる遅延が許容可能なシンプルなストリーム処理を行いたいときに使う**

まとめてみると理解が深まった。
何かの助けになれれば幸いです。


## 6. 参考文献
- Amazon Kinesis Data Streams　https://aws.amazon.com/jp/kinesis/data-streams/
- Amazon Kinesis Data Firehose　https://aws.amazon.com/jp/kinesis/data-firehose/
- AWSサーバーレスサービスのオンデマンドモードの特徴・比較・まとめ・プロビジョニングモードとの違い －DynamoDB、Kinesis Data Streams－
https://tech.nri-net.com/entry/summary_of_on-demand_mode
- 【AWS】 Kinesis Data 「Streams」、「Firehose」機能及び使い方について
　 https://www.acrovision.jp/service/aws/?p=1779