SORACOM Funnel の `timestamp` を Elasticsearch で自動mappingする方法


TL;DR

これを Elasticsearch に流し込んでおくことで、 SORACOM Funnel から出力される timestamp メタデータを Elasticsearch 上で Timestamp として認識できます

$ curl -X PUT -H "Content-Type: application/json" -d @- <<EOT https://$ES_HOST/_template/my_map_tpl
{
  "template": "YOUR_INDEX_NAME*",
  "mappings": {
    "YOUR_TYPE_NAME": {
      "properties": {
        "timestamp": {
          "type": "date",
          "format": "epoch_millis"
        }
      }
    }
  }
}
EOT

SORACOM Funnel とは?

ざくっと言ってしまうと funnel.soracom.io にデータを送信すると、SORACOM上で指定したクラウドサービスへデータを転送してくれるサービスです
下記のように funnel.soracom.io にデータを渡すと...

$ echo '{"my_data":1}' | curl -H "Content-Type: application/json" -d - funnel.soracom.io 

クラウド側では下記の通りのJSONを受け取ることができます

{
    "operatorid": "ソラコムのアカウントID",
    "timestamp": "funnelがデータを受け取った日時(unix time)",
    "destination" : {
        "resourceUrl": "送信先クラウドサービスのURL",
        "service": "(aws-iot|kinesis|firehose|eventhubs|pubsub)",
        "provider":"(aws|azure|google)"
    },
    "credentialId": "ソラコムの認証情報のID",
    "payloads": {
        "my_data": 1 //実際のデータ
    },
    "sourceProtocol": "(tcp|udp|http|unspecified)",
    "imsi": "送信元のSIMのIMSI"
}

どんなクラウドサービスに送れるのか等の概要はSORACOM Funnelの概要を見てください

SORACOM Funnel の timestamp

SORACOM Funnel ではタイムスタンプを SORACOM側 で付与してくれます。送信側で付ける必要がありません
この timestamp ですがフォーマットは epoch millis です。即ち、millisecondsまでくっついた UNIX time になります

※余談: current millisなんてサイトがあるんですね

Elasticsearch で自動認識させる方法

SORACOM Funnel から Elasticsearch へは直接データを流すことができませんので、AWS IoT や AWS Lambda のようなものを経由する必要があります
たとえば デバイス ⇒ SORACOM Funnel ⇒ AWS IoT ⇒ Amazon Elasticsearch Service という構成があります

Elasticsearchは残念なことにUNIX timeっぽい数値を Number型 として認識してしまい、Date型として自動mappingされません
ただし、Elasticsearch自体は milliseconds付きのUNIX time(epoch time)をサポートしてますので Elasticsearchの自動マッピングの一部を上書きする方法 を使ってmappingすることができます

マッピングテンプレートは下記のとおりです。 YOUR_INDEX_NAME*YOUR_TYPE_NAME を環境に合わせれば動きます

epoch_millis_mapping.json
{
  "template": "YOUR_INDEX_NAME*",
  "mappings": {
    "YOUR_TYPE_NAME": {
      "properties": {
        "timestamp": {
          "type": "date",
          "format": "epoch_millis"
        }
      }
    }
  }
}

あとがき

ひさびさにちゃんと書いた

EoT