AWS謹製！　IoTを学ぶアプリ登場

# 始めに

この記事は[AWS Community Builders Advent Calendar 2023](https://qiita.com/advent-calendar/2023/aws-community-builders)シリーズ2の12月17日分として登録されています。

# AWS Community Buildersとは

> AWS コミュニティビルダーズプログラムは、知識の共有や技術コミュニティとの連携に熱心な AWS 技術愛好家や新興のソートリーダーに、技術リソース、教育、ネットワーキングの機会を提供するプログラムです。

[AWS公式サイト](https://aws.amazon.com/jp/developer/community/community-builders/)より引用しました。興味のある方はぜひリンク先をご覧になり、次のチャンスに挑戦しましょう！

# 本題

## 経緯

去る2023年12月15日（金）、アマゾン　ウェブ　サービス　ジャパン目黒オフィスとオンラインのハイブリッドにて[JAWS-UG IoT専門支部](https://www.facebook.com/groups/jawsug.iot)イベント[「re:Invent振り返りとAmazon Monitron」](https://jawsug-iot.connpass.com/event/301998/)が開催されました。

この記事では、本イベントで紹介されたAWS関連の新技術／新サービスの中から、サプライズ公開となったスマホアプリ「[AWS IoT Sensors](https://apps.apple.com/jp/app/aws-iot-sensors/id6447531633)」について紹介していきます。

## そもそも、AWS IoTとは

AWS IoTとは、AWSが提供するIoT向けサービス全体を表す総称です。

```plantuml
@startuml
<style>
root {
  Padding 0
  Margin 0
}
footer {
  FontColor black
  FontSize 20
}
</style>
footer 図１　AWS IoT アーキテクチャ　
title <img:https://greennote-file-sharing.s3.ap-northeast-1.amazonaws.com/qiita/202312/architecture-diagram.png>
@enduml
```

サービス開始直後はメッセージ交換サービスであるAWS IoT CoreがAWS IoTを名乗っていましたが、機能拡充が行われる中で名称の整理が行われました。

## AWS IoTは難しい？

AWS IoTは難しい、という話をよく耳にします。それは確かにその通りで、上図のようなサービス群を理解、把握しようとすれば幅広い、深い知識が必要になることは間違いないでしょう。一方で、一般的なIoTワークロード、特にデータ収集と簡単な可視化だけであればカバーすべき範囲は限られており、個人的には他のIoTサービスにくらべて遙かに理解しやすいと感じています。

## とはいえ、どこから？

これだけ間口の広いサービス群のいったいどこから入ればよいのか、ということが、実はAWS IoTの中で一番難しいポイントかもしれません。それに対する答えのひとつが今回発表されたスマホアプリ「[AWS IoT Sensors](https://apps.apple.com/jp/app/aws-iot-sensors/id6447531633)」です。

# AWS IoT Sensors

AWS IoT Sensorsとは、スマートフォン（現時点ではiPhone）の内蔵センサの値をAWSに送信し、クラウド上で可視化を行うデモアプリです。サービス自体はAWS上で構築されていますが、以下の点で通常のIoTサービスとは異なっています。

- AWSアカウントが不要
- データの永続性はなく、エキスポートなども不可
- 同様に、事前準備されているもの以外とのサービス連携不可

## はじめかた

iPhoneのAppStoreから「AWS IoT Sensors」で検索し、見つかったアプリをインストールしてください。Appleシリコン対応のMacであれば同様にMac AppStoreからインストールすることができますが、内蔵センサがないため全く面白くありません。

```plantuml
@startuml
<style>
root {
  Padding 0
  Margin 0
}
footer {
  FontColor black
  FontSize 20
}
</style>
footer 図2　AWS IoT Sensors
title <img:https://greennote-file-sharing.s3.ap-northeast-1.amazonaws.com/qiita/202312/AWS_IoT_Sensors.jpg>
@enduml
```

## 起動しよう

インストールが完了したら通常のアプリと同じように起動してください。このような初期画面が表示されます。

```plantuml
@startuml
<style>
root {
  Padding 0
  Margin 0
}
footer {
  FontColor black
  FontSize 20
}
</style>
footer 図3　アプリAWS IoT Sensorsの初期画面
title <img:https://greennote-file-sharing.s3.ap-northeast-1.amazonaws.com/qiita/202312/AWS_IoT_Sensors_1.png>
@enduml
```

下に向かってセンサごとに表示画面が並びます。センサデータは1秒おきに取得されており、それに連れて画面も自動更新されます。

```plantuml
@startuml
<style>
root {
  Padding 0
  Margin 0
}
footer {
  FontColor black
  FontSize 20
}
</style>
footer 図4　加速度／ジャイロ／磁気センサの表示画面
title <img:https://greennote-file-sharing.s3.ap-northeast-1.amazonaws.com/qiita/202312/acc_gyro_mag.png>
@enduml
```
```plantuml
@startuml
<style>
root {
  Padding 0
  Margin 0
}
footer {
  FontColor black
  FontSize 20
}
</style>
footer 図5　バッテリ／位置／気圧センサの表示画面
title <img:https://greennote-file-sharing.s3.ap-northeast-1.amazonaws.com/qiita/202312/bat_loc_baro.png>
@enduml
```

スマホの位置情報は、[Amazon Location Service](https://aws.amazon.com/jp/location/)と連携して扱われ、同サービスの機能を使って地図上に表示されます。スマホのデータなので非常に正確な位置が取得できています（マスクしているので分かりませんが）。

一番下には、動画などの大容量ストリームを扱うことのできるサービス「[Amazon Kinesis Video Streams](https://aws.amazon.com/jp/kinesis/video-streams/)」と連携するためのスイッチが設置されており、ONにするとカメラ画像が取得、表示されますが、AWSとの連携機能はまだ実装されていないようです。

```plantuml
@startuml
<style>
root {
  Padding 0
  Margin 0
}
footer {
  FontColor black
  FontSize 20
}
</style>
footer 図6　Kinesis Video Streamsとの連携はまだみたい
title <img:https://greennote-file-sharing.s3.ap-northeast-1.amazonaws.com/qiita/202312/kinesis.png>
@enduml
```

## AWSと接続する

センサ群が無事に動作し、データが取得されていることが確認できたので先に進みましょう。もう一度画面の一番上に戻ると、AWS IoTと連携するためのボタンがあることが分かります。タイトルの下にはステータス表示があり、まだAWSに接続していないことを示しています。

```plantuml
@startuml
<style>
root {
  Padding 0
  Margin 0
}
footer {
  FontColor black
  FontSize 20
}
</style>
footer 図7　接続ボタンとステータス表示
title <img:https://greennote-file-sharing.s3.ap-northeast-1.amazonaws.com/qiita/202312/AWS_IoT_Connection.png>
@enduml
```

青い接続ボタンを押すと（ネットワーク障害などがなければ）すぐに表示が変わり、AWSとの接続が確立された状態になります。

```plantuml
@startuml
<style>
root {
  Padding 0
  Margin 0
}
footer {
  FontColor black
  FontSize 20
}
</style>
footer 図8　接続完了状態
title <img:https://greennote-file-sharing.s3.ap-northeast-1.amazonaws.com/qiita/202312/AWS_Connected.png>
@enduml
```

ボタンの内容とステータス表示が変更された以外に、ShareボタンとURL表示が増えているのがわかります。

## 可視化してみる

Shareボタンを押すとURLがコピーされ、iOSの共有画面に移動します。URLをタップしても反応しないので注意が必要です。共有対象がURLなので、本来はSafariなどのブラウザを共有先として選択できるはずなのですが、うまく動作しません。後述しますがこのアプリの設計上Safariに共有できてもあまり嬉しくないためだと思われます。

```plantuml
@startuml
<style>
root {
  Padding 0
  Margin 0
}
footer {
  FontColor black
  FontSize 20
}
</style>
footer 図9　iOSの共有画面
title <img:https://greennote-file-sharing.s3.ap-northeast-1.amazonaws.com/qiita/202312/sharing.png>
@enduml
```

そこでまずはパソコン側のブラウザで表示してみましょう。iOS共有画面の「Copy」を押すとテキスト形式でURLがコピーされるので、何らかの方法でこれをパソコン側に転記してください。Macをお使いであれば、AirDropから対象を選択するだけで自動的に表示されます。

```plantuml
@startuml
<style>
root {
  Padding 0
  Margin 0
}
footer {
  FontColor black
  FontSize 20
}
</style>
footer 図10　データはこんなふうに表示されます
title <img:https://greennote-file-sharing.s3.ap-northeast-1.amazonaws.com/qiita/202312/quickconnect.png>
@enduml
```

スマホ側をぐりぐり回したりしてデータが準リアルタイムに更新されていることを確認してください。データ取得が1秒間隔なので素早い変化は取れませんが、遅延自体は1秒以内に収まっていると思います（ネットワーク障害などがなければ）。また位置情報はアプリ上と同じくAmazon Location Serviceを使って表示されていますが、デバイスの違いによりデザインが変わっており、より詳細な情報が表示されています。

## 接続が切れた！？

こんな風に遊んでいるうちに、こんな表示に遭遇するはずです。

```plantuml
@startuml
<style>
root {
  Padding 0
  Margin 0
}
footer {
  FontColor black
  FontSize 20
}
</style>
footer 図11　接続が切れた！？
title <img:https://greennote-file-sharing.s3.ap-northeast-1.amazonaws.com/qiita/202312/disconnect.png>
@enduml
```

安心してください。接続が切れたのではなく、「表示するデータがなくなった」のです。このアプリ／サービスは一般に公開されているため、プライバシー保護のためデータはどこにも保存されないような設計になっています。グラフ作成に使われるデータも同様です。画面に表示する分だけのデータが都度送られてきているので、一定時間データが来ないと接続が切れたかのような表示になってしまうのです。

この時、スマホ側はどうなっているでしょうか。おそらく可視化画面を見ているうちにスリープしていると思います。実はアプリ側の設計によりバックグラウンドではデータ収集を行わないようになっており、本体のスリープや他アプリの利用時はクラウドにデータが届きません。これはおそらく位置情報が取得されているためで、アプリ起動状態で他人の荷物に紛れ込ませるなどのストーカー行為ができないようにするのが目的だと思われます。IoTではデータ保護やプライバシー保護が非常に重要となりますが、こんな細かいところにも学びがありますね。

## なので、スマホのブラウザでは…

こういう設計なので、スマホのブラウザで可視化を行うことが事実上難しくなっています。ブラウザが表で動作しているときはデータ収集が止まってしまい、一方でブラウザ側はデータが来ない限り可視化がうまくできない設計になっているからです。もちろんこの設計には合理的な理由があるわけで、認証・認可やデータ保護の仕組みを実装しない限り安全かつ便利に使うことはできない、というIoTの限界を知る上でも勉強になるかと思います。

# この後は…

実はまだこのアプリ／サービスの中身についてはあまり情報がありません、というか、公式な情報がどこにあるのかわかっていません。唯一の情報源はアプリの「Learn More」タブですが、いまのところ有益な情報はありません。

[GitHub](https://github.com/aws-samples/aws-iot-sensors)にはプロジェクトのページがありますが、現状はJavascript経由でこのサービスにデータを送信するためのサンプルコードがあるだけです。

今後、いろいろな情報がでてくればIoTシステムの構築についてもいろいろ学べる教材になりそうですね。都度ご紹介できればと思います。

# 最後に

[JAWS-UG IoT専門支部](https://www.facebook.com/groups/jawsug.iot)ではいつでも仲間を歓迎しています。定期的に…とはいきませんが、時折開催されているイベントにぜひご参加ください。登壇／LTのご提案や運営参加もお待ちしております。

もしご興味があれば、AWS Community Builders Programへの参加も検討なさってはいかがでしょうか。常時募集されているわけではないので、[AWS公式サイト](https://aws.amazon.com/jp/developer/community/community-builders/)からウェイティングリストに登録しておくと良いでしょう。

それでは皆さまよい年末年始を！