Beam の multi credentials per group 機能を使用して、同じ SIM グループ内で認証情報を IoT SIM ごとに使い分けて AWS IoT にデータを送信します。
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 アカウントをお持ちであること
準備完了AWS IoT とは
AWS IoT とは、デバイス (Thing) から安全にデータをクラウドに送信し、また送信されたデータに対してルールベースで各種 AWS サービスを連携させることができるプラットフォームです。
(AWS IoT ドキュメント : How AWS IoT works より)
デバイス (Thing) からクラウドへのデータ送信の方法には 2 種類用意されています。
- MQTTS : X.509 証明書を使用した TLS (Transport Layer Security) のクライアント認証
- HTTPS : IAM ユーザーやロール・Cognito を利用した認証
本ドキュメントでは、Beam を使用して、MQTTS でデータを送受信します。
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 で認証情報を使い分けますが、ソラコムプラットフォームに登録できる認証情報であればどのような形式でも multi credentials per group 機能で対応可能です。
ステップ 1: AWS IoT を準備する
AWS IoT コンソール を開き AWS IoT の設定を開始します。
まずは、安全性 > ポリシー > 作成から、それぞれのデバイスに割り振るポリシーを作成します。 一つ目のポリシーはどの topic にも Publish, Subscribe を可能なポリシーを作成します。 下記のように入力して作成をクリックします。
- 名前 : PubSubToAnyTopic
- アクション :
iot:*
- リソース ARN :
*
- 効果 : 許可をチェック
二つ目のポリシーはどの topic にも Subscribe でき、beamdemo/*
の topic にのみ Publish 可能なポリシーを作成します。
(設定内の *
はワイルドカードを意味します)
- 名前 :
PubToOnlyBeamdemo
アドバンスモードをクリックし、下記のポリシーをペーストして「作成」をクリックします。
{
"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/*"]
}
]
}
次に管理 > モノ > 作成から、使用する 2 つのモノ (Thing) を作成します。
「単一のモノを作成する」をクリックします。
名前を入力します。ここでは、「raspi-IMSI」(IMSI は使用する IoT SIM の IMSI) という名前にして「次へ」をクリックします。
「証明書の作成」をクリックします。
下記の 3 つの証明書をダウンロードのリンクよりダウンロードします (後ほど使用します)。 ダウンロード後、「有効化」をクリックし証明書を有効化し、「ポリシーをアタッチ」をクリックします。
- このモノの証明書
- プライベートキー
- AWS IoT のルート CA (有効化ボタンの上に表示されています)
先ほど作成したポリシーを選択し、モノの登録をクリックします。
後ほど使い分けられることを確認したいため、一つ目のモノには PubSubToAnyTopic のポリシーを適用し、二つ目のモノには PubToOnlyBeamdemo のポリシーを適用します。
画面左下の「設定」をクリックし、エンドポイントをコピーします (後ほど使用します)。
これで AWS IoT 側でモノの登録と証明書、ポリシーの用意ができました。 もう一つのデバイスも同様の手順で登録し、こちらも証明書をダウンロードします (ルート CA 証明書は共通となります)。
ステップ 2: Beam の multi credentials per group 機能を設定する
Beam の設定はグループに対して行います
ここでは、グループの設定を変更する操作のみを説明します。グループの仕組みやグループを作成する操作について詳しくは、グループ設定 を参照してください。
SIM グループ画面で
をクリックします。SIM グループ画面を表示する操作について詳しくは、グループの設定を変更する を参照してください。
→ の順にクリックします。
以下の項目を設定します。
項目 説明 任意の文字列を入力します。わかりやすい名前を設定します。 → 「Standard」を選択します。 → 「MQTTS」を選択します。 → 先ほどコピーした AWS IoT のエンドポイントを入力します。 → 8883
を入力します。→ オンに設定します。オンにすると、publish した際の topic 名の末尾に、IMSI が自動的に追加されます。 認証情報を右の+を押し、以下を入力します。
- 認証情報 ID: awsiot-xxxxxxxxxxxxxxx (使用する IoT SIM の IMSI)
- 秘密鍵 (key) にダウンロードしておいたプライベートキーの内容をペースト
- 証明書 (cert) にダウンロードしておいた証明書の内容をペースト
- CA 証明書にダウンロードしておいたルート証明書の内容をペースト
入力後、登録をクリックします。
認証情報登録後、もう一度認証情報を右の+を押し、先ほどダウンロードした二つ目のデバイスのプライベートキー、証明書を登録します。
をクリックします。
IoT SIM の Beam の設定が完了しました。
ここから先はユーザーコンソールから設定を行う場合と、API から行う場合に別れます。
認証情報 ID 欄に、先ほど登録した認証情報 ID を IMSI 部分を #{imsi}
とし、登録します。
(この例の場合、awsiot-#{imsi}
)
こちらのプレースホルダーを使用することにより IMSI に応じた認証情報を使い分けることが可能となります。
また、今回は IMSI を使用しますが #{imei}
と設定すれば IMEI でも使い分けることができます。
デフォルト証明書
プレースホルダーを利用した認証情報を設定した場合、対応する証明書が存在しなかった際には Beam はプレースホルダー部分を default という文字列に置換し、証明書の取得を試みます。(例の場合、awsiot-#{imsi}
→ awsiot-default
)
デフォルト証明書を登録しておくことで、対応する IMSI の証明書の登録を忘れてしまった...という場合にもデフォルト証明書を利用して通信できます。
作成されたグループのグループ ID が画面上部に表示されますので、コピーします (後ほど使用します)。
次に、デバイスごとに Beam で使用する認証情報を使い分ける為に API で設定を追加します。
まず、API Reference のページに移動します。
認証キー、もしくは SORACOM ユーザーコンソールのアカウントを入力し、認証を行います。
Group カテゴリ内の GET /groups/{group_id} の項目をクリックします。 group_id のテキストボックスに先ほど作成したグループのグループ ID をペーストし、Try It Out!をクリックします。
得られた結果が Response Body に表示されていますので、"SoracomBeam": {}のブランケット内の情報をコピーします。
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!をクリックします。
ステップ 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 を設定するグループを共通で使用できます。