Soracom

Users

ドキュメント
Home ドキュメント SORACOM Beam Amazon Web Service (AWS) に送信する

AWS IoT と接続する (multi credentials per group)

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

AWS IoT を準備する 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 を準備する AWS IoT を準備する

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

AWS IoT を準備する AWS IoT を準備する

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

AWS IoT を準備する AWS IoT を準備する

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

AWS IoT を準備する AWS IoT を準備する

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

AWS IoT を準備する AWS IoT を準備する

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

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

AWS IoT を準備する AWS IoT を準備する

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

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

AWS IoT を準備する AWS IoT を準備する

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

AWS IoT を準備する AWS IoT を準備する

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

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

Beam の設定はグループに対して行います

ここでは、グループの設定を変更する操作のみを説明します。グループの仕組みやグループを作成する操作について詳しくは、グループ設定 を参照してください。

  1. SIM グループ画面で [SORACOM Beam 設定] をクリックします。

    SIM グループ画面を表示する操作について詳しくは、グループの設定を変更する を参照してください。

  2. [+設定を追加する][MQTT エントリポイント] の順にクリックします。

  3. 以下の項目を設定します。

    項目説明
    [設定名]任意の文字列を入力します。わかりやすい名前を設定します。
    [転送先][種別]「Standard」を選択します。
    [転送先][プロトコル]「MQTTS」を選択します。
    [転送先][ホスト名]先ほどコピーした AWS IoT のエンドポイントを入力します。
    [転送先][ポート番号]8883 を入力します。
    [オプション][IMSI をトピックの末尾に追加する]オンに設定します。オンにすると、publish した際の topic 名の末尾に、IMSI が自動的に追加されます。

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

    • 認証情報 ID: awsiot-xxxxxxxxxxxxxxx (使用する IoT SIM の IMSI)
    • 秘密鍵 (key) にダウンロードしておいたプライベートキーの内容をペースト
    • 証明書 (cert) にダウンロードしておいた証明書の内容をペースト
    • CA 証明書にダウンロードしておいたルート証明書の内容をペースト

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

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

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

  5. [保存] をクリックします。

  6. IoT SIM が所属するグループを切り替えます。

    IoT SIM の Beam の設定が完了しました。

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

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

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

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

デフォルト証明書

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

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

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

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

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

Beam の multi credentials per group 機能を設定する 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 の 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 機能を設定する Beam の multi credentials per group 機能を設定する

ステップ 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

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

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

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

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

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

Beam を使用して同じ SIM グループ内で認証情報を SIM ごとに使い分けて AWS IoT にデータを送信する 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 にデータを送信する 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 を設定するグループを共通で使用できます。