Beam の MQTT エントリポイント の multi credentials per group 機能を利用して、同じ SIM グループ内で認証情報を IoT SIM ごとに使い分けて AWS IoT にデータを送信します。
AWS IoT とは
AWS IoT とは、デバイス (Thing) から安全にデータをクラウドに送信し、また送信されたデータに対してルールベースで各種 AWS サービスを連携させることができるプラットフォームです。
デバイス (Thing) からクラウドへのデータ送信の方法には 2 種類用意されています。
- MQTTS : X.509 証明書を使用した TLS (Transport Layer Security) のクライアント認証
- HTTPS : IAM ユーザーやロール・Cognito を利用した認証
Beam の multi credentials per group 機能とは
Beam で認証情報を使用する場合に、単一の認証情報ではなく、IoT SIM ごとに認証情報を使い分けることができる機能です。
たとえば、AWS IoT で複数のデバイスを用途に応じてデバイスごとにポリシーを使い分けたい場合に有用です。
AWS IoT では、用途に合わせて必要なポリシーを各デバイスで使うクライアント証明書に割り当てます。 Beam を使用することで各デバイスにクライアント証明書を配置する必要はありませんが、通常の Beam 設定では単一の認証情報を使用するため、デバイスごとにクライアント証明書を使い分けたい場合、それぞれのデバイス用にグループを作る必要がありました。
一方、Beam の multi credentials per group 機能を使用すると、一つのグループの Beam 設定で、デバイスで使用する IoT SIM ごとにクライアント証明書を使い分けることができます。
ここでは 2 つのデバイスを Beam の multi credentials per group 機能を使用して、2 つのデバイスで使用する IoT SIM ごとにクライアント証明書を使い分けます。
また今回は AWS IoT で認証情報を使い分けますが、SORACOM に登録できる認証情報であればどのような形式でも multi credentials per group 機能を利用できます。
multi credentials per group 機能は Beam の他に、Funk においても使用できます。その場合には、必要に応じて ステップ 2: SORACOM Beam の multi credentials per group 機能を設定する 以降を Funk に読み替えてください。
操作を始める前に準備が必要です (クリックして確認してください)
(1) 複数の IoT SIM をお持ちであること
(2) MQTT を使用できるデバイスを複数お持ちであること
Raspberry Pi + AK-020 / Wio LTE などは、MQTT を使用できます。
(3) AWS アカウントをお持ちであること
準備完了ステップ 1: AWS IoT を設定する
AWS IoT Core にモノ (Thing) を作成する
使用するデバイスをモノ (Thing) として、AWS IoT に作成します。操作手順について詳しくは、AWS IoT Core にモノ (Thing) を作成する を参照してください。
具体的には以下のように設定します。
1 つ目のモノ:
項目 | 説明 | ||||||
---|---|---|---|---|---|---|---|
任意の文字列を入力します。2 つのモノを区別するために、1 つ目のモノが利用する IoT SIM の IMSI を含めると良いでしょう。これ以降、この IMSI を ${imsi1} と表記します。例: raspi-${imsi1} | |||||||
|
2 つ目のモノ:
項目 | 説明 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
任意の文字列を入力します。2 つのモノを区別するために、2 つ目のモノが利用する IoT SIM の IMSI を含めると良いでしょう。これ以降、この IMSI を ${imsi2} と表記します。例: raspi-${imsi2} | |||||||||||||
|
AWS IoT Core のデフォルトのデータエンドポイントを確認する
AWS IoT Core へデータを送信するためのデフォルトのデータエンドポイントを確認します。詳しくは、AWS IoT Core のデフォルトのデータエンドポイントを確認する を参照してください。
このエンドポイントをこれ以降、${default_endpoint} と表記します。例: xxxxxxxxxxxxxx-ats.iot.ap-northeast-1.amazonaws.com
ステップ 2: Beam の multi credentials per group 機能を設定する
認証情報ストアに X.509 証明書を登録する
Beam から AWS IoT に登録したモノを利用するために、モノ (Thing) を作成する で作成した証明書を、SORACOM ユーザーコンソールに登録します。
具体的には、認証情報ストアの「認証情報を登録」画面で以下のように登録します。この画面の表示方法については、認証情報を登録する を参照してください。
1 つ目のモノ:
項目 | 説明 |
---|---|
認証情報を識別するために任意の名前を入力します。なお、multi credentials per group 機能を利用するために、1 つ目のモノが利用する IoT SIM の IMSI を含める必要があります。例: awsiot-${imsi1} | |
「X.509 証明書」を選択します。 | |
1 つ目のモノのプライベートキーファイル (例: xxx...xxx-private.pem.key ) の内容を貼り付けます。(*1) | |
1 つ目のモノのデバイス証明書 (例: xxx...xxx-certificate.pem.crt ) の内容を貼り付けます。(*1) | |
ルート CA 証明書の Amazon ルート CA 1 (例: AmazonRootCA1.pem ) の内容を貼り付けます。(*1) |
- (*1) ファイル名ではなく、テキストエディタなどで ファイルの内容をコピーし 貼り付けてください。
2 つ目のモノ:
項目 | 説明 |
---|---|
認証情報を識別するために任意の名前を入力します。なお、multi credentials per group 機能を利用するために、2 つ目のモノが利用する IoT SIM の IMSI を含める必要があります。例: awsiot-${imsi2} | |
「X.509 証明書」を選択します。 | |
2 つ目のモノのプライベートキーファイル (例: xxx...xxx-private.pem.key ) の内容を貼り付けます。(*1) | |
2 つ目のモノのデバイス証明書 (例: xxx...xxx-certificate.pem.crt ) の内容を貼り付けます。(*1) | |
ルート CA 証明書の Amazon ルート CA 1 (例: AmazonRootCA1.pem ) の内容を貼り付けます。(*1) |
- (*1) ファイル名ではなく、テキストエディタなどで ファイルの内容をコピーし 貼り付けてください。
SORACOM Beam を有効化する
Beam の設定はグループに対して行います
ここでは、グループの設定を変更する操作のみを説明します。グループの仕組みやグループを作成する操作について詳しくは、グループ設定 を参照してください。
SIM グループ画面で
をクリックします。SIM グループ画面を表示する操作について詳しくは、グループの設定を変更する を参照してください。
→ の順にクリックします。
以下の項目を設定します。
項目 説明 任意の文字列を入力します。わかりやすい名前を設定します。例: MQTT → 「Standard」を選択します。 → 「MQTTS」を選択します。 → ${default_endpoint} を入力します。例: xxxxxxxxxxxxxx-ats.iot.ap-northeast-1.amazonaws.com
→ 「8883」を入力します。 スイッチをクリックして、オンにします。 multi credentials per group 機能を利用するために、認証情報ストアに X.509 証明書を登録する で登録した X.509 証明書の の IMSI 部分 (${IMSI1} や ${IMSI2}) を #{imsi} に置き換えた文字列を入力します。例: awsiot-#{imsi} → オンに設定します。オンにすると、publish した際の topic 名の末尾に、IMSI が自動的に追加されます。 #{imsi} のかわりに #{imei} も使用できます
今回はプレースホルダーとして IMSI (#{imsi}) を使用しますが、IMEI (#{imei}) を使用することもできます。
デフォルト証明書を利用できます
にプレースホルダー (#{imsi} や #{imei}) を利用した場合、対応する証明書が存在しなかった際はプレースホルダー部分を default に置換した証明書が利用されます (例: awsiot-default)。これをデフォルト証明書と呼びます。
デフォルト証明書を登録しておくと、対応する IMSI または IMEI の証明書を登録しない場合でも通信できます。ただし、AWS IoT 側ではモノを区別することはできません。
をクリックします。
IoT SIM の Beam の設定が完了しました。
SORACOM CLI / SORACOM API の場合
SORACOM CLI または SORACOM API を利用しても、multi credentials per group 機能を使用できます。詳しくは、MQTT エントリポイントを設定する の SORACOM CLI / SORACOM API の場合 を参照してください。なお、multi credentials per group 機能を利用する場合は、clientCerts.default.$credentialsId
に awsiot-#{imsi}
のように、#{imsi}
や #{imei}
を含む文字列を指定します。
ステップ 3: Beam を使用して同じ SIM グループ内で認証情報を IoT SIM ごとに使い分けて AWS IoT にデータを送信する
では、実際にデータを送信してみましょう。 ここでは 2 枚の IoT SIM がデバイス ① とデバイス ② に挿入されている状況を想定しています。もしデバイスが 1 台しかない場合は、IoT SIM を差し替えることでも動作を確認できます。
MQTT クライアントを準備する (デバイスの操作)
ここでは、MQTT クライアントとして mosquitto-clients を利用します。
mosquitto-clients のインストール
mosquitto-clients は、サイト からダウンロードおよびインストールしてください。
なお、Raspberry Pi の場合は、以下のコマンドでインストールできます。
$ sudo apt install mosquitto-clients
デバイス ① からのデータ受信準備
AWS IoT のテストページで対象の topic へサブスクリプションすることでデータ受信が確認できます。
下記のページの「トピックのサブスクリプション」に「beamdemo」と入力しトピックへのサブスクリプション をクリックします。
https://ap-northeast-1.console.aws.amazon.com/iot/home?region=ap-northeast-1#/test
もし 2 台のデバイスが手元にあるようであれば、デバイス ② で下記のコマンドでも mosquitto-clients でサブスクリプションできます。 ここで指定している '#' はワイルドカードを意味します。
$ mosquitto_sub -d -h beam.soracom.io -t 'beamdemo/#'
デバイス ① からデータを送信
各 IoT SIM のグループを先ほど作成したグループに所属させます。
上記グループに所属する IoT SIM で通信を行っているデバイス ① から以下のようにコマンドを実行します。 Beam を使用していることによりデバイス側に証明書をストアする必要がなく、デバイスから Beam へは MQTT でメッセージを送信できます。 また、Beam ではプレースホルダーを利用した認証情報設定により、デバイス ① で使用している IoT 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 にデータがパブリッシュされたことが確認できます。
デバイス ② の CLI で確認している場合、下記のようにパブリッシュされたメッセージが表示されます。 Beam の設定で IMSI 付与オプションを ON にしていますので、デバイス ① が publish した topic の末尾に Beam により自動的に/<IMSI>が追加されます。
$ 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 ではプレースホルダーを利用した認証情報設定により、デバイス ② で使用している IoT SIM の IMSI を元に適切な認証情報を使用して AWS IoT へ接続します。
上記グループに所属する IoT 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 を設定するグループを共通で使用できます。