Soracom Funnel + Amazon Kinesis Firehose + Amazon RedshiftでIoTデータを蓄積する環境をコードレスに構築する

2016.11.01

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、せーのです。
最近のIoT界隈ではクラウドサービスが非常に充実していまして、ほとんどコードを書くことなくデータの流れが出来てしまいます。
今回は大量のIoTデータをRedshiftに蓄積して分析したい、というソリューションをコードレスで構築する方法をご紹介します。

概要

今回想定しているソリューションはこのような感じです。

firehose_redshift2

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を作成します。

firehose_redshift3

作ったIAM UserでのAPI KEY / API SECRETを保存しておきます。この値を後でSoracomに設定します。

firehose_redshift4

Kinesis Firehoseへのアクセス権を付けます。本番であればputstream等必要な権限のみに絞るとよりセキュリティ的にいい感じになります。

firehose_redshift5

これでOKです。次にIAM Roleです。Firehoseに対するAssume RoleがGUIから設定できないのでとりあえずEC2を選択しておきます。

firehose_redshift6

S3に対する権限を付けます。本番であればバケットの制限等を後で加えるといいかと思います。

firehose_redshift7

IAM Roleが出来たら「信頼関係の編集」からAssume Role元を変更します。

firehose_redshift8

EC2になっているのでFirehoseに変えて保存します。

firehose_redshift9

これで権限関係はOKです。

S3バケットの構築

次にS3バケットを構築します。S3バケットは今回でいうと「Firehoseに来たデータを受けるバケット」と「Jsonpathsファイルを保管するバケット」の2つ作ります。

firehose_redshift10

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にアップロードしておきます。

firehose_redshift11

Redshiftの構築

VPCを作り、サブネット内にRedshiftを構築します。サクッとつくるために今回はIoTテンプレートを一部利用してみました。

firehose_redshift12

セキュリティグループを設定する

ここでポイントとしてFirehoseからRedshiftへデータを流せるようにFirehoseのIPアドレスレンジをセキュリティグループにて空けておく必要があります。FirehoseのIPレンジはここによると52.89.255.224/27(オレゴンリージョン)になるので、このIPレンジの5439ポート(Redshift使用ポート)をセキュリティグループにて空けておきます。

firehose_redshift13

テーブルの作成

Redshiftにテーブルを作成します。テーブルのカラム名はJsonのカラム名と同じにするとJsonpathsファイルが活きてくるのでそのようにします。

CREATE TABLE test (
  data1 float,
  data2 float,
  data3 float
);

Kinesis Firehoseの構築

Firehoseを構築します。

firehose_redshift14

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を入れます。

firehose_redshift15

認証情報を保存したら「グループ」を選択してグループを新規に作成、Funnelの作成ペインからFunnelを選んで先程の認証情報、URLを入れていきます。

firehose_redshift16

あとはこのグループを使用する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を見てみます。

firehose_redshift17

データが入っていますね。成功です。

まとめ

いかがでしょうか。一切のコードを書かずにここまでの環境を構築することが出来ました。これでIoTデータの分析はバッチリですね!
皆さんも是非参考にして下さい。