📍

AWS IoT Coreの 新ルール Location Action を試してみる

2022/12/14に公開

こちらの記事は、
AWS Community Builders Advent Calendar 2022
12/13分の記事です。すみません。1日遅れました。


今回は、10月に出たAWS IoT Coreでルールを指定して、Amazon Location Serviceにデータを投入する機能、聞いた時にやってみないーと思いつつ、やっていなかったので、こちらをやってみました。

https://aws.amazon.com/jp/about-aws/whats-new/2022/10/aws-iot-core-location-action-route-location-data-iot-devices-amazon-location-service/


ちなみに、こっちとは違うのでご注意を。(ちょっと触って、自分がやりたいのとは違うと思った人(ドキュメントちゃんと読め事案))

https://aws.amazon.com/jp/about-aws/whats-new/2022/11/aws-iot-core-new-device-location-feature/


AWS IoT Coreにデータを送信する

データの送信元のデバイスには、
SORACOMさんが発売しているGPSマルチユニットを利用します。
個人的には2022年12月現在、位置情報を最も簡単に取得できるデバイスだと思っています(異論は認めます)

https://soracom.jp/store/5235/

元々、検証がてら、Amazon Location Serviceには、以下のような構成で、データを投入しています。

SORACOM Funkというサービスを使って、AWS Lambdaを呼び出して、Lambda関数内で、AWS Location Serviceにデータを投入するという構成です。

https://soracom.jp/services/funk/

これをAWS IoT Coreにデータを送信するように変えます。
まず、SORACOM側で利用するサービスをAWS IoTアダブターのあるSORACOM Funnelに変更します。

https://soracom.jp/services/funnel/

この辺の変更方法は、SORACOM側の設定なので、割愛します。
以下のドキュメントの通りの手順で行いました。

https://users.soracom.io/ja-jp/docs/funnel/aws-iot/

設定に問題なければ、IoT Core側に以下のような感じで、データが送信されてます。

{
  "credentialsId": "soracom-funnel-iot-core",
  "operatorId": "OP1234567890",
  "destination": {
    "provider": "aws",
    "service": "aws-iot",
    "resourceUrl": "xxxxxxxxxxx.iot.ap-northeast-1.amazonaws.com/funnelTopic/#{imei}",
    "payloadsOnly": false,
    "sendPayloadsAsBinary": false
  },
  "sourceProtocol": "udp",
  "payloads": {
    "lat": 35.111111,
    "lon": 139.222222,
    "bat": 3,
    "rs": 2,
    "temp": 22.2,
    "humi": 24.3,
    "x": 0,
    "y": 896,
    "z": -576,
    "type": 0
  },
  "timestamp": 1671026100175,
  "imsi": "123456789012345",
  "imei": "987654321012345"
}

緯度、経度以外にも、温湿度のデータも送られてきますが、今回は利用しません。

Rule設定

データが来たことを確認できたので、Ruleの設定を行います。

Ruleの名前を設定します。

続いて、SQLステートメントを設定します。
とりあえず、受信したデータを全て送るようにします(改善したい)

次の画面でルールアクションを設定します。「場所(Locationそのまま日本語になってますね)」を選択します。

選択すると、送信するトラッカーや送信する項目を入力するフィールドが出てくるので入力します。


デバイスIDですが、文字列を埋め込むこともできますが、複数デバイス送信となると、そうもいかないので、
受信データのうち、IMEI(International Mobile Equipment Identity)という端末個別の番号を使うことにしました。${imei} という感じでセットします。

気づかず、設定できねーと悩んだ人です。

緯度、経度は、payload.latpayload.lon にセットされてくるので、
それらを${payload.lat} ${payload.lon} と指定します。

timestampも渡ってくる値をそのまま使えるので、同じように ${timestamp} で指定します。

IAMロールも適切なのがなければここで作成できます。
なお、作成されるロールは、選択したトラッカーにデータを投入(BatchUpdateDevicePosition)できるものでした。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "geo:BatchUpdateDevicePosition",
            "Resource": "arn:aws:geo:ap-northeast-1:123456789012:tracker/necklaceOfArtemisSystemMapTracker"
        }
    ]
}

あとは登録すればOKです。

動作確認

さて、持ち歩いてみて、自宅のそばのモールにGeoFenceを設定してあるので位置情報が送信されて、GeoFenceで検知するのを確認します。
こんな感じで、全く問題なしでした。(位置バレするのでめっちゃ隠してすみません)

※通知の内容、SORACOM UGの勉強会で設定したままでしたorz

まとめ

SQLの部分、まだまだ改善の余地ありますが、
ルールの設定だけでAmazon Location Serviceへデータ投入ができ、GeoHenceでの検知もできました。
AWS Lambda好きとしては、Lambdaからデータで投入の方が・・・と思うんですが、
AWS IoT CoreのRule設定だけで投入できるのは楽ですね。
しばらくはこっちの構成にしておこうかなと思います。

今回久々にIoT Core触ってみて、Rule色々あることに改めて気づいたので、他のも試してみようかなと思います。

Discussion