Raspberry Pi を SORACOM Beam から AWS IoT に接続する

 前回の記事で Raspberry Pi を AWS SDK を使って AWS IoT に接続してみましたが、今回は SORACOM Beam 経由で AWS IoT に接続してみたいと思います。

soracom.jp

 SORACOM Beam はデバイスからの接続先の設定やプロトコル変換処理をオフロードできるサービスで、例えばデバイスの中に認証情報を置いておかなくても、Beam から接続先にアクセスする際に認証用の情報を追加することができるので、セキュリティの面でも有効なサービスです。

 今回は下記のガイドを参考に Raspberry Pi から MQTT で AWS IoT に接続し、Amazon SNS からメールを送信する処理を実行してみたいと思います。

dev.soracom.io

AWS側の設定

 AWS IoT のモノの登録については、前回登録したものをそのまま使います。

 また、AWS IoT のルール作成時にIAMのロールの作成・参照権限が必要になりますので、今回はとりあえずIAMFullAccessポリシーをアタッチしてフル権限を付与しておきます。

f:id:akanuma-hiroaki:20170706091200p:plain

 そしてメール通知を行うためのSNSトピックを作成しておきます。サブスクリプション作成時の Protocol は Email を指定し、メールアドレスを登録しておきます。

f:id:akanuma-hiroaki:20170708104430p:plain

 ここではSNSのトピックとサブスクリプションの作成方法の詳細は割愛しますが、下記AWSドキュメントに記載されています。 

AWS IoT ルールの作成

 デバイスから送信された内容をハンドリングするためのルールを作成します。AWS IoTコンソールの左側のメニューから、 ルール をクリックします。

f:id:akanuma-hiroaki:20170706091933p:plain

 まだルールが作成されていない場合は下記のような画面が表示されますので、 ルールを作成する をクリックします。

f:id:akanuma-hiroaki:20170706092045p:plain

 ルールの作成フォームが表示されますので、「名前」と「説明」に自分がわかりやすい内容を設定します。

f:id:akanuma-hiroaki:20170706092330p:plain

 画面下部の「メッセージのリソース」の各項目で今回対象とするデータの条件を設定します。

 SQLバージョンはデフォルトのままです。また、今回はひとまず全データを対象とするので、属性には「*」を、トピックフィルターには「#」を設定します。条件はブランクのままにします。

 そしてデータが送信された時の処理を設定するために、 アクションの追加 をクリックします。

f:id:akanuma-hiroaki:20170707005055p:plain

 アクションの選択画面が表示されますので、今回は SNSプッシュ通知としてメッセージを送信する`` を選択し、画面下部のアクションの設定``` ボタンをクイックします。

f:id:akanuma-hiroaki:20170707005647p:plain

 アクションの設定画面では、SNSターゲットとしてあらかじめ作成しておいたSNSトピックを選択し、メッセージ形式はRAW形式を選択します。

 そして、SNSリソースにAWS IoTへのアクセス権限を付与するためのロールを作成するため、 新しいロールの作成 をクリックします。

f:id:akanuma-hiroaki:20170707055500p:plain

 ロール名の入力フォームが表示されますので、任意のロール名を入力して 新しいロールの作成 をクリックします。

f:id:akanuma-hiroaki:20170707060041p:plain

 作成したロールが選択できるようになりますので、選択して アクションの追加 をクリックします。

f:id:akanuma-hiroaki:20170707060413p:plain

 下記のようにルールにアクションが追加されたことが確認できます。

f:id:akanuma-hiroaki:20170707060645p:plain

SORACOM Beam の設定

 まずは SORACOM Beam からのアクセス先となる、 AWS IoT 側のカスタムエンドポイントを確認しておきます。カスタムエンドポイントは AWS IoT を使用する各AWSアカウントごとに割り当てられるエンドポイントです。

 AWS IoT コンソールの左下の 設定 をクリックします。

f:id:akanuma-hiroaki:20170707075144p:plain

 するとカスタムエンドポイントが確認できます。

f:id:akanuma-hiroaki:20170707075152p:plain

 次に SORACOM Beam の設定を行います。

 SORACOM Consoleのメニューから Cellular -> Groups を選択し、対象のAir Sim が属するグループを選択したら、Basic settingsタブの SORACOM Beam をクリックして展開し、 から MQTT entry point を選択します。

f:id:akanuma-hiroaki:20170707073555p:plain

 入力フォームが表示されますので、 Configuration name には後で自分がわかりやすい任意の名前を設定します。

 Protocol は MQTTS、Host name には先ほど確認した AWS IoT のカスタムエンドポイント、Port number には 8883 を設定します。また、AWS IoT の認証に証明書を使うので、 Client cert を ON にします。そして、証明書を登録するために + をクリックします。

f:id:akanuma-hiroaki:20170707074014p:plain

 登録には秘密鍵、証明書、ルート証明書が必要になります。このうち秘密鍵、証明書は前回ダウンロードした connect_device_package.zip に含まれる下記ファイルを使います。

  • 秘密鍵:raspberry_pi.private.key

  • 証明書:raspberry_pi.cert.pem

 また、ルート証明書はSymantec社のサイトからダウンロードできます

https://www.symantec.com/content/en/us/enterprise/verisign/roots/VeriSign-Class%203-Public-Primary-Certification-Authority-G5.pem

 これらの内容ををそれぞれ Key、Cert、CA のフォームに入力します。Typeはデフォルトで X.509 certificate が選択されているのでそのままにしておきます。Credentials set ID と Description はわかりやすい内容を任意で登録します。入力が終わったら Register をクリックします。

f:id:akanuma-hiroaki:20170707074356p:plain

 するとプルダウンで先ほど登録した Credentials Set が選択できるようになっているので選択し、 Save をクリックします。

f:id:akanuma-hiroaki:20170707074530p:plain

 SORACOM Beam の設定が追加されたことが確認できます。

f:id:akanuma-hiroaki:20170707074758p:plain

Raspberry Pi から接続してみる

 ここまでで設定は完了なので、 Raspberry Pi から接続してみます。今回は MQTT Broker のオープンソース実装である Mosquitto を使用しますので、下記コマンドでインストールします。

pi@raspberrypi:~ $ sudo apt-get install mosquitto mosquitto-clients

 そして SORACOM Air で接続した上で、下記コマンドを実行してデータを送信します。

pi@raspberrypi:~ $ mosquitto_pub -d -h beam.soracom.io -t beamdemo -m "Hello, World from AWS IoT!"
Client mosqpub/1224-raspberryp sending CONNECT
Client mosqpub/1224-raspberryp received CONNACK
Client mosqpub/1224-raspberryp sending PUBLISH (d0, q0, r0, m1, 'beamdemo', ... (26 bytes))
Client mosqpub/1224-raspberryp sending DISCONNECT

 すると下記のようにメールが送信されます。

f:id:akanuma-hiroaki:20170707082336p:plain

 ひとまずこれで Raspberry Pi から SORACOM Beam を経由して AWS IoT に送信されたデータがルールによって処理され Amazon SNS へ送信され、メールが送られたことが確認できました。Raspberry Pi からの送信時は特に証明書等は指定せず、 SORACOM Beam に登録した証明書が使われていますので、 Raspberry Pi に証明書を置く必要なく処理が行えるようになっています。

 デバイスからの送信だけであれば SORACOM Funnel でも良いかもしれませんが、サーバからデバイスへの送信も行いたい場合は SORACOM Beam を使う必要があります。今回はデバイスからの送信だけでしたが、デバイスへの送信も試してみたいと思います。

 また、先日の SORACOM Conference 2017 で SORACOM Inventory が発表されました。

新サービス: SORACOM Inventory を発表 - SORACOM Blog

 まだ Limited Preview ということで実際には使えていませんが、用途としては AWS IoT に近いものだと思いますので、 SORACOM Air を使うデバイスであれば、 SORACOM Inventory だけでも良いのかもしれません。とりあえず Limited Preview の利用申請はしてみたので、使えるようになったら試してみたいと思います。