Soracom

Users

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

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

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}
[ポリシー]
  • [ポリシー名]: 任意の文字列を入力します。例: PubSubToAnyTopic

  • [ポリシードキュメント]: モノの権限を設定します。

    ここでは、どの MQTT トピックにも Publish や Subscribe ができるポリシーを作成します。

    [ポリシー効果][ポリシーアクション][ポリシーリソース]
    許可iot:**

2 つ目のモノ:

項目説明
[モノの名前]任意の文字列を入力します。2 つのモノを区別するために、2 つ目のモノが利用する IoT SIM の IMSI を含めると良いでしょう。これ以降、この IMSI を ${imsi2} と表記します。例: raspi-${imsi2}
[ポリシー]
  • [ポリシー名]: 任意の文字列を入力します。例: PubToOnlyBeamdemo

  • [ポリシードキュメント]: モノの権限を設定します。

    ここでは、MQTT トピック beamdemo/* (* はワイルドカード) にのみ Publish できて、どの MQTT トピックも Subscribe ができるポリシーを作成します。

    [ポリシー効果][ポリシーアクション][ポリシーリソース]
    許可iot:Connect*
    許可iot:Subscribe*
    許可iot:Publisharn:aws:iot:ap-northeast-1:XXXXXXXXXXXX:topic/beamdemo/*

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 つ目のモノ:

項目説明
[認証情報 ID]認証情報を識別するために任意の名前を入力します。なお、multi credentials per group 機能を利用するために、1 つ目のモノが利用する IoT SIM の IMSI を含める必要があります。例: awsiot-${imsi1}
[種別]「X.509 証明書」を選択します。
[秘密鍵 (key)]1 つ目のモノのプライベートキーファイル (例: xxx...xxx-private.pem.key) の内容を貼り付けます。(*1)
[証明書 (cert)]1 つ目のモノのデバイス証明書 (例: xxx...xxx-certificate.pem.crt) の内容を貼り付けます。(*1)
[CA 証明局]ルート CA 証明書の Amazon ルート CA 1 (例: AmazonRootCA1.pem) の内容を貼り付けます。(*1)
  • (*1) ファイル名ではなく、テキストエディタなどで ファイルの内容をコピーし 貼り付けてください。

2 つ目のモノ:

項目説明
[認証情報 ID]認証情報を識別するために任意の名前を入力します。なお、multi credentials per group 機能を利用するために、2 つ目のモノが利用する IoT SIM の IMSI を含める必要があります。例: awsiot-${imsi2}
[種別]「X.509 証明書」を選択します。
[秘密鍵 (key)]2 つ目のモノのプライベートキーファイル (例: xxx...xxx-private.pem.key) の内容を貼り付けます。(*1)
[証明書 (cert)]2 つ目のモノのデバイス証明書 (例: xxx...xxx-certificate.pem.crt) の内容を貼り付けます。(*1)
[CA 証明局]ルート CA 証明書の Amazon ルート CA 1 (例: AmazonRootCA1.pem) の内容を貼り付けます。(*1)
  • (*1) ファイル名ではなく、テキストエディタなどで ファイルの内容をコピーし 貼り付けてください。

SORACOM Beam を有効化する

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

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

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

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

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

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

    項目説明
    [設定名]任意の文字列を入力します。わかりやすい名前を設定します。例: MQTT
    [転送先][種別]「Standard」を選択します。
    [転送先][プロトコル]「MQTTS」を選択します。
    [転送先][ホスト名]${default_endpoint} を入力します。例: xxxxxxxxxxxxxx-ats.iot.ap-northeast-1.amazonaws.com
    [転送先][ポート番号]「8883」を入力します。
    [クライアント証明書]スイッチをクリックして、オンにします。
    [認証情報]multi credentials per group 機能を利用するために、認証情報ストアに X.509 証明書を登録する で登録した X.509 証明書の [認証情報 ID] の IMSI 部分 (${IMSI1} や ${IMSI2}) を #{imsi} に置き換えた文字列を入力します。例: awsiot-#{imsi}
    [オプション][IMSI をトピックの末尾に追加する]オンに設定します。オンにすると、publish した際の topic 名の末尾に、IMSI が自動的に追加されます。

    #{imsi} のかわりに #{imei} も使用できます

    今回はプレースホルダーとして IMSI (#{imsi}) を使用しますが、IMEI (#{imei}) を使用することもできます。

    デフォルト証明書を利用できます

    [認証情報 ID] にプレースホルダー (#{imsi} や #{imei}) を利用した場合、対応する証明書が存在しなかった際はプレースホルダー部分を default に置換した証明書が利用されます (例: awsiot-default)。これをデフォルト証明書と呼びます。

    デフォルト証明書を登録しておくと、対応する IMSI または IMEI の証明書を登録しない場合でも通信できます。ただし、AWS IoT 側ではモノを区別することはできません。

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

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

    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.$credentialsIdawsiot-#{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

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