Amazon Kinesis

#1.Amazon Kinesisとは#
ストリームデータを収集・処理するためのフルマネージド型サービスです。


##1-1 Amazon Kinesis Streams##
ストリームデータ処理用の分析システムやアプリケーションを構築する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/8811394b-58b6-bd7b-c4ff-370bdf3246c2.png)

- 順序付きイベントストリームとして複数のアプリケーションから同時アクセス可能。シーケンス番号が付与される。
- データの種類や処理の応じて「ストリーム」を作成し、1つ以上のの「シャード」で構成され、この数でスループットを調整する。
- 保存期間はデフォルトで24時間、最長7日間。
- 1データレコードのサイズは最大1MB。
- [Amazon Kinesis Streamsのサービス制限について](https://dev.classmethod.jp/cloud/kinesis-streams-service-sizes-and-limits/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/caa0ee97-6680-3605-72df-1d69bf0f1af8.png)

###プロデューサー (データ送信側)###

**Amazon Kinesis Agent**
Amazon Kinesis サービスにデータを簡単に収集して取り込む OSS のスタンドアロンJava アプリケーション

**Amazon Kinesis Producer Library (KPL)**
Amazon Kinesis Streams にデータを送信する OSS の補助ライブラリ

**Fluent plugin for Amazon Kinesis**
Amazon Kinesis Streams と AmazonKinesis Firehoseにイベントを送信するOSSのFluentd 出力プラグイン

**Amazon Kinesis Data Generator (KDG)**
Amazon Kinesis Data Generator (KDG) を利用して Amazon Kinesis　Streams または Amazon Kinesis Firehose にテストデータを簡単に送信できる

###コンシューマー (データ処理側)###

**Amazon Kinesis Client Library (KCL)**
KCL を利用して Kinesis アプリケーションを作成できる

###暗号化###

- KMSによる保存中データの暗号化
- httpsエンドポイントを使用した転送データの暗号化


###重複レコードの処理###

レコードが複数回 Amazon Kinesis Data Streams applicationに配信される理由は、

- プロデューサーの再試行
- コンシューマーの再試行

の 2 つになります。

アプリケーションは、各レコードの複数回処理を予測して適切に処理する必要があります。 
プロデューサーで PutRecord を呼び出してから Amazon Kinesis Data Streams の受信確認を受け取るまでの間に、ネットワーク関連のタイムアウトを発生する場合があります。
この場合、プロデューサーはレコードが Kinesis Data Streams に配信されたかどうかを確認できません。
各レコードがアプリケーションにとって重要であれば、同じデータを使用して呼び出しを再試行するようにプロデューサーが定義されているはずです。
同じデータを使用した PutRecord の呼び出しが両方とも Kinesis Data Streams に正常にコミットされると、Kinesis Data Streams レコードは 2 つになります。
2 つのレコードは、データは同じでも、一意のシーケンス番号が付けられています。
厳密な保証を必要とするアプリケーションは、後で処理するときに重複を削除するようにレコード内にプライマリキーを埋め込む必要があります。
プロデューサーの再試行に起因する重複の数が、コンシューマーの再試行に起因する重複の数より通常は少ないことに注意してください。 
したがって、レコード内にプライマリキーを埋め込み、後で処理するときに重複を削除するという対応が必要となります。



###リシャーディング###

データ転送速度が増加した場合、データフローのシャード数を調整して、データフローのレートの変化に適用させる。

- シャードの分割
- シャードの結合
の2種類の操作が行われます。

**シャードの分割**
1つのシャードを2つのシャードに分割して、ストリームのスループットを向上させます

**シャードの結合**
2つのシャードを1つのシャードに結合して、ストリームのスループットを低下させます

 



##1-2 Amazon Kinesis Firehose##
S3やDBに配信・蓄積するためのストリーム処理を実施する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/4ce509a1-41c5-470b-15bb-630c9d11a8c6.png)

- "配信先に応じて"「配信ストリーム」を作成
- シャードの作成は不要。
- 1 データレコードの最大サイズは 1 MB
- 制限なしにスケールするよう設計
- Amazon Kinesis Streams から Firehose へ直接ストリームデータを送ることが可能

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/38213eab-6833-5f16-7900-625362d84121.png)



##1-3 Amazon Kinesis Analytics##
ストリームデータを標準的なSQLクエリでリアルタイムに分析する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/76b11cac-50bf-b1d8-52b6-8bd020fe18f2.png)

- 分析単位に「アプリケーション」を作成し、「ソース／デスティネーション」を設定
- SQL クエリ実行の前処理として、Lambda 関数の指定が可能　
- 1 入力行の最大サイズは 50 KB／参照ソースの最大サイズは 1 GB

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/7f8aba33-2dbd-b51b-5bab-be4c48336b6f.png)



#2.Amazon KinesisとSQSの比較#

|比較表|SQS(Amazon Simple Queue Service)	|Kinesis|
|---|---|---|
|概要	|シンプルなメッセージングシステム。	|ストリーミング処理(ビッグデータなど)|
|仕組み	|・シンプル（投入、取り出し、削除）・シーケンス番号なし。|・レコード、シーケンス番号、パーティション、データBLOBなど構成や操作はSQSと比較して複雑。・シーケンス番号あり。|
|目的|	主にコンピュータ間の処理の連結部分。(Kinesisのような瞬発的な大量データの処理には向かない）	|大量データの処理が可能。1シャドーで最大 1000/秒のPUTの処理が可能。（シャドーを増やすことにより性能アップ）。一般大衆向けのWeb投票システムなど。|
|保存期間|	開封後30秒間処理されない場合は未開封となる。デフォルトで14日間保存される。	|デフォルトで24時間保存。何度でも取得が可能。
|入れるもの|	主にコマンドを入れる。|	主にデータを入れる。|
|価格|	Kinesisより高	|SQSより安|



#3.Demo#

##1.Amazon Kinesis Streams の構築##

- Kinesis ストリームの名前:任意
- シャード数：5 → 大きくすれば高性能になります。

![スクリーンショット 2019-05-13 18.44.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/975960c2-9b42-3103-b2d7-51fbeedb0e76.png)

基本的にKinesis Streamsの設定はこれだけです。
後は取得するデータと連携させると、データが流れ込み、分散処理をしてくれます。

##2.Amazon Kinesis Firehose の作成##

###Step 1: Name and source###

- Delivery stream name:任意
- Source:Kinesis stream → ダイレクトにデータを送るか（Direct PUT or other sourcesKinesis stream）もしくは（Kinesis stream）を選択することできます。
- Kinesis stream:「1.Amazon Kinesis Streams の構築」で作成したものを指定。

![スクリーンショット 2019-05-13 18.53.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/11408fa9-842c-d14a-4b00-f65566f0f79e.png)

###Step 2: Process records###

Lambdaに繋げていき、Lambdaが変換するといったような処理や、レコードフォーマットを変えていくというような設定もできますが、今回はいずれも Disabled にしておきます。

![スクリーンショット 2019-05-13 18.56.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/a188bacc-4114-c35d-ada4-7acecc4663e2.png)

###Step 3: Choose destination###

- Destination:S3 データの送り先を選択することができます。
- S3 bucket:S3バケットを指定。

![スクリーンショット 2019-05-13 18.58.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/133a43a2-699c-a220-1267-39a68d0b9fdf.png)

###Step 4: Configure settings###

S3のバッファを作成したり、暗号化したりできますが、今回は特に何もしません。

![スクリーンショット 2019-05-13 19.00.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/69576b92-a56e-f841-4633-4a4356bab0a1.png)

エラーのログを取得したり、タグをつけることができますが、今回は何もしません。
IAMロールのみ作成して、付与します。

![スクリーンショット 2019-05-13 19.03.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/8cb3acfd-996e-dae7-60d5-1ae11de4eb4d.png)

これで、Data StreamsからS3に流れるよといった設定ができました。

###Step 5: Review###

「Create delivery stream」をクリック。


##3.Amazon Kinesis Analyticsの作成##

- Application name:任意
- Description:任意
- Runtime:SQL → SQLで解析するようにします。

![スクリーンショット 2019-05-13 19.09.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/c11c567a-c51d-e321-c990-97a04111edcc.png)

「Connect streaming data」をクリック。
![スクリーンショット 2019-05-13 19.11.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/d3f72cfc-5b97-57aa-44e8-4796b769fbe5.png)

しかし、KinesisStreamにはまだデータがないので、「Configure a new stream」でDemo環境を作成していきます。
「Create demo stream」をクリックします。
![スクリーンショット 2019-05-13 19.19.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/9e64f3d6-8ac3-a28a-52e1-d1211df967f9.png)

「Choose source」に戻ります。

- Source:Kinesis stream
- Kinesis stream:先のDemo環境のものを指定

![スクリーンショット 2019-05-13 19.22.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/dd2608e7-31fd-d865-033d-e47eecdc6e72.png)

画面下までいくと、Demo環境のデータのスキーマが完了していることがわかります。
![スクリーンショット 2019-05-13 19.23.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/b993b1d1-26bf-6d01-df87-515b8269fb85.png)


「Go to SQL Editor」をクリックします。
![スクリーンショット 2019-05-13 19.24.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/1bfdfe2d-f2d6-4e52-6373-f47e7a31fac5.png)
　 
一から作成することも可能ですが、「Add SQL from templates」から用意されたものを使うことも可能です。
![スクリーンショット 2019-05-13 19.26.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/3eba8970-0ff0-6b39-6e10-31bd7302a649.png)

「Continuous filter」を使って見ます。
![スクリーンショット 2019-05-13 19.28.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/a4efab19-04f8-2cbb-6a20-557e5d72276e.png)

「Save and run SQL」で解析ができるようになり、フィルタリングされたデータが表示されるようになります。
![スクリーンショット 2019-05-13 19.31.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/c9643fe1-10da-d670-4bd8-7ebf861ba687.png)

データを使った解析ができるようにになりました。これが、Amazon Kinesis Analyticsの仕事です。


#4.その他リンク#
[Kinesisストリームのサーバーサイド暗号を試してみる](https://qiita.com/leomaro7/items/b92bd54257e8eb04266d)