SORACOM Developers

Getting Started

Beam の multi credentials per group 機能を利用して AWS IoT に接続する

はじめに

このドキュメントでは、SORACOM Beam(以下、Beam) の multi credentials per group 機能を使用して、同じSUMグループ内で認証情報を Subscriber 毎に使い分けて AWS IoT にデータを送信します。

当ガイドの前提は以下のとおりです。

AWS IoT とは

AWS IoT とは、デバイス(Thing)から安全にデータをクラウドに送信し、また送信されたデータに対してルールベースで各種 AWS サービスを連携させる事ができるプラットフォームです。

AWS IoT とは

(AWS IoT ドキュメント : How AWS IoT Works より)

モノ(Thing)からクラウドへのデータ送信の方法には2種類用意されています。

本ドキュメントでは、Beamを使用して、MQTTS でデータを送受信してみたいと思います。

Beam とは

Beam は Air SIM を使用したデバイスからのデータ・アップロード時にクラウド側でデータ処理を行うためのプロキシーサービスです。

Beam とは

本ドキュメントでは、MQTT -> MQTTS のプロトル変換(暗号化)機能を利用します。 CPUパワーがあまりなく、MQTT通信は行えるが、MQTTSでの通信を行うのが難しいようなデバイスの場合には、有用となるでしょう。

また通常クライアント証明書は各デバイスが利用できるようにデバイス上にコピーしておく必要がありますが、 Beamを使用することにより、デバイスの代わりに Beam がクライアント証明書を使用してTLS通信を行うため、証明書の管理が楽になります。

Beam の multi credentials per group 機能とは

Beam で認証情報を使用する場合に、 単一の認証情報ではなく、Air SIM 毎に認証情報を使い分けることができる機能です。

例えば、AWS IoT で複数のデバイスを用途に応じてデバイス毎にポリシーを使い分けたい場合に有用です。

AWS IoT では、用途に合わせて必要なポリシーを各デバイスで使うクライアント証明書に割り当てます。 Beam を使用することで各デバイスにクライアント証明書を配置する必要はありませんが、通常の Beam 設定では単一の認証情報を使用するため、デバイス毎にクライアント証明書を使い分けたい場合、それぞれのデバイス用にグループを作る必要がありました。

一方、Beam の multi credentials per group 機能を使用することにより、一つのグループの Beam 設定で、デバイスで使用する Air SIM 毎にクライアント証明書を使い分けることができます。

本ドキュメントでは2つのデバイスを Beam の multi credentials per group 機能を使用して、2つのデバイスで使用する Air SIM 毎にクライアント証明書を使い分けてみたいと思います。

また今回は AWS IoT で認証情報を使い分けますが、ソラコムプラットフォームに登録できる認証情報であればどのような形式でもmulti credentials per group 機能で対応可能です。

ステップ 1: AWS IoT を準備する

AWS IoT コンソールを開き AWS IoT の設定を開始します。

まずは、安全性 > ポリシー > 作成から、それぞれのデバイスに割り振るポリシーを作成します。 一つ目のポリシーはどのtopicにも Publish, Subscribeを可能なポリシーを作成します。 下記のように入力して作成をクリックします。

AWS IoT を準備する

二つ目のポリシーはどのtopicにも Subscribeでき、beamtest/* の topic にのみ Publish 可能なポリシーを作成します。 (設定内の * はワイルドカードを意味します)

アドバンスモードをクリックし、下記のポリシーをペーストして「作成」をクリックします。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iot:Connect",
        "iot:Subscribe"
      ],
      "Resource": [
        "*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "iot:Publish"
      ],
      "Resource": [
        "arn:aws:iot:ap-northeast-1:903921708000:topic/beamdemo/*"
      ]
    }
  ]
}

AWS IoT を準備する

次に管理 > モノ > 作成から、使用する2つのモノ(Thing)を作成します。

AWS IoT を準備する

「単一のモノを作成する」をクリックします。

AWS IoT を準備する

名前を入力します。ここでは、「raspi-IMSI」( IMSI は使用する SIM の IMSI 番号) という名前にして「次へ」をクリックします。

AWS IoT を準備する

「証明書の作成」をクリックします。

AWS IoT を準備する

下記の3つの証明書をダウンロードのリンクよりダウンロードします(後ほど使用します)。 ダウンロード後、「有効化」をクリックし証明書を有効化し、「ポリシーをアタッチ」をクリックします。

AWS IoT を準備する

先ほど作成したポリシーを選択し、モノの登録をクリックします。

後ほど使い分けられることを確認したいため、一つ目のモノにはPubSubToAnyTopicのポリシーを適用し、二つ目のモノにはPubToOnlyBeamdemoのポリシーを適用します。

AWS IoT を準備する

画面左下の「設定」をクリックし、エンドポイントをコピーします(後ほど使用します)。

AWS IoT を準備する

これで AWS IoT 側でモノの登録と証明書、ポリシーの用意ができました。 もう一つのデバイスも同様の手順で登録し、こちらも証明書をダウンロードします(ルート CA 証明書は共通となります)。

ステップ 2: Beam の multi credentials per group 機能を設定する

ソラコムユーザーコンソールにログインします。

グループを作成する

SIMを登録した際にグループを作成していない場合には、左上の[MENU]→[SIMグループ]を開き、+追加 から新規のグループを追加します。

グループ名は任意ですが、ここでは AWS-iot_multi_credentials_per_group とします。

グループで Beam を設定します。

作成したグループを選択し、グループ詳細画面から[SORACOM Beam 設定]タブを開き、[+]ボタンから「MQTTエントリポイント」を選択します。

Beam の multi credentials per group 機能を設定する

以下を入力します。

Beam の multi credentials per group 機能を設定する

入力後、登録をクリックします。

Beam の multi credentials per group 機能を設定する

認証情報登録後、もう一度認証情報を右の+を押し、先ほどダウンロードした二つ目のデバイスのプライベートキー、証明書を登録します。 その後、保存をクリックします。

作成されたグループのグループIDが画面上部に表示されますので、コピーします(後ほど使用します)。

次に、デバイス毎にBeamで使用する認証情報を使い分ける為にAPIで設定を追加します。

まず、API Referenceのページに移動します。

認証キー、もしくはSORACOM ユーザーコンソールのアカウントを入力し、認証を行います。

Beam の multi credentials per group 機能を設定する

Groupカテゴリ内の GET /groups/{groupid} の項目をクリックします。 groupidのテキストボックスに先ほど作成したグループのグループIDをペーストし、Try It Out!をクリックします。

得られた結果がResponse Bodyに表示されていますので、"SoracomBeam": {}のブランケット内の情報をコピーします。

Beam の multi credentials per group 機能を設定する

Beam設定をAPIで修正するために、コピーした情報をテキストエディタに貼り付け、下記のように加工します。

この時、$credentialsIdの imsi の文字列箇所を #{imsi} に置き換えてください。こちらのプレースホルダーを使用することにより IMSI 番号に応じた認証情報を使い分けることが可能となります。 今回は IMSI 番号を使用しますが、#{imei}と設定すれば IMEI 番号でも使い分けることができます。

"mqtt://beam.soracom.io:1883": {
  "enabled": true,
  "name": "awsiot_multi_credential_per_group",
  "addEquipmentHeader": false,
  "addSignature": false,
  "addSubscriberHeader": true,
  "customHeaders": {},
  "skipStatusCode": false,
  "useClientCert": true,
  "clientCerts": {
    "default": {
      "$credentialsId": "awsiot-xxxxxxxxxxxxxxx"
    }
  },
  "useGoogleIoT": false,
  "addDeviceIdHeader": false,
  "destination": "mqtts://xxxxxxxxxxxxxx.iot.ap-northeast-1.amazonaws.com:8883"
}
[
  {
    "key":"mqtt://beam.soracom.io:1883",
    "value":{
      "enabled": true,
      "name": "awsiot_multi_credential_per_group",
      "addEquipmentHeader": false,
      "addSignature": false,
      "addSubscriberHeader": true,
      "customHeaders": {},
      "skipStatusCode": false,
      "useClientCert": true,
      "clientCerts": {
        "default": {
          "$credentialsId": "awsiot-#{imsi}"
        }
      },
      "useGoogleIoT": false,
      "addDeviceIdHeader": false,
      "destination": "mqtts://xxxxxxxxxxxxxx.iot.ap-northeast-1.amazonaws.com:8883"
    }
  }
]

API ReferenceページのGroupカテゴリ内のPUT put /groups/{group_id}/configuration/{namespace} の項目をクリックします。

group_idのテキストボックスに先ほどのグループIDをペーストします。

namespaceは「SoracomBeam」を選択します。

parametersに先ほど加工した上記文字列を全てペーストします。

Try It Out!をクリックします。

Beam の multi credentials per group 機能を設定する

ステップ 3: Beam を使用して同じ SIM グループ内で認証情報を Subscriber 毎に使い分けて AWS IoT にデータを送信する

では、実際にデータを送信してみましょう。 ここでは2枚の Air SIM がデバイス①とデバイス②に挿入されている状況を想定して記載いたしますが、もしデバイスが1台しかない場合は、 SIM を差し替えることで動作をご確認いただくことも可能です。

デバイスの準備

当ガイドでは、MQTTクライアントとして Mosquitto-clients を利用する例を紹介します。

Raspbian であれば、下記コマンドでインストール可能です

sudo apt-get install mosquitto-clients

デバイス①からのデータ受信準備

AWS IoTのテストページで対象のtopicへサブスクリプションすることでデータ受信が確認できます。

下記のページの「トピックのサブスクリプション」に「beamdemo」と入力しトピックへのサブスクリプション をクリックします。

https://ap-northeast-1.console.aws.amazon.com/iot/home?region=ap-northeast-1#/test

Beam を使用して同じ SIM グループ内で認証情報を Subscriber 毎に使い分けて AWS IoT にデータを送信する

もし2台のデバイスが手元にあるようであれば、デバイス②で下記のコマンドでもMosquitto-clients でサブスクリプションできます。 ここで指定している ’#’ はワイルドカードを意味します。

$ mosquitto_sub -d -h beam.soracom.io -t 'beamdemo/#'

デバイス①からデータを送信

各 Air SIM のグループを先ほど作成したグループに所属させます。

Beam を使用して同じ SIM グループ内で認証情報を Subscriber 毎に使い分けて AWS IoT にデータを送信する

上記グループに所属する Air SIM で通信を行っているデバイス①から以下のようにコマンドを実行します。 Beamを使用していることによりデバイス側に証明書をストアする必要がなく、デバイスから Beam へはMQTTでメッセージを送信できます。 また、Beam ではプレースホルダーを利用した認証情報設定により、デバイス①で使用している SIM の imsi を元に適切な認証情報を使用してAWS IoTへ接続します。

$ mosquitto_pub -d -h beam.soracom.io -t beamdemo -m "Hello, World"
Received CONNACK
Sending PUBLISH (d0, q0, r0, m1, 'beamdemo', ... (12 bytes))

デバイス①からのデータ受信を確認

AWS IoTのテストページで対象のtopicにデータがパブリッシュされたことが確認できます。

Beam を使用して同じ SIM グループ内で認証情報を Subscriber 毎に使い分けて AWS IoT にデータを送信する

デバイス②のCLIで確認している場合、下記のようにパブリッシュされたメッセージが表示されます。 Beamの設定でIMSI付与オプションをONにしていますので、デバイス①がpublishしたtopicの末尾にBeamにより自動的に/が追加されます。

$ mosquitto_sub -d -h beam.soracom.io -t 'beamdemo/#'

Client mosqsub/XXXX-XXXXXXXXXX received PUBLISH (d0, q0, r0, m0, 'beamdemo/xxxxxXXXXXXXXXX', ... (12 bytes))
Hello, World

デバイス②から許可されたtopicにデータを送信

では、次にデバイス②データを送信してみましょう。 この時、Beam ではプレースホルダーを利用した認証情報設定により、デバイス②で使用している SIM の imsi を元に適切な認証情報を使用してAWS IoTへ接続します。

上記グループに所属する Air SIM で通信を行っているデバイス②から以下のようにコマンドを実行します。

$ mosquitto_pub -d -h beam.soracom.io -t beamdemo -m "Hello, World"
Received CONNACK
Sending PUBLISH (d0, q0, r0, m1, 'beamdemo', ... (12 bytes))

デバイス②からのデータ受信を確認

AWS IoTのテストページでデバイス①の際と同様に、対象のtopicにデータがパブリッシュされたことが確認できます。

デバイス①のCLIで確認している場合、下記のようにパブリッシュされたメッセージが表示されます。

$ mosquitto_sub -d -h beam.soracom.io -t 'beamdemo/#'

Client mosqsub/XXXX-XXXXXXXXXX received PUBLISH (d0, q0, r0, m0, 'beamdemo/xxxxxXXXXXXXXXX', ... (12 bytes))
Hello, World

デバイス②から許可されていないtopicにデータを送信

では、次にデバイス②データをAWS IoTのポリシーで許可されていないtopicに送信してみましょう。 デバイス②で使用される証明書に割り当てたポリシー PubToOnlyBeamdata では beamdemo/* のtopicのみ publish 許可していました。 そのため、下記コマンドにより beamdemo2/imsi番号 の topic に publish できるか試して見ます。

$ mosquitto_pub -d -h beam.soracom.io -t beamdemo2 -m "Hello, World"
Received CONNACK
Sending PUBLISH (d0, q0, r0, m1, 'beamdemo2', ... (12 bytes))

デバイス②からのデータが受信できないことを確認

AWS IoTのテストページで許可されていないtopicにはデータが表示されず、パブリッシュできないことが確認できます。

デバイス①のCLIで確認している場合でも、同様に許可されていないtopicにはメッセージが表示されません。

$ mosquitto_sub -d -h beam.soracom.io -t 'beamdemo2/#'

以上のように、multi credentials per group 機能を利用することで、単一のグループ設定で認証情報をデバイスに応じて使いわけることが可能です。また、AWS IoT の設定で、デバイス毎にポリシーを変えたい場合でも Beam を設定するグループを共通で使用できます。

Getting Started

SORACOM Air for セルラー

SORACOM Air for LoRaWAN

SORACOM Air for Sigfox

SORACOM Beam

SORACOM Canal/Direct/Door

SORACOM Endorse

SORACOM Funnel

SORACOM Gate

SORACOM Harvest

SORACOM Inventory

SORACOM Junction

SORACOM Krypton

SORACOM Lagoon

サービス機能詳細

Developer Tools

pagetop