パーソンリンクアドベントカレンダー11日目の投稿です。
こんにちは桑原です。
kinesisを案件で使った際にサクッとうまく行かない構成で開発を行ったのでアンチパターンとしてメモしておきます。
#kinesisとは
まず初めにkinesisについて解説します。
ざっくりいうと膨大なデータをシャードという単位でまとめて別のシステム送信するサービスとなります。
送信先にはS3、Lambda、Firehoseなど様々なAWSのサービスへ連携が可能です。
以下、AWS公式の解説です。
Amazon Kinesis でストリーミングデータをリアルタイムで収集、処理、分析することが簡単になるため、インサイトを適時に取得して新しい情報に迅速に対応できます。Amazon Kinesis は、アプリケーションの要件に最適なツールを柔軟に選択できるだけでなく、あらゆる規模のストリーミングデータをコスト効率良く処理するための主要機能を提供します。Amazon Kinesis をお使いになると、機械学習、分析、その他のアプリケーションに用いる動画、音声、アプリケーションログ、ウェブサイトのクリックストリーム、IoT テレメトリーデータをリアルタイムで取り込めます。Amazon Kinesis はデータを受信するとすぐに処理および分析を行うため、すべてのデータを収集するのを待たずに処理を開始して直ちに応答することが可能です。
※https://aws.amazon.com/jp/kinesis/
#kinesisに連携可能なサービス
今回は案件で利用しようとした2つを紹介します。
##Amazon Kinesis Data Firehose
Firehoseはkiensisからのデータを別のサービスへロードすることができます。
kinesis → Firehose → s3のような連携であればコンソールからの設定のみで実行可能です。
※https://aws.amazon.com/jp/kinesis/data-firehose/
##Amazon Kinesis Data Analytics
Analyticsはkinesisから受け取ったデータをリアルタイムで分析を行うことが可能です。
※https://aws.amazon.com/jp/kinesis/data-analytics/
#今回陥った事象
上記のkinesisに連携可能なサービス一覧に連携できない状態に陥りました。
##kinsisに合わない仕様(AWSサポートお墨付き)
kinesisはデータを送信する際にレコード単位で処理できる想定ですが、今回の用件ではデータが圧縮されて送信される状態でした。
圧縮することでシャード数を削減し、料金を大幅に下げることが可能なためこの仕様を選択したとのことでした。(一理あります)
詳しい数字は出せないのですが計算上シャード数は10分の1程度まで下がり料金的にも大幅な削減となっていました。
しかし圧縮することで連携できないサービスがあることが判明しました。
##連携できないサービス
kinesisに連携可能なサービス一覧で記載した下記サービスに非対応の圧縮ファイルを用いることで意図した挙動で処理が実行されない状態でした。
マネージドサービスが使えずにとても悲しかったことを覚えています。
・Firehose
・Analytics(zipは対応しているようです)
##対応方法
Firehoseが利用できないことがわかったため、lambdaとfluentdを使ってkinesisからデータ取得を行っています。
それぞれの処理途中で解凍処理を実行しています。
現状では膨大なデータでの連携テストを実施できていないですが、秒間数千程度であれば処理途中での解凍は問題なく実行できています。
処理速度の問題でPythonからGoへ言語を変更するなどを行いました。
#今後起きる可能性がある未解決事項
kinesisの後続処理で解凍とリアルタイムでのデータ送信を行っているため、秒間数十万件というデータが流れてきた場合にkinesisと同じ速度でデータを流すことが可能なのかの検証が必要です。
スケールアウト可能な設計になっているのでkinesisで節約した分がここに乗る気がしています。
#まとめ
サービスにあった仕様で構築できれば公式のベストプラクティスに当てはまった開発もでき期間の短縮が可能だったと思います。
サービスには想定された使い方がありそこから外れると大変な目に合ったという体験談でした。