kinesis firehoseを使ってみた

58
Kinesis Firehoseを使ってみた 2017/09/21 D-Cube勉強会 株式会社ビズリーチ エンジニア 三澤正木

Upload: dcubeio

Post on 21-Jan-2018

262 views

Category:

Engineering


3 download

TRANSCRIPT

Page 1: Kinesis Firehoseを使ってみた

Kinesis Firehoseを使ってみた

2017/09/21 D-Cube勉強会

株式会社ビズリーチエンジニア三澤正木

Page 2: Kinesis Firehoseを使ってみた

【登壇者プロフィール】

ミサワ マサキ

名前: 三澤正木

職業: エンジニア(現在の業務は、主にWEBアプリ開発担当)

所属: 株式会社ビズリーチキャリアトレック事業部http://careertrek.com

GitHub: https://github.com/MasakiMisawa

趣味: 野球(観る専)、ランニング、旅行 etc

Page 3: Kinesis Firehoseを使ってみた

以下のURLから閲覧、DL可能です。* イベント終了後もしばらく公開しておきますが、削除する可能性もあるので必要な方はDLしておいてください。

【今回のスライド】

http://www.slideshare.net/MisawaMasaki

Page 4: Kinesis Firehoseを使ってみた

アジェンダ

・Chapter1 そもそも Amazon Kinesis って?

→ Amazon Kinesis の簡単な概要説明です

・Chapter2 Kinesis Firehoseの使い方

→ Kinesis Firehoseに挿入した値を、任意の場所に転送完了させるまでの一連の流れです

・Chapter3 Kinesis Firehoseを使って実現できそうなこと

→ 自分なりに考えるKinesis Firehoseを使えばこんなこと、あんなことが実現できそうという紹介です

・Chapter4 Kinesis Firehoseを使用したデータ転送を実演してみる

→ 時間が余ればになりますが、Kinesis Firehoseを使用したデータ転送を実演しようと思っています。

・etc 質疑応答

→ さいごに質疑応答の時間を設ける予定でいます

Page 5: Kinesis Firehoseを使ってみた

Chapter1:そもそも Amazon Kinesis って?

Amazon Kinesis は、AWS(Amazon Web Service)の用意したスト

リーミングデータ向けのプラットフォームで、大容量のデータを低コストで収集、分析、処理、転送する事が可能なサービスです。

大量に流れてくるログデータなどを一時保存(Kinesisへの保存期間はデフォルトで24時間、最大7日まで延長可能)し、分析をしたり任意の

形に加工した後に任意の各種データストレージに転送するところまでをやってくれます。

Page 6: Kinesis Firehoseを使ってみた

Chapter1:そもそも Amazon Kinesis って?

大量のデータを低コストで溜め込み、溜め込んだデータを取得して各種展開するという意味では、AWSの中で割とよく使われているSQS

(Simple Queue Service)に近いイメージですが、

1. SQSよりも大量、大容量のデータを受ける事が可能* SQSでは秒間数百のリクエストをさばく事ができないが、Kinesisではそれが可能* 1レコードの最大容量がSQSは256KBまでだが、Kinesisは1MBまで保存可能

1. 溜め込むだけでなく、分析や加工をしてくれたり、各種AWSサービスに転送する処理もやってくれる(Kinesisすべてではない)

の2点が大きな違いであり、Kinesisを使う上での利点です。

Page 7: Kinesis Firehoseを使ってみた

Chapter1:そもそも Amazon Kinesis って?

一口にKinesisと言っても、用途毎に以下の3種類が存在します。

1. Kinesis Streams

→ 挿入されたデータをリアルタイムで加工してデータ転送を行いたい場合などに使用し

ます。

1. Kinesis Firehose

→ 複雑な転送用コードを書かずにコンソール画面での設定だけでデータ転送を行いたい

場合などに使用します。今回扱うメインテーマです。

1. Kinesis Analytics

→ 挿入されたデータに対して予め用意したSQLの実行結果を転送したい場合などに使用

します。2017/09現在では東京リージョン非対応になっています。

Page 8: Kinesis Firehoseを使ってみた

Chapter1:そもそも Amazon Kinesis って?

Kinesis Streams

Streams(小川)という名前が示すとおり、流れてくる大容量データをリアルタイムで加工して扱いたい場合に使用され、データロード間隔の短さが最大の特徴となっています。

ストリーミングデータなどの絶え間なく入ってくるデータをリアルタイムで処理できるメリットがある一方、入ってきたデータを加工したり、加工後のデータを任意のデータストアに転送する為のプログラムコードは自前で用意しておく必要があったりなど

データを溜めておく場所の提供と、データが入ってきたタイミングでのイベント発火だけは用意するから、後は使う側で自由にやってね!

という、使う人は選ぶものの、割と自由度の高いサービスになっているのが特徴です。

Page 9: Kinesis Firehoseを使ってみた

Chapter1:そもそも Amazon Kinesis って?

Kinesis Streams

Page 10: Kinesis Firehoseを使ってみた

Chapter1:そもそも Amazon Kinesis って?

Kinesis Streams

尚、Kinesis Streams 内に挿入されたデータを加工、保存先へ転送させる為のプログラムコードを実行させるには、以下の二つの方法が一般的です。

1. Kinesis Streams にデータが入ってきたことをイベントトリガーに発火させるLambda function 内に加工、保存先への転送コードを書いておき自動実行。

1. cronなどの定期実行処理でKinesis Streamsからデータを取得し、取得したデータを加工、保存先への転送を実行

● Kinesis Streamsから手動でデータを取得した場合、取得後もKinesis Streams内に対象データは残り

続ける仕様になっている為、既処理済のデータか未処理のデータかを判別可能にする為に取得したレコードのシーケンス番号や取得日時を保存しておき、次回取得時に前回取得したレコード以降のレコードを取得するように管理する必要があります。

Page 11: Kinesis Firehoseを使ってみた

Chapter1:そもそも Amazon Kinesis って?

Kinesis Streams

Kinesis Streamsにデータが入った事をイベントトリガーに発火するLambda functionの例

Page 12: Kinesis Firehoseを使ってみた

Chapter1:そもそも Amazon Kinesis って?

Kinesis Streams

Kinesis Streams では扱える最大データ容量をシャードという概念で管理しており、設定するシャード数により扱える最大データ容量を増やすことができます。

ただ、設定するシャード容量を増やすとその分利用料金も増えていくので、使用するデータ容量に応じて適切なシャード数を設定する必要があります。(後からシャードを追加、削除する事は可能)

Kinesis Streams に関してはこの設定シャード数が使用する上での重要な肝になってくる為、

利用料金についても使用するユーザ側で制御する形になっているなど、ここでもカスタム要素の強いサービスである点が感じられます。

Page 13: Kinesis Firehoseを使ってみた

Chapter1:そもそも Amazon Kinesis って?

Kinesis Firehose

各種AWSサービス間のデータ転送を行うことが可能なサービスであり、複雑な保存先への転送用プログラムコードを書く必要がなく、GUIのコンソール画面での簡単な設定だけでデータ転送を行えることが特徴です。

Firehoseは英語で消化ホースという意味を持ちますが、Kinesis Firehose に対してデータを

挿入し、挿入したデータを指定した保存先に対して転送するこのサービスは、正にそんなイメージですね。

これまで一部のリージョンでのみ使用可能になっていた為東京リージョンでの使用ができませんでしたが、2017年8月に東京リージョンでの使用が解禁されて使用可能になりました!

Page 14: Kinesis Firehoseを使ってみた

Chapter1:そもそも Amazon Kinesis って?

Kinesis Firehose

Kinesis Firehose に挿入されたデータの転送先には、以下の3つが選択可能です。

1. Amazon S3→ オンラインストレージで、静的ファイルなどを低料金で保存可能なサービスです。

1. Amazon Redshift→ 大容量のデータを低価格で保存可能なデータベースで、分析用途などで使用されます。

1. Amazon Elasticsearch Service→ 目的の文字列を含むドキュメントを高速に抽出可能なAWS上の全文検索エンジンです。

Page 15: Kinesis Firehoseを使ってみた

Chapter1:そもそも Amazon Kinesis って?

Kinesis Firehose

Kinesis Firehose Amazon S3 data flow overview

Page 16: Kinesis Firehoseを使ってみた

Chapter1:そもそも Amazon Kinesis って?

Kinesis Firehose

Kinesis Firehose Amazon Redshift data flow overview

Page 17: Kinesis Firehoseを使ってみた

Chapter1:そもそも Amazon Kinesis って?

Kinesis Firehose

Kinesis Firehose Amazon Elasticsearch data flow overview

Page 18: Kinesis Firehoseを使ってみた

Chapter1:そもそも Amazon Kinesis って?

Kinesis Firehose

Page 19: Kinesis Firehoseを使ってみた

Chapter1:そもそも Amazon Kinesis って?

Kinesis Firehose

Kinesis Firehose を使用する場合の利用料金は、サービスを介して送信するデータ容量に対してのみ発生する形になっている為、Kinesis Streams におけるシャード数のユーザ側による設定などが一切必要ありません。

Kinesis Streams が使う人を選ぶカスタム要素の強いサービスなのに対して、Kinesis Firehose は、複雑な設定などの管理が不要なサービスであるという事が、利用料金の算出方法からも見受けられます。

Page 20: Kinesis Firehoseを使ってみた

Chapter1:そもそも Amazon Kinesis って?

→ Kinesis Firehose と Kinesis Streamsの使い分け

Kinesis に対して挿入されたデータを加工、任意の保存先に転送するという目的は同じの為、混同しやすい Kinesis Firehose と Kinesis

Streams ですが、それぞれ以下のような特徴がある為、用途により使い分けると便利です。

Page 21: Kinesis Firehoseを使ってみた

Chapter1:そもそも Amazon Kinesis って?

- Kinesis Firehose

特徴:- 転送時に自前でコードを用意する必要がなく、GUIのコンソールで簡単設定可能- 使用するデータ容量の増減があった場合でも、ユーザ側での設定変更が不要- データロードの間隔が最短で60秒からの為、リアルタイム描画などには不向き

向いている使用用途:- KVSのレコードやアプリケーションログなどの大容量データを分析用データベースに転送したり、自動バックアップ保存したりなど

→ Kinesis Firehose と Kinesis Streamsの使い分け

Page 22: Kinesis Firehoseを使ってみた

Chapter1:そもそも Amazon Kinesis って?

- Kinesis Streams

特徴:- データロードが1秒以下の間隔で可能な為、リアルタイムでの処理に向いている- データ加工や、保存先への転送の為に自前でコードを用意し、実行させる必要有- 設定するシャード数により扱えるデータ容量と利用料金が変動

向いている使用用途:- ストリーミングデータをリアルタイムで変化させるグラフで表示させたりなど

→ Kinesis Firehose と Kinesis Streamsの使い分け

Page 23: Kinesis Firehoseを使ってみた

Chapter1:そもそも Amazon Kinesis って?

結論:

Kinesis Firehose は、ゼロ管理の非エンジニアでも扱えるようなサービスKinesis Streams は、細かい設定が可能なユーザカスタム用サービス

→ Kinesis Firehose と Kinesis Streamsの使い分け

Page 24: Kinesis Firehoseを使ってみた

Chapter1:そもそも Amazon Kinesis って?

Kinesis Analytics

流れてくる大容量データに対して予め用意しておいたSQLを実行し、実行結果を保存先の各種データストアに転送できるサービスです。

実行するSQLは標準のSQLクエリがサポートされている為、プログラミング言語などを学ばなくても一般的なSQLの知識があれば使える点など、使用可能になるまでの敷居が低めに設定されており、非エンジニアでも使えそうなところも嬉しい点です。

ただ、2017年9月現在では東京リージョンでの使用が不可能になっている点に注意が必要です。

Page 25: Kinesis Firehoseを使ってみた

Chapter1:そもそも Amazon Kinesis って?

Kinesis Analytics

Page 26: Kinesis Firehoseを使ってみた

Chapter1:そもそも Amazon Kinesis って?

Kinesis Analytics

Page 27: Kinesis Firehoseを使ってみた

Chapter2:Kinesis Firehose の使い方

概要が分かったところで、Kinesis Firehoseを

使用してデータ転送を行う一連のフローなど、実際の使い方を見ていきましょう。

Page 28: Kinesis Firehoseを使ってみた

Chapter2:Kinesis Firehose の使い方

AWSコンソール画面TOP から Kinesis を選択します。

Page 29: Kinesis Firehoseを使ってみた

Chapter2:Kinesis Firehose の使い方

Firehoseの欄の、Firehose コンソールに移動ボタンを選択します。

Page 30: Kinesis Firehoseを使ってみた

Chapter2:Kinesis Firehose の使い方

最初は何も作られていない為、Create Delivery System ボタンを選択して新規作成します。

Page 31: Kinesis Firehoseを使ってみた

Chapter2:Kinesis Firehose の使い方

作成するKinesis Firehose の stream name を設定します。

Delivery stream name の欄に作成する Kinesis Firehose の名前を入力します。stream nameは作成したKinesisを一意に識別する為の名前で後から変更が不可能な為、なるべく一目で分かるような名前を付けておきましょう。

今回は本勉強会のテスト用のKinesisだった為、「dcube-test-kinesis-firehose」という名前で作成しています。

Page 32: Kinesis Firehoseを使ってみた

Chapter2:Kinesis Firehose の使い方

データ挿入元の指定で、直接PutするかKinesis Streamsから自動転送するかを選択

Choose source では、Kinesis Firehoseに入れるデータの挿入元を指定します。2017年9月現在では、自作コードなどでKinesis Firehoseに対して直接データを挿入するか、Kinesis Streamsに入ってきたデータを自動で転送するかの二択が選択可能です。

今回は、Kinesis Firehoseに対して直接データを挿入する方式を選択しています。

Page 33: Kinesis Firehoseを使ってみた

Chapter2:Kinesis Firehose の使い方

受け取ったレコードに対してLambda functionで変換(加工)を行うかを指定

受け取ったデータに対して何かしらの加工を施したい場合に設定する項目で、加工したい場合にはKinesis Firehoseにデータが入ってきたことをトリガーに発火するLambda functionを設定する事が可能で、変換後のデータを保存先に転送する事ができます。

今回は、Disabled(加工は行わない)を選択しています。

Page 34: Kinesis Firehoseを使ってみた

Chapter2:Kinesis Firehose の使い方

データを転送する保存先をどこにするかを設定

受け取ったデータを転送する保存先をどこにするかの設定項目です。2017年9月現在では、Amazon S3、Amazon Redshift、Amazon Elasticsearch Serviceの3つが選択可能になっています。

今回は、転送先をAmazon S3に設定しています。

Page 35: Kinesis Firehoseを使ってみた

Chapter2:Kinesis Firehose の使い方

保存先の詳細情報を設定します。(Amazon S3 を保存先に選択した場合)

データを転送する保存先をAmazon S3に指定した場合の詳細設定項目です。S3 Bucket欄で保存先のバケットを設定し、Prefix欄で保存先ファイルパスの接頭語を指定できます(デフォルトの保存先ファイルパスは、YYYY/MM/DD/HH/ 配下になっており、省略した場合はバケット直下にYYYY/MM/DD/HH/ファイル名のパスで保存されます)

今回は、本勉強会用に作成した「dcube-test-bucket」を保存先バケットに設定し、管理を容易にする為にデフォルトPrefixの前に test-dir/ をつけて保存するようにしています。

Page 36: Kinesis Firehoseを使ってみた

Chapter2:Kinesis Firehose の使い方

データロードの間隔を設定します。

Kinesis Firehose に挿入されたデータをAmazon S3に転送する間隔を設定する項目です。データロードを行うタイミングは、

- 対象データのサイズがBuffer sizeで指定した値を超える- 前回のデータロード実行時からBuffer interval で設定した秒数を経過

のどちらかの条件を満たしたタイミングで実行されます。

今回は、Buffer sizeはデフォルトの5MBのままにし、Buffer intervalだけ1分毎に転送を行うようにする為に60秒に設定しています。

Page 37: Kinesis Firehoseを使ってみた

Chapter2:Kinesis Firehose の使い方

Amazon S3に保存するファイルに対して圧縮と暗号化を行うかを設定します。

Amazon S3に保存する際にファイル圧縮と暗号化を行なってから保存をしたい場合に設定する項目です。

今回はサンプル実行の為、ファイル圧縮も暗号化も行わなずに保存するように設定しています。

Page 38: Kinesis Firehoseを使ってみた

Chapter2:Kinesis Firehose の使い方

エラーログの出力設定を行います。

Kinesis Firehoseに挿入されたデータを加工して保存先のAmazon S3に転送したい場合に使用するLambda functionの変換処理内でエラーが発生した場合や、Amazon S3へのデータ転送時に失敗した場合などにエラーログを出力するかどうかの設定項目です。出力設定にしている状態でエラーが発生した場合は、エラーログがCloudWatch内に出力されるようになります。

今回は、エラー発生時に出力するように設定しています。

Page 39: Kinesis Firehoseを使ってみた

Chapter2:Kinesis Firehose の使い方

転送処理の実行ロールを設定します。

Kinesis Firehoseのデータを保存先に転送を行う処理の実行ロール(権限)を設定します。実行ロールは、「該当処理内でAWSのどのサービスに対してどのレベルのアクセスを許可

するか」というアクセス可能なサービスと、そのサービスに対するアクセス許可レベル(読み込みのみ許可 or 書き込みも許可 etc)を設定するもので、転送処理で保存する保存先へのアクセス権限を設定しておく必要があります。

Kinesis Firehoseを新規作成時には、「Create new or Choose」ボタンから実行ロールの

編集画面に遷移することで、デフォルトで保存先サービスへのアクセス権限が設定された状態の実行ロールを作成可能なようになっています。

Page 40: Kinesis Firehoseを使ってみた

Chapter2:Kinesis Firehose の使い方

実行ロールの詳細設定を行います。

デフォルトでfirehose_delivery_roleという実行権限が選択されているので、画面右下の「許可」ボタンを押して転送処理に紐づける実行ロールを確定させます。(ポリシードキュメントを表示を開くと、Amazon S3サービスへの各種アクセス権限が設定されている事が確認できるはずです)

Page 41: Kinesis Firehoseを使ってみた

Chapter2:Kinesis Firehose の使い方

作成した内容を確認し、問題がなければ作成します。

これまでに設定した項目が全て確認可能な最終確認画面に遷移後、設定内容が間違っていないか一通り確認し、問題がなければ「Create delivery stream」ボタンで作成します。

Page 42: Kinesis Firehoseを使ってみた

Chapter2:Kinesis Firehose の使い方

Kinesis FirehoseのTOP画面に作成したstreamが表示される事を確認します。

作成が完了するとKinesis FirehoseのTOP画面に表示されるようになります。

Page 43: Kinesis Firehoseを使ってみた

Chapter2:Kinesis Firehose の使い方

Kinesis Firehose側の準備が整ったので、作成したKinesis Firehoseにデータを挿入してAmazon S3に転送してみましょう。

Page 44: Kinesis Firehoseを使ってみた

Chapter2:Kinesis Firehose の使い方

Kinesis Firehose に値を入れる自作処理作成

今回は、Kinesis Firehoseに値を入れる方法を自作コードなどから直接値を入れる形式を指定した為、実行環境の用意が簡単なPythonで簡単なスクリプトコードを作成してデータを挿入してみます。

Page 45: Kinesis Firehoseを使ってみた

Chapter2:Kinesis Firehose の使い方

Kinesis Firehose に値を入れる自作処理作成

Kinesis Firehoseに値を挿入するコード作成の前に、コード上で使用するKinesis Firehoseにアクセス可能なIAMUserのクレデンシャルを取得します。

以下の手順でIAM ユーザを作成し、クレデンシャル情報を保存します。

1. コンソール画面TOPからセキュリティ認証情報→ ユーザー→ ユーザーを追加選択

1. ユーザー名に適当な名前(test-firehose-full-access-user など)を入力

1. アクセスの種類は、「プログラムによるアクセス」を選択

1. 既存のポリシーを直接アタッチを選択後、AmazonKinesisFirehoseFullAccessを選択

1. ユーザーの作成を選択後、.csvファイルのダウンロードボタンでファイルをDL

1. DLしたファイルを開き、クレデンシャル情報を控えておく

Page 46: Kinesis Firehoseを使ってみた

Chapter2:Kinesis Firehose の使い方

Kinesis Firehose に値を入れる自作処理作成

次に、PythonからAWSの各種サービス(今回のKinesis Firehose含む)へのアクセスを行う為のライブラリであるboto3を用意します。

boto3はpythonからAWSの各種サービスを行う為のAmazonが提供し

ている公式ライブラリですが、ローカルマシン含むサーバ上ではデフォルトで用意されていない為、pipを使用してインストールする必要があります。

Page 47: Kinesis Firehoseを使ってみた

Chapter2:Kinesis Firehose の使い方

Kinesis Firehose に値を入れる自作処理作成

全ての用意が整ったところで、以下のサンプルコードのようなものを用意、コンソールから実行してKinesis Firehoseに値を挿入します。

Page 48: Kinesis Firehoseを使ってみた

Chapter2:Kinesis Firehose の使い方

Kinesis Firehose に値を入れる自作処理作成

Kinesis Firehoseのデータロード間隔が60秒間隔の為、60秒経過後に転送後の保存先に指定したS3バケットを確認するとファイルが作成されているはずです。

Page 49: Kinesis Firehoseを使ってみた

Chapter2:Kinesis Firehose の使い方

Kinesis Firehose に値を入れる自作処理作成

Amazon S3から転送後のファイルをダウンロードして中身を確認してみると、Pythonコード上で送ったテスト文字列が正しく入っている事が確認できます。

Page 50: Kinesis Firehoseを使ってみた

Chapter3:Kinesis Firehose を使って実現できそうなこと

1. 中身の参照が難しいKVSのデータを、分析用データベースに転送

大量のデータを溜め込み、レコード取得時に取得したいレコードを一意に識別できるKeyを指定して対象レコードを取得する使い方をするKVS(Key-Value Store)ですが、大量のデータを溜め込めるメリットもある一方、データを取得する際に必ずKey を指定しなければならず、溜め込んだデータを分析用途などで使用するのにはあまり向いていない面もあります。

この問題を解消する為に、KVSのデータを Kinesis に流し、更に Kinesis から分析用

途で使用するデータベースに転送すれば、溜め込んだ大量のデータに対して分析よ用のクエリを実行することが可能になり、KVSのデメリットを解消できそうです。

Page 51: Kinesis Firehoseを使ってみた

Chapter3:Kinesis Firehose を使って実現できそうなこと

AWSのサービスで考えると、KVSはDynamoDBが

該当し、分析用途で使用するデータベースはAmazon Redshiftが該当する為、DynamoDBに入ってきたレコードをKinesis Firehoseに一度流し、Kinesis Firehoseが受け取ったレコードの情報をAmazon Redshiftに転送すると良さそうです。

Page 52: Kinesis Firehoseを使ってみた

Chapter3:Kinesis Firehose を使って実現できそうなこと

DynamoのレコードをRedshiftに転送するイメージ図

Page 53: Kinesis Firehoseを使ってみた

Chapter3:Kinesis Firehose を使って実現できそうなこと

2. アプリケーションログなどの時系列ログデータをビジュアライズ表示

各種アプリケーションが出力するログ情報はサービスを運用していく上で非常に大事な情報として使用可能ですが、これらの情報をそのまま見ようとすると grep コマンドなどを毎回使用しながらでないと見たい情報を見る事ができません。

この問題を解決する為に、各種ログ情報を時系列にまとめた上で、人間が見る用に最適化した状態を予め作成しておき、見たい時に見たい情報をすぐに見れるような環境を作成しておけば、日々の業務効率が大きく上がりそうです。

Page 54: Kinesis Firehoseを使ってみた

Chapter3:Kinesis Firehose を使って実現できそうなこと

AWSのサービスで考えると、時系列で溜めたデータを見れるようにするのはAmazon

Elasticsearch Serviceが該当する為、各種アプリケーションのログ情報をKinesis Firehoseに挿入するようにし、Kinesis Firehoseが受け取ったレコードの情報をAmazon Elasticsearch Serviceに転送、KibanaからElastisearchに入れられたデータを参

照してビジュアライズ表示させるのが良さそうです。

Page 55: Kinesis Firehoseを使ってみた

Chapter3:Kinesis Firehose を使って実現できそうなこと

こんな感じで綺麗に表示させたい!

Page 56: Kinesis Firehoseを使ってみた

Chapter3:Kinesis Firehose を使って実現できそうなこと

各種アプリケーションの時系列ログをKibanaで参照するイメージ図

Page 57: Kinesis Firehoseを使ってみた

Chapter4 :Kinesis Firehose を使用したデータ転送を実演してみる

時間が余れば実際にデータ転送処理が実行されるところを実演してみます。

Page 58: Kinesis Firehoseを使ってみた

ご静聴ありがとうございました。