Soracom

Users

ドキュメント

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

はじめに 

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

Multi credentials per group 機能は Beam の他に、Funk においても使用できます。 その場合には、ステップ 2: SORACOM Beam の multi credentials per group 機能を設定する 以降を Funk に適宜置き換えてお読みください。

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

  • SORACOM のアカウントを作成済みで、複数の SORACOM IoT SIM (以下、IoT SIM) をお持ちであること
  • MQTT を使用できるデバイス (Raspberry Pi + AK-020 / Wio LTE など) を複数お持ちであること
  • AWS アカウントをお持ちであること

AWS IoT とは 

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

AWS IoT とは

(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 : *
  • 効果 : 許可をチェック

AWS IoT を準備する

二つ目のポリシーはどの topic にも Subscribe でき、beamtest/* の 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/*"]
    }
  ]
}

AWS IoT を準備する

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

AWS IoT を準備する

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

AWS IoT を準備する

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

AWS IoT を準備する

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

AWS IoT を準備する

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

  • このモノの証明書
  • プライベートキー
  • AWS IoT のルート CA (有効化ボタンの上に表示されています)

AWS IoT を準備する

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

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

AWS IoT を準備する

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

AWS IoT を準備する

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

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

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

グループを作成する 

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

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

グループで Beam を設定する 

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

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

以下を入力します。

  • 設定名 (任意の文字列)
  • 種別: Other MQTT Broker
  • ホスト名: 先ほどコピーした AWS IoT のエンドポイントを入力
  • ポート番号: 8883
  • オプションの IMSI 付与: ON (この設定により publish した際の topic 名の末尾に IMSI 番号が自動的に追加されます)

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

  • 認証情報を右の+を押し、以下を入力します。

  • 認証情報 ID: awsiot-xxxxxxxxxxxxxxx (使用する IoT SIM の IMSI 番号)

  • 秘密鍵 (key) にダウンロードしておいたプライベートキーの内容をペースト

  • 証明書 (cert) にダウンロードしておいた証明書の内容をペースト

  • CA 証明書にダウンロードしておいたルート証明書の内容をペースト

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

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

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

ここから先はユーザーコンソールから設定を行う場合と、API から行う場合に別れます。

認証情報 ID 欄に、先ほど登録した認証情報 ID を IMSI 番号部分を #{imsi} とし、登録します。 (この例の場合、awsiot-#{imsi})

こちらのプレースホルダーを使用することにより IMSI 番号に応じた認証情報を使い分けることが可能となります。 また、今回は IMSI 番号を使用しますが #{imei} と設定すれば IMEI 番号でも使い分けることができます。

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

デフォルト証明書
プレースホルダーを利用した認証情報を設定した場合、対応する証明書が存在しなかった際には Beam はプレースホルダー部分を default という文字列に置換し、証明書の取得を試みます。(例の場合、awsiot-#{imsi}awsiot-default) デフォルト証明書を登録しておくことで、対応する IMSI の証明書の登録を忘れてしまった…という場合にもデフォルト証明書を利用して通信できます。

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

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

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

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

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

Group カテゴリ内の GET /groups/{group_id} の項目をクリックします。 group_id のテキストボックスに先ほど作成したグループのグループ 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 グループ内で認証情報を IoT SIM 毎に使い分けて AWS IoT にデータを送信する 

では、実際にデータを送信してみましょう。 ここでは2枚の IoT SIM がデバイス ① とデバイス ② に挿入されている状況を想定して記載いたしますが、もしデバイスが 1 台しかない場合は、 IoT 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 グループ内で認証情報を SIM 毎に使い分けて AWS IoT にデータを送信する

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

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

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

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

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

上記グループに所属する 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 にデータがパブリッシュされたことが確認できます。

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

デバイス ② の 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 を設定するグループを共通で使用できます。