Load to Professional...

AWSエンジニアの日常。地に足をつける。

【ハンズオン参加レポ】「AWSの基礎を学ぼう 特別編 最新サービスをみんなで触ってみる はじめての位置情報サービス」に参加しました

f:id:oni_rb:20210529232133p:plain

はじめに

本日は毎週土曜日恒例のAWSハンズオンに参加しました。

今日はAWS Location Serviceという名前も初めて聞いたサービスのハンズオンでした。
調べてみたら正式ローンチが2021年6月という直近でリリースされたサービスでした。

いつもはさらっと全体の流れとハンズオン内での感想を記事にした参加レポ形式での投稿でしたが、今日は再度ハンズオンをやり直しながら振り返りをする、そんな投稿にしてみます。

事前準備

下記のGitHubから資材をダウンロードしましょう

https://github.com/harunobukameda/Amazon-Location-Service:embed:

リポジトリをローカルにgit cloneするのが一番早いと思います

ハンズオン

今回使用するハンズオンのシナリオはダウンロードした「location service workshop」をつかって進めていきます。(PDFでもドキュメントでもどちらでもOK)

概要

ハンズオンのシナリオをまとめると下記の流れになっています。

  1. Amazon Location serviceで地図(Maps)を作成
  2. 認証基盤の作成
  3. 地図を埋め込んだHTMLの作成とホスティング
  4. Location ServiceでGeo Fence機能を実装
  5. Location ServiceでTrackerを作成
  6. Lamda関数を作成
  7. IoT coreのルールアクションを設定
  8. IoT CoreのからMQTTテストクライアントからテスト実施 `

項目を並べていても少しイメージしづらいと思うので、実際にハンズオンを復習したときのキャプチャを見ていきましょう! 手順通り実施していくと、ざっとこんな感じのものができますよというくらいのスクショを貼り付けています。

ハンズオン実施

リージョンはバージニア西部でやっていますが、基本Location Serviceがサポートしているリージョンならどこでもできるかと思います。

1. Amazon Location serviceで地図(Maps)を作成

地図の名前をつけ、地図の種類を選択 f:id:oni_rb:20210718141735p:plain

リクエストベースの課金を選択 f:id:oni_rb:20210718141811p:plain

地図が作成できた f:id:oni_rb:20210718141829p:plain

2. 認証基盤の作成

Cognito IDプールを作成する

※「認証されていないIDに対するアクセスの有効化」をやっておくこと f:id:oni_rb:20210718141911p:plain

IDプールと同時にCognito認証用のIAMロール(認証必要版と不要版の2種類)が作成される。

認証不要版のロールに、1で作成したMapにアクセスできるポリシーをアタッチします。 f:id:oni_rb:20210718142024p:plain

3. 地図を埋め込んだHTMLの作成とホスティング

バージニア北部リージョンにS3のバケットを作成する。

ダウンロードした「test.html」を手順通り修正し、作成したS3バケットにアップロードする。 f:id:oni_rb:20210718142044p:plain

アップロードしたオブジェクトのパブリックアクセス許可の設定を行う。

バケットのアクセス許可設定→オブジェクトのアクセス許可設定の順番で設定します。

アクセス許可設定後、オブジェクトのURLにアクセスし地図が表示されたら成功! f:id:oni_rb:20210718142135p:plain

4. Location ServiceでGeo Fence機能を実装

https://geojson.io/で任意の位置情報を取得する。

今回は京都御所の付近にしてみた。 f:id:oni_rb:20210718142409p:plain

最寄りの駅にピンを落とし、座標をメモ。 f:id:oni_rb:20210718142211p:plain

駅を囲うように領域を作成し、出力されたJSON全体を「geo.json」として保存。 f:id:oni_rb:20210718142226p:plain

領域外にピンを落とし、座標をメモ。 f:id:oni_rb:20210718142806p:plain

Location serviceのマネコンでGeo fence collectionを作成し、Geofenceを追加。 f:id:oni_rb:20210718142310p:plain

メモった座標が問題無ければ登録できるはず

5. Location ServiceでTrackerを作成

Trackerを作成し、4で作ったGeo FenceとLinkさせる f:id:oni_rb:20210718142345p:plain

6. Lamda関数を作成

LambdaからLocation ServiceにアクセスするためのIAMロールを作成する
→Locationサービス用のIAMポリシーがないため、Administartorアクセス用のポリシーを使用する(強すぎる権限のためほんとは良くない) f:id:oni_rb:20210718142505p:plain

Lambda関数を作成する
→実行ロールに既存のロール→先程作成したロールを指定する f:id:oni_rb:20210718142529p:plain

コードソースのlambda_function.pyに「lambda.txt」の中身を貼り付け、deployする
→7行目のTRACKER_NAMEの変数を作成したTrackerの名前に書き換えておく f:id:oni_rb:20210718142554p:plain

7. IoT coreのルールアクションを設定

IoTCoreのマネコンからルールアクションを設定する
→「1つ以上のアクションを設定する」で6で作成した関数を設定する
→手順書の「SELECT * FROM 'iot/location'」の一番うしろの「'」が全角になっているので注意!
f:id:oni_rb:20210718142834p:plain

Lambda関数側から確認するとトリガーにIoT Coreが設定されていることが確認できる。 f:id:oni_rb:20210718142906p:plain

8. IoT CoreのからMQTTテストクライアントからテスト実施

事前にCloudWatch logsの画面を出しておき、MQTTテストクライアントからトピックを公開する
はじめに領域内側の位置情報を入力したもの、次に領域外の位置情報とタイムスタンプを変更したものでテストを実施する f:id:oni_rb:20210718143338p:plain

CloudWatch logsのストリームで「Enter」「Exit」のログが確認できる f:id:oni_rb:20210718142946p:plain f:id:oni_rb:20210718142959p:plain

お片付け

下記サービスを削除します
※手順ではCognito IDプールが不足してます

  • Cognito IDプール
  • Location Service
    • Trackers
    • Geofence collection
    • Maps
  • Lambda関数
  • S3バケット
  • IAMポリシーとロール
  • AWS IoT Core
    • ルール

以上、ハンズオンの復習を実施しました。
気になった方は、ぜひハンズオンでサービスに触れてみてください。

最後に、の前に個人的にハマったところや参加者の方がハマっていた点がいくつかあったので、紹介したいと思います。

はまったところ

1. 位置情報の指定時のミス

  • 緯度経度の指定を逆にしてしまって、エラーになったそうです。
  • locationで指定しているlat、longは、latitude(緯度)とlongitude(経度)の略なので、逆にしてしまうと地球に存在しない座標になってしまいます。
{
  "payload": {
    "deviceid": "GPS-Device-001",
    "timestamp": 1608166810,
    "location": {
      "lat": 35.0302,
      "long": 135.7594
    }
  }

2. タイムスタンプの更新

  • IoT Coreのテストクライアントを何度か実行したときは、実行に失敗したときでもタイムスタンプを更新し続けないとNG
    • 時間を置いたときは10刻みだとだめだったので50くらい増やしたりした
  • タイムスタンプを厳密に監視しているようです

↑このタイムスタンプってなんなんだ??って思って調べてみた

https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/life-cycle-events.html

timestamp イベントが発生した時間の近似値 (Unix エポックからのミリ秒単位)。timestamp の精度は +/- 2 分です。

→ うーん謎。実際の時間じゃなくて相対的な時間ってことなんかな。

(7/18 21:17 追記)
亀田さんからTwitterで返信頂いた。

→相対的な時間と勘違いしていたが、逆でエポックタイムは絶対時間だった。基準値から何秒後とかそういったケースで役に立つのでiot系システムでよく使われるみたいですね。

3. Geo FenceとTrackerのリージョン間違えでLambdaの実行エラーになっていた。

  • 初回実行だとLambda用のロググループが作成されなく、エラーが検知できないのでLambdaコンソールからテストを実施し発覚した。 f:id:oni_rb:20210718144748p:plain

4. TrackerのLink忘れ

  • 再作成したときにTrackerとGeoFenceのLinkを失念して、Location ServiceのCloudWatch logsに出力されなかった。

最後に

本日は新しいサービスのAmazon Location Serviceだけでなく、IoTについても少し学ぶことができました。
IoTというワードは興味がないわけではなかったですが、実際どんな技術なのか、どんな事ができるのかわかっていなかったので、身近に感じることができた気がします。

今回は仮想Trackerを使用しましたが、IoTデバイスがあれば実際の位置情報を使用することももちろん可能なので持ってる方はやってみてはどうでしょう?
1万円前後から買えるようなのでみたいなので、そのうち欲しくてたまらなくなったら買うかもしれません笑