AWS入門ブログリレー2024〜AWS IoT Core編〜

2024.04.30

はじめに

こんばんは大阪オフィスのよなです 当エントリは弊社AWS事業本部による『AWS 入門ブログリレー 2024』の34日目のエントリです。

このブログリレーの企画は、普段 AWS サービスについて最新のネタ・深い/細かいテーマを主に書き連ねてきたメンバーの手によって、 今一度初心に返って、基本的な部分を見つめ直してみよう、解説してみようというコンセプトが含まれています。
AWS をこれから学ぼう!という方にとっては文字通りの入門記事として、またすでに AWS を活用されている方にとっても AWS サービスの再発見や 2024 年のサービスアップデートのキャッチアップの場となればと考えておりますので、ぜひ最後までお付合い頂ければ幸いです。

では、さっそくいってみましょう。今回のテーマは『AWS IoT Core』です。

この記事で伝えたいこと

私の個人的な感想ですが、IoT Coreはサポートしている機能が多く、独特な用語も出てくるのでとっつきづらい印象があります。
また、IoTサービスということで普段からAWSを利用している方でもIoT Coreは触ったことがないという方も多いように思います。

そこで、今回はIoT Coreを広く知ってもらえるように用語の解説を中心に、私たちの身の回りのどのようなところでIoT Coreが使われているのか考えてみたいと思います。
また、機能に関してもよく使われる機能に絞って紹介していきたいと思います!

IoTとは?

まずはIoT Coreの「IoT」の部分からです。
IoTという言葉は最近私たちの身の回りでもよく聞くようになったんじゃないでしょうか。
IoT(Internet of Things)はインターネットとモノを繋ぐ技術です。

私たちの身の回りにもIoTを使ったシステムがたくさんあります。
最近は照明のON/OFFや鍵の開錠/施錠、温度のモニタリングなど、様々なモノをインターネット経由で操作できるようになりました。

こういったモノ(IoTデバイス)の制御やデータ転送にはどのような技術が使われているのでしょうか?
ここでIoT Coreの登場です。

IoT Coreとは?

もう少し解像度を上げましょう。
デバイスとインターネットを繋げるにはどのような仕組みが必要でしょうか?
デバイスのデータを受信するサーバー、デバイス増加に伴うスケーリング、プロトコルのサポート、認証認可、通信の暗号、などなど
IoTデバイスからデータを受け取るための仕組みがたくさん必要です。

IoT Coreはこれらの機能をマネージドで提供してれるAWSサービスです。
IoT Coreを使うことで証明書の発行やデバイスの登録など、IoTシステム構築に必要な機能を簡単に実装することができます。

ここまででなんとなくIoT Coreの立ち位置が見えてきたでしょうか?
次はIoT CoreがIoTシステム全体の中で何をしているのか理解するため、用語の解説をまじえて紹介していきたいと思います。

よく出てくる用語

それではIoT Coreを理解する上で、よく出てくる用語を押さえておきましょう。
短なものを例としてスマートホーム家電をIoTデバイスとして考えてみます。

メッセージ

IoT Coreを通してやりとりするデータのことをメッセージといいます。
これはデータと表現することもあるのでIoT Coreの文脈でメッセージと書かれていたら、データのことね。と思って下さい。

パブリッシュ

ここではアプリで温度や湿度をモニタリングするスマート温度計で考えてみましょう。
スマート温度計ではデバイスからIoT Core経由でアプリにメッセージを飛ばします。
この時、IoT Coreにメッセージを送信することをパブリッシュといいます。

トピック

IoTデバイスはメッセージをIoT Coreにパブリッシュします。
パブリッシュの際、IoT Core内のどこにメッセージを送信するか宛先を指定します。
この「宛先」の部分をトピックといいます。

言葉だと少し分かりずらいので、イメージはこんな感じです。

メッセージをパブリッシュする先のラベルのようなイメージです。

またトピックは階層構造で設定できます。
thermometer/livingroomのようにトピックに設定することで、リビングの温度計のメッセージがパブリッシュされるトピックということが分かります。

上の図では各部屋と部屋ごとのスマート温度計を階層構造で表現しています。

トピックにはワイルドカードを使用することもできるので、thermometer/#thermometer/+/1という書き方もできます。
#はその階層配下のすべて(家全体の温度計)
+はその階層すべて(各部屋の1番の温度計)
という意味です。
こちらも少し分かりづらいかもしれないので図にしてみました。

サブスクライブ

トピックのメッセージを受け取ることをサブスクライブといいます。
IoT Coreは自身でトピックのメッセージをサブスクライブするので、図にするとこんな感じになります。

後続のサービスへメッセージを転送するためにメッセージを取り出すようなイメージです。
メッセージ転送については後ほど出てくるIoTルールによりルーティングを行います。

ブローカー

IoT Coreはパブリッシュされたメッセージを受け取り、後続のサービスへ配信するためサブスクライブします。
このようにメッセージのパブリッシュやサブスクライブに関する仲介役として動作するサーバーをブローカーと言います。

IoT Coreはブローカーの動きに加え、後ほど紹介するIoTルールやジョブなどIoTシステムを構成する上であると便利な機能を備えたサービスになります。
余談ですがIoT Core以外にもOSSのブローカーも存在します。

MQTT

MQTTはIoTのシステムでよく用いられるシンプルかつ軽量なプロトコルです。
簡単に言うと、IoTデバイスとの通信を効率よく行おう!!というプロトコルです。

上記で説明したパブリッシュ、ブローカー、サブスクライブの仕組みを使って非同期でメッセージをやり取りするのでPub/Sub(パブリッシュ/サブスクライブ)型と呼ばれます。
以前、MQTTについて解説した記事を書きましたので、こちらも参考にしてみてください。

IoT Coreの特徴

ここまででIoT Coreとその周辺の動きが把握できたかと思います。
ここからはIoT Coreの特徴を紹介します。

通信プロトコル

IoT Coreは複数のプロトコルをサポートしており、

  • MQTT
  • HTTPS
  • MQTT over WebSocket Secure

に対応しています。
各プロトコルの認証方法やポート情報、サポートされているオペレーションの詳細についてはドキュメントをご参照下さい。

デバイス側でプロトコルが指定されている場合はそれに合うプロトコルを選択しましょう。
そのほかプロトコル選定の際はドキュメントの比較表に見やすくまとめられているのでこちらを参考にして下さい。

セキュリティ

認証
IoTデバイスとIoT CoreはTLSを用いた安全な相互認証で通信が行われます。
この際、IoTデバイスはIoT Coreに接続するのに自身の身元を証明する必要があります。
認証には

がサポートされています。
X.509の証明書はIoT Coreのコンソール画面から数クリックで作成できるので、作成された証明書をIoTデバイスに持たせるだけで簡単に認証機能が実装できます。

ポリシー
IoTデバイスとIoT CoreはTLSを用いた安全な相互認証で通信が行われます。
また、デバイスからIoT Coreに接続する際は操作可能な範囲を制限する必要があります。
操作範囲の制限にはIoTポリシーを使用します。
以下は特定のトピックとデバイス間でパブリッシュ、サブスクライブを許可するIoTポリシーの例です。

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"iot:Connect"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Publish"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/some_specific_topic"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Subscribe"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topicfilter/some_specific_topic"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"iot:Receive"
			],
			"Resource": [
				"arn:aws:iot:us-east-1:123456789012:topic/some_specific_topic"
			]
		}
	]
}

どうでしょうか?AWSを普段から触っている方であれば馴染みある書き方ではないでしょうか。
IoTポリシーも他のIAMポリシーと同じ書き方なので抵抗なく設定できると思います。

IoT Coreでは作成したポリシーを証明書にアタッチできます。
こうすることでデバイス側の設定を変更することなく、IoT Core側で権限を変更することができます。

代表的な機能

デバイス管理

IoT Coreでは簡単にデバイスの接続、登録、管理ができます。
また、デバイスを種類や機能毎にグループ単位で管理することもできます。

デバイスの接続はIoT Coreのコンソールで証明書の発行から通信テストまで一連の手順に沿って実施できます。
とりあえずIoT Coreに入門したい、ということであればぜひデバイスの接続をやってみることをオススメします。
私もIoT Coreに入門した際、デバイスの接続から通信テストまでをやってみることで一連のイメージが掴めました。

以前やってみた記事も書いているので参考にしてみて下さい。

登録されたデバイス情報はコンソール画面から一覧で確認できます。
下の画像はサンプルとして作成したデバイスです。
画面下側にデバイスに紐づく情報が表示されます。
アタッチされた証明書やグループ、デバイスシャドウの情報を確認することができます。

IoTルール

IoTルールは指定したルールに従いメッセージを後続のサービスへルーティングする機能です。
IoTルールでは

  • メッセージを抽出、加工するためのSQLクエリ(正確にはSQLクエリ風)
  • 転送する後続のサービス

を設定します。

この説明だけだと分かりづらいと思うので
またまた例としてスマート温度計を使って考えてみましょう。

リビングに設置した温度計が30℃を超えた場合にSNS経由で通知してみたいと思います。
この場合、thermometer/livingroomトピックにtemperature: 30以上のメッセージが入った場合SNSトピックへルーティングするルールを設定します。

まずはクエリでメッセージをフィルタリングします。

SELECT * FROM 'thermometer/livingroom' WHERE temperature > 30

上記のクエリに引っかかったデータをSNSトピックへルーティングするように設定します。

実際の画面ではこのような設定になります。

ルーティング先はSNS以外にもAWSのデータベース系サービスや配信系サービス、HTTPSのエンドポイントなど様々な送信先を選択できます。

デバイスシャドウ

デバイスシャドウはデバイスの状態を管理する機能です。
デバイスが最後にIoT Coreに接続した際の状態を記録しておくことで、デバイスがオフラインでも状態を把握することができます。

文字だけだとイメージしづらいですね。
例えば、アプリで操作するスマート照明で考えてみましょう。
スマート照明はアプリからON/OFFを切り替えられるIoTデバイスです。

まずはスマート照明がOFFの状態です。
この時、デバイスシャドウではスマート照明もアプリも状態はOFFになっています。

次に、アプリでスマート照明をONに設定します。
するとデバイスシャドウはアプリの状態がONになったことを検知してスマート照明をONに切り替える動作をします。
スマート照明がオンラインの場合は即時で状態をONに切り替えます。
スマート照明がオフラインの場合は次にスマート照明がIoT Coreに接続した際にONになるよう動作します。

スマート照明がオンラインになったタイミングでアプリの設定がスマート照明にも反映されて状態がONに切り替わります。
また、デバイスシャドウのスマート照明の状態もONに書き換えられます。

このようにIoTデバイスがオフライでも状態を監視、変更できる機能がデバイスシャドウです。

ジョブ

ジョブはIoT Coreからデバイスに向けてファームウェアの更新やアプリケーションのダウンロード、インストールを実行できる機能です。
ジョブを実行するにはジョブドキュメントが必要です。
このジョブドキュメントに従いデバイスで操作が実行されます。

ジョブドキュメントはAWSが用意したテンプレートを使用することもできますが、
自身で作成したファイルをS3に配置して使用することもできます。

また、ジョブは登録されたデバイスグループに対しても実行できるので、複数のデバイスをまとめてファームウェアの更新をしたい場合にも便利です。

これから入門するあなたへ

今回は入門記事ということで、私が入門した際に疑問に思っていたこと、躓いたことを書いてみます。

どうやってIoT Coreに接続するの?

入門時、私はどうやってデバイスからIoT Coreに対してデータを送信するのだろう?と思っていました。
接続方法はいろいろあります

  • AWS SDK
  • AWS IoT Device SDK
  • AWS IoT Device Client
  • AWS CLI

など、そのほかプレビュー中の接続ツールなどは以下のドキュメントに記載されています。

私がよく使うのはAWS IoT Device SDKです。
導入も簡単で普段使用している言語にも対応しているので使っています。

接続にはソースコードに証明書、秘密鍵、ルート証明書、IoT Coreのエンドポイントを指定する必要がありますが、IoT Coreで作成したものをダウンロードしてパスを指定するだけなのでとっても簡単です。
またAWS IoT Device SDKを使ったチュートリアルもあります。

私の推しポイント

それでは最後に私のIoT Core推しポイントを紹介します!
記事の途中でも書きましたがIoT Coreはデバイスの登録、接続がとても簡単という点です。

最初の「やってみる」の部分の壁が低いということは素晴らしいことです。
この記事を読んでいる方の中にはRaspberry Piのようなマイコンを触ったことがある or 持っている方もいるんじゃないでしょうか?
そんな方はぜひ一度IoT Coreと接続してみて下さい。

実際に手元のデバイスからIoT Coreにデータが登録されると嬉しくなるはずです!
そこからはあなたの無限のアイデアで身の回りの「面倒な何か」をIoTで解決してみて下さい。
そんな中から私たちの生活を大きく楽にするモノが誕生することを願っています。

まとめ

今回は AWS IoT Core の概要についてまとめてみました。
IoT Coreは普段馴染みのない方も多いと思いますが、私たちの生活の中でも実は裏側でIoT Coreが使われている。なんてこともあると思います。
最近ではたまごっちのファームウェア配信にIoT Coreが使用されたという事例もあります。

どうでしょう?親近感が湧いてきませんか?

この記事が少しでもIoT Coreを知ってもらうきっかけになれば幸いです!

以上、『AWS 入門ブログリレー 2024』の34日目のエントリ『AWS IoT Core』編でした。

次回、2024/05/01 は弊社 市田 による「AWS IoT Core Greengrass V2編」の予定です!