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
を環境に合わせれば動きます
{
"template": "YOUR_INDEX_NAME*",
"mappings": {
"YOUR_TYPE_NAME": {
"properties": {
"timestamp": {
"type": "date",
"format": "epoch_millis"
}
}
}
}
}
あとがき
ひさびさにちゃんと書いた
EoT