Soracom Funnel + Amazon Kinesis Firehose + Amazon RedshiftでIoTデータを蓄積する環境をコードレスに構築する
こんにちは、せーのです。
最近のIoT界隈ではクラウドサービスが非常に充実していまして、ほとんどコードを書くことなくデータの流れが出来てしまいます。
今回は大量のIoTデータをRedshiftに蓄積して分析したい、というソリューションをコードレスで構築する方法をご紹介します。
概要
今回想定しているソリューションはこのような感じです。
IoTデバイスから定期的にデータをクラウドに飛ばし、それをRedshiftに蓄積、BIツールにて解析する、というソリューションです。 この場合データの流れのポイントとしては
- どうやってデータをクラウドにあげるか
- どうやってデータをRedshiftに蓄積させるか
- 大量データを捌けるか
というような課題が考えられます。そこで同時アクセス数が無制限(2016/08)であるSoracom Funnelを使用して確実にデータをAWSまで運び、AWS側でKinesisを用いてデータの流量を調整、1つづつ確実にRedshiftに入れていきます。Soracom FunnelにはKinesis Firehoseに対応するアダプタがあり、選択するだけでAWSにデータを流してくれます。そしてKinesis FirehoseはRedshiftへ直接データを格納することが出来ます。
つまりFunnelに対してデータを流してしまえば後は一切のコーディング無しにDWHであるRedshiftまでデータを流すことができるわけです。便利ですね。
やってみた
それではやってみます。今回はテストと言う事でこのようなデータを流してみます。
{ "data1": 1.1, "data2": 2.2, "data3": 3.3 }
Kinesis Firehoseは現在東京リージョンには来ていないのでオレゴンリージョン(us-west2)にて構築してみます。
IAM User / IAM Roleの作成
まずは権限系を作ってしまいます。 今回のソリューションにはSoracom Funnelに対してKinesis Firehoseにアクセスする権限とKinesis Firehoseに対してS3バケットにアクセスする権限が必要です。前者はIAM Userを作成してAPI KEY / API SECRETをSoracomに渡してあげます。後者はIAM Roleを設定します。
まずIAM Userを作成します。
作ったIAM UserでのAPI KEY / API SECRETを保存しておきます。この値を後でSoracomに設定します。
Kinesis Firehoseへのアクセス権を付けます。本番であればputstream等必要な権限のみに絞るとよりセキュリティ的にいい感じになります。
これでOKです。次にIAM Roleです。Firehoseに対するAssume RoleがGUIから設定できないのでとりあえずEC2を選択しておきます。
S3に対する権限を付けます。本番であればバケットの制限等を後で加えるといいかと思います。
IAM Roleが出来たら「信頼関係の編集」からAssume Role元を変更します。
EC2になっているのでFirehoseに変えて保存します。
これで権限関係はOKです。
S3バケットの構築
次にS3バケットを構築します。S3バケットは今回でいうと「Firehoseに来たデータを受けるバケット」と「Jsonpathsファイルを保管するバケット」の2つ作ります。
Jsonpathsファイルの作成
Firehoseに入ってきたデータをRedshiftに流す為のJsonpathsファイルを書きます。Soracom Funnelを通してデータをあげると本データの他にIMSI等色々なヘッダが付きます。
{"operatorId": "OP0067881737", "timestamp": 1477473791613, "destination": {"resourceUrl": "https://firehose.us-west-2.amazonaws.com/XXXXXXX", "service": "firehose", "provider": "aws"}, "credentialsId": "XXXXXXXXXX", "payloads": {"data1": 1.1, "data2": 2.2, "data3": 3.3}, "sourceProtocol": "http", "imsi": "XXXXXXXXXXXXXXXXX"}
ここから必要となる本データのみをピックアップしてRedshiftに入れるようにします。Jsonpathsファイルについてはこちらを参考にして下さい。
Amazon RedshiftにJSONフォーマットのデータをインポートする | Developers.IO
{ "jsonpaths": [ "$['payloads']['data1']", "$['payloads']['data2']", "$['payloads']['data3']" ] }
このファイルに名前をつけてS3にアップロードしておきます。
Redshiftの構築
VPCを作り、サブネット内にRedshiftを構築します。サクッとつくるために今回はIoTテンプレートを一部利用してみました。
セキュリティグループを設定する
ここでポイントとしてFirehoseからRedshiftへデータを流せるようにFirehoseのIPアドレスレンジをセキュリティグループにて空けておく必要があります。FirehoseのIPレンジはここによると52.89.255.224/27(オレゴンリージョン)になるので、このIPレンジの5439ポート(Redshift使用ポート)をセキュリティグループにて空けておきます。
テーブルの作成
Redshiftにテーブルを作成します。テーブルのカラム名はJsonのカラム名と同じにするとJsonpathsファイルが活きてくるのでそのようにします。
CREATE TABLE test ( data1 float, data2 float, data3 float );
Kinesis Firehoseの構築
Firehoseを構築します。
COPY OPTIONには先程Jsonpathsファイルを格納したS3のパスを、IAM Roleは最初に作成したIAM Roleを選択します。
Soracom Funnelの設定
最後にSoracomの設定です。Soracomの設定についてはこちらを参考にしてみて下さい。
Fluentdから#SORACOM Funnel経由でAmazon Kinesis Firehoseにログを送信する | Developers.IO
Soracomのコンソール画面から「セキュリティ」 -> 「認証情報ストア」を選択し、最初に作成したIAM UserのAPI KEY / API SECRETを入れます。
認証情報を保存したら「グループ」を選択してグループを新規に作成、Funnelの作成ペインからFunnelを選んで先程の認証情報、URLを入れていきます。
あとはこのグループを使用するSIMに紐付ければ完成です。
テスト
それではテストしてみましょう。Funnelに向けてデータを投げてみます。
curl -vX POST http://funnel.soracom.io -d '{"data1":1.1, "data2":2.2, "data3":3.3}' -H Content-Type:application/json
DBツールでRedshiftを見てみます。
データが入っていますね。成功です。
まとめ
いかがでしょうか。一切のコードを書かずにここまでの環境を構築することが出来ました。これでIoTデータの分析はバッチリですね!
皆さんも是非参考にして下さい。