Kinesis(ストリーミング)
Amazon Kinesis は、クリックの記録、センサーの値、アプリのログのように絶え間なく流れてくるデータ(ストリーミングデータ)を、リアルタイムに受け取って処理するためのサービス群です。SAA では、Kinesis Data Streams と Amazon Data Firehose の使い分け、シャードの考え方、取り込み後の変換・保存先の選び方がよく問われます。
ひとことで言うと: Kinesis Data Streams は「流れ続けるデータを一定期間ためておくベルトコンベア」、Data Firehose は「集めたデータを自動で倉庫へ運ぶ配送便」です。
たとえるなら、Data Streams は録画機能付きの生中継で、複数の人が同時に見られ、保持期間内なら巻き戻して見直せます。Firehose は、荷物をある程度まとめてから決まった倉庫(S3 など)へ届ける定期便です。
このページで押さえる論点
ストリーミングデータとは
バッチ処理は、1 日分のデータをためてから夜間にまとめて処理するような方式です。これに対しストリーミング処理は、データが発生したそばから数秒以内に受け取り、処理します。「不正な取引を即座に検知したい」「Web サイトの今のアクセス状況をダッシュボードに表示したい」といった要件がストリーミングの出番です。
SAA の試験ガイドでは、タスク「高パフォーマンスなデータ取り込みと変換のソリューションを選択する」の中で「データ取り込みパターン(頻度など)」「ストリーミングデータサービスの適切なユースケース(Amazon Kinesis など)」「データストリーミングアーキテクチャを設計する」「データの形式を変換する(.csv から .parquet など)」が挙がっています。対象サービスには Amazon Kinesis、Amazon Data Firehose、Amazon Kinesis Video Streams が含まれます。
Kinesis Data Streams の仕組み
データを送る側をプロデューサー(アプリ、IoT デバイス、Kinesis Agent など)、読み取って処理する側をコンシューマー(Lambda、EC2 上のアプリ、Firehose、Flink など)と呼びます。送られる 1 件 1 件のデータをレコードと呼びます。
- シャード: ストリームを構成する処理の単位です。車線にたとえると、シャード 1 本ごとに流せる量が決まっていて、車線(シャード)を増やすほどたくさん流せます。
- パーティションキー: レコードをどのシャードに入れるかを決める値です(ユーザー ID、デバイス ID など)。同じキーのレコードは同じシャードに入り、シャードの中では順序が保たれます。特定のキーにデータが偏ると 1 本のシャードに集中し(ホットシャード)、そのシャードだけ上限を超えてしまいます。キーは値がばらけるものを選びます。
- 保持期間: 既定 24 時間、最大 365 日です。コンシューマーが読んでもデータは消えず、保持期間内なら何度でも読み直せます。複数のコンシューマーが同じデータを同時に・独立して読めるのも大きな特徴です。
| 項目 | 値 | 試験での使いどころ |
|---|---|---|
| 書き込み(シャードあたり) | 最大 1 MB/秒 または 1,000 レコード/秒 | 書き込みが上限を超えるとスロットリング(ProvisionedThroughputExceeded)。シャードを増やす |
| 読み取り(シャードあたり) | 最大 2 MB/秒(共有。拡張ファンアウトはコンシューマーごとに 2 MB/秒) | コンシューマーが多いと読み取りが足りなくなる → 拡張ファンアウト |
| 保持期間 | 既定 24 時間、最大 365 日(8,760 時間) | 「過去 7 日分を読み直したい」なら保持期間を延ばす |
| レコードの最大サイズ | 10 MiB(base64 エンコード前のデータ部分) | それを超えるデータは S3 に置き、ストリームには参照を送る |
SQS と同じく送る側と受ける側を疎結合にしますが、SQS は「1 件を 1 つのコンシューマーが処理して削除」、Kinesis Data Streams は「保持期間中は残り、複数のコンシューマーが読める」という違いがあります。詳しい比較は「SQS と SNS」ページの表も参照してください。
キャパシティモードとシャード数の見積もり
| モード | 仕組み | 選ぶ場面 |
|---|---|---|
| オンデマンド | シャード数を AWS が自動で調整。書き込み・読み取ったデータ量に応じて課金 | 流量が読めない、急に増減する、シャードの管理をしたくない |
| プロビジョンド | シャード数を自分で決め、シャード数と時間に応じて課金。シャードの分割・結合で増減する | 流量が予測でき、安定している。コストを細かく管理したい |
プロビジョンドモードでは、必要なシャード数を「書き込み量 ÷ 1 MB/秒」「レコード数 ÷ 1,000 件/秒」「全コンシューマーの読み取り量 ÷ 2 MB/秒」のうち最も大きい値で見積もります。コンシューマーを増やしたときに読み取りが足りなくなる問題は、拡張ファンアウトで解決できます。拡張ファンアウトに登録したコンシューマーは、ほかのコンシューマーと共有せずにシャードあたり 2 MB/秒を受け取れ、データはプッシュ型で届くので遅延も小さくなります(プロビジョンドモードで最大 20 コンシューマー)。
書き込み量とコンシューマー数から必要なシャード数を見る
スライダーを動かすと、プロビジョンドモードで必要なシャード数が変わります。
※簡略化しています: データがパーティションキーで各シャードに均等に分かれると仮定しています。実際には、キーの偏りで 1 本のシャードに集中すると、合計が足りていても上限を超えます。図のシャードは 10 本までを表示します。
図では省略しているキーの偏り(ホットシャード)は「Kinesis Data Streams の仕組み」で説明しています。オンデマンドモードではシャード数を自分で決める必要はありません。
Amazon Data Firehose
Amazon Data Firehose(旧称 Kinesis Data Firehose)は、ストリーミングデータを受け取り、指定した保存先へ自動で届けるフルマネージドサービスです。シャードの管理もコンシューマーのコードも不要で、流量に合わせて自動でスケールします。
- 配信先: Amazon S3、Amazon Redshift(S3 を経由して COPY)、Amazon OpenSearch Service、Splunk、HTTP エンドポイント(Datadog などの外部サービス)など。
- バッファ: 受け取ったデータをいったんため、バッファサイズかバッファ間隔のどちらかに先に達したらまとめて配信します。そのため、Data Streams のように届いたそばから処理する「リアルタイム」ではなく「ほぼリアルタイム」と表現されます。
- データ変換: 配信の前に Lambda 関数を呼び出して、データの加工・フィルタリングができます。
- 形式変換: JSON 形式のデータを、分析に向いた列指向の Apache Parquet や Apache ORC に変換して S3 に保存できます。変換には AWS Glue データカタログのテーブル(スキーマ)を使います。CSV などの JSON 以外の形式は、先に Lambda で JSON に変換します。
- データの保持: Firehose はデータをためて読み直すサービスではありません。保存先へ届けるのが役割です。
Firehose のソースには、アプリから直接送る方法(Direct PUT)のほか、Kinesis Data Streams を指定できます。「Data Streams でリアルタイム処理をしつつ、同じデータを Firehose で S3 にも保存する」構成がよく出ます。S3 に保存したデータは Athena で SQL 分析できます。
Managed Service for Apache Flink と Kinesis Video Streams
| サービス | できること | 選ぶ場面 |
|---|---|---|
| Amazon Managed Service for Apache Flink | ストリームを読みながら SQL・Java・Python などで集計・結合・異常検知をリアルタイムに実行する(旧称 Kinesis Data Analytics) | 「直近 1 分間の売上を集計し続ける」「センサー値の異常をリアルタイムに検知」 |
| Amazon Kinesis Video Streams | カメラなどからの映像・音声ストリームを取り込んで保存し、再生・分析(Amazon Rekognition Video など)に使えるようにする | 防犯カメラの映像の取り込み、映像の機械学習分析 |
| Amazon MSK(参考) | Apache Kafka のマネージドサービス | 既存の Kafka アプリをそのまま AWS へ移行する |
取り込みのセキュリティ
試験ガイドには「取り込みアクセスポイントへのセキュアなアクセス」も挙がっています。Kinesis では次の方法を組み合わせます。
- IAM ポリシー: どのプロデューサー・コンシューマーが、どのストリームに書き込み・読み取りできるかを制御します。
- 保管中の暗号化: Kinesis Data Streams は AWS KMS の鍵を使ったサーバー側暗号化に対応しています。Firehose も配信先(S3 など)でデータを暗号化できます。
- 転送中の暗号化: API は HTTPS(TLS)で呼び出します。
- インターフェイス VPC エンドポイント: VPC 内のアプリから、インターネットを通らずに Kinesis Data Streams や Firehose にデータを送れます(「VPC の接続」参照)。
ストリーミングサービスの選び方と SQS との違い
質問に答えてストリーミングのサービスを選ぶ
扱うデータと目的を思い浮かべて「はい / いいえ」で答えてください。答えた経路が上から順に表示されます。
※簡略化しています: 代表的な判断基準だけを分岐にしています。Data Streams と Firehose、Flink を組み合わせる構成や、既存の Kafka を使う場合(Amazon MSK)は分岐に含めていません。
SQS もデータを受け渡しますが、目的が違います。SQS は「1 件ずつのタスクを確実に処理する」ためのキューで、処理したら削除します。Kinesis Data Streams は「大量のデータを流し続け、複数のアプリで読む・読み直す」ためのストリームです。「順序」についても、SQS FIFO キューはメッセージグループ単位、Kinesis Data Streams はシャード(パーティションキー)単位で順序が保たれます。
問題文のキーワード → 選ぶべき答え
| 問題文の言い回し | 選ぶべき答えと理由 |
|---|---|
| 「リアルタイムに」「複数のアプリで同じデータを処理」「再処理(読み直し)」 | Kinesis Data Streams。保持期間内なら何度でも読める |
| 「ストリーミングデータを S3・Redshift・OpenSearch に保存」「管理の手間を最小に」 | Amazon Data Firehose |
| 「ほぼリアルタイム」「数十秒〜数分の遅れは許容」 | Data Firehose(バッファしてから配信) |
| 「JSON を Parquet・ORC に変換して S3 に保存し、Athena で分析」 | Data Firehose の形式変換(Glue データカタログのスキーマを使用) |
| 「ストリーミングデータを配信前に加工」 | Firehose + Lambda によるデータ変換 |
| 「ストリームに対して SQL で時間枠ごとに集計」「リアルタイムの異常検知」 | Managed Service for Apache Flink |
| 「カメラ映像を取り込んで分析」 | Kinesis Video Streams |
| 「ProvisionedThroughputExceeded エラー」「書き込みがスロットリングされる」 | シャードを増やす(分割)、偏りのないパーティションキー、またはオンデマンドモード |
| 「コンシューマーを増やしたら読み取りが遅くなった」 | 拡張ファンアウト(コンシューマーごとにシャードあたり 2 MB/秒) |
| 「流量が予測できず、シャード管理をしたくない」 | オンデマンドモード |
| 「同じユーザーのイベントは発生順に処理」 | ユーザー ID をパーティションキーにする(シャード内で順序を保証) |
| 「既存の Kafka クライアントをそのまま使いたい」 | Amazon MSK |
引っかけポイント
- 「Data Firehose でもリアルタイムに、保持期間内のデータを読み直せる」→ ✕。Firehose はバッファしてから配信する「ほぼリアルタイム」のサービスで、データをためて読み直す機能はありません。読み直しが必要なら Data Streams です。
- 「Kinesis Data Streams はデータを S3 に自動で保存する」→ ✕。Data Streams はデータを保持期間だけためるストリームです。S3 に保存するには Firehose をコンシューマーにするなどの構成が必要です。
- 「保持期間は最大 14 日」→ ✕。それは SQS の上限です。Kinesis Data Streams は最大 365 日です。
- 「シャード全体の合計が足りていればスロットリングは起きない」→ ✕。パーティションキーが偏ると特定のシャードに集中し、そのシャードだけ上限を超えます。
- 「コンシューマーを増やせば読み取りの総量も自然に増える」→ ✕。共有スループットでは全コンシューマーでシャードあたり 2 MB/秒を分け合います。独立した 2 MB/秒が必要なら拡張ファンアウトです。
- 「CSV を直接 Parquet に変換できる」→ 要注意。Firehose の形式変換の入力は JSON です。CSV などは先に Lambda で JSON に変換します。
まとめ: SAA 試験で押さえるポイント
- Kinesis Data Streams: リアルタイム、複数のコンシューマーが独立して読める、保持期間(既定 24 時間・最大 365 日)内なら読み直せる
- シャードあたり書き込み 1 MB/秒・1,000 件/秒、読み取り 2 MB/秒。足りなければシャードを増やすか、オンデマンドモード
- 順序はパーティションキー(シャード)単位。キーの偏りはホットシャードの原因
- 読み取りを増やしたいなら拡張ファンアウト(コンシューマーごとにシャードあたり 2 MB/秒)
- Data Firehose: S3・Redshift・OpenSearch などへ自動配信、バッファするのでほぼリアルタイム。Lambda で変換、JSON → Parquet/ORC 変換
- ストリームの SQL 集計・異常検知は Managed Service for Apache Flink、映像は Kinesis Video Streams
確認問題
参考リンク
AWS 公式ドキュメント(外部サイトが開きます)。本文の数値はこれらで確認しています。
- Amazon Kinesis Data Streams とは
- Kinesis Data Streams の用語と概念(シャード・パーティションキー・保持期間)
- Kinesis Data Streams のクォータと制限(シャードのスループット・レコードサイズ・保持期間)
- Kinesis Data Streams のキャパシティモード
- 拡張ファンアウトコンシューマー(シャードあたり 2 MB/秒)
- Kinesis Data Streams のサーバー側暗号化
- Amazon Data Firehose とは
- Firehose のバッファリング
- Firehose でのソースデータの変換(Lambda)
- Firehose での入力データ形式の変換(Parquet・ORC)
- Amazon Managed Service for Apache Flink とは
- Amazon Kinesis Video Streams とは