Soracom

Users

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

AWS IoT と接続する

SORACOM Beam の MQTT エントリポイント を利用して、AWS IoT Core へデバイスからデータを送信したり (下図の赤線)、デバイスに AWS IoT Core からのデータを受信したりできます (下図の青線)。ここでは、(赤線に相当する) デバイスで Beam の MQTT エントリポイントを経由して AWS IoT にデータを送信し、AWS IoT からは Amazon SNS を経由してメールを送信する方法を説明します。また、(青線に相当する) AWS IoT Core から送信したデータをデバイスで受信します。

AWS IoT Core と接続する場合は、SORACOM Beam の代わりに SORACOM Funnel を利用すると、より簡単に実装できます。詳しくは、AWS IoT アダプターを使用する を参照してください。

AWS IoT とは

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

デバイス (Thing) からクラウドへのデータ送信の方法には 2 種類用意されています。

  • MQTTS : X.509 証明書を使用した TLS (Transport Layer Security) のクライアント認証
  • HTTPS : IAM ユーザーやロール・Cognito を利用した認証

これ以外にも、AWS IoT Core を利用すると S3 や DynamoDB へのデータ保存、AWS Lambda の関数の実行など、様々な AWS サービスと連携できます。ぜひお試しください。

ステップ 1: AWS IoT を設定する

AWS IoT Core にモノ (Thing) を作成する

使用するデバイスをモノ (Thing) として、AWS IoT に作成します。操作手順について詳しくは、AWS IoT Core にモノ (Thing) を作成する を参照してください。

具体的には以下のように設定します。

項目説明
[モノの名前]任意の文字列を入力します。例: raspi
[ポリシー]
  • [ポリシー名]: 任意の文字列を入力します。例: PubSubToAnyTopic

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

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

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

Amazon SNS のトピックを作成する

続いて Amazon SNS を使用してメールを送信する仕組みを作成します。操作手順について詳しくは、Amazon SNS のトピックを作成する を参照してください。

具体的には以下のように設定します。

項目説明
[タイプ]「スタンダード」を選択します。
[名前]任意の文字列を入力します。例: my-sns-topic
[サブスクリプション]
  • [プロトコル]: 「E メール」を選択します。
  • [エンドポイント]: 宛先になるメールアドレスを入力します。例: example@example.jp

なお、ここで作成した Amazon SNS トピックの ARN を、これ以降、${sns_topic_arn} と表記します。例: arn:aws:sns:ap-northeast-1:XXXXXXXXXXXX:my-sns-topic

AWS IoT Core のルールを作成する

このページで説明する機能を体験するために、AWS IoT Core に送信されたデータに応じて SNS トピックを呼び出すルールを作成します。操作手順について詳しくは、AWS IoT Core のルールを作成する を参照してください。

具体的には以下のように設定します。

項目説明
[ルール名]任意の文字列を入力します。例: SNS
[SQL のバージョン]「2016-03-23」を選択します。
[SQL ステートメント]

'beamdemo' という MQTT トピックに Publish (送信) されたメッセージをすべて Amazon SNS へ通知するように、以下の SQL を入力します。

SELECT * FROM 'beamdemo'
[アクション 1]「Simple Notification Service (SNS)」を選択します。
[SNS トピック]

${sns_topic_arn} を選択します。例: arn:aws:sns:ap-northeast-1:XXXXXXXXXXXX:my-sns-topic

Amazon SNS のトピックが見つからない場合は、リージョンを確認してください。AWS IoT Core と Amazon SNS のリージョンは同一である必要があります。

[メッセージ形式]「RAW」を選択します。
[IAM ロール]

新しいロールを作成します。

  • [ロール名] は任意の文字列を入力します。例: aws_iot_sns

AWS IoT Core のデフォルトのデータエンドポイントを確認する

AWS IoT Core へデータを送信するためのデフォルトのデータエンドポイントを確認します。詳しくは、AWS IoT Core のデフォルトのデータエンドポイントを確認する を参照してください。

このエンドポイントをこれ以降、${default_endpoint} と表記します。例: xxxxxxxxxxxxxx-ats.iot.ap-northeast-1.amazonaws.com

ステップ 2: SORACOM Beam をセットアップする

認証情報ストアに X.509 証明書を登録する

Beam から AWS IoT に登録したモノを利用するために、モノ (Thing) を作成する で作成した証明書を、SORACOM ユーザーコンソールに登録します。

具体的には、認証情報ストアの「認証情報を登録」画面で以下のように登録します。この画面の表示方法については、認証情報を登録する を参照してください。

項目説明
[認証情報 ID]認証情報を識別するために任意の名前を入力します。例: aws-iot
[種別]「X.509 証明書」を選択します。
[秘密鍵 (key)]プライベートキーファイル (例: xxx...xxx-private.pem.key) の内容を貼り付けます。(*1)
[証明書 (cert)]デバイス証明書 (例: 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. 以下の項目を設定します。

    項目説明
    [設定名]任意の文字列を入力します。わかりやすい名前を設定します。例: AWS IoT
    [転送先][種別]「Standard」を選択します。
    [転送先][プロトコル]「MQTTS」を選択します。
    [転送先][ホスト名]${default_endpoint} を入力します。例: xxxxxxxxxxxxxx-ats.iot.ap-northeast-1.amazonaws.com
    [転送先][ポート番号]「8883」を入力します。
    [クライアント証明書]スイッチをクリックして、オンにします。
    [認証情報]認証情報ストアに X.509 証明書を登録する で登録した X.509 証明書を選択します。例: aws-iot

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

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

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

ステップ 3: デバイスからデータを送信する

では、実際にデータを送信してみましょう。

ここでは、オープンソースとして提供されている MQTT メッセージブローカーである mosquitto-clients の mosquitto_pub を使用して Publish します。

mosquitto-clients のインストール

mosquitto-clients は、サイト からダウンロードおよびインストールしてください。

なお、Raspberry Pi の場合は、以下のコマンドでインストールできます。

$ sudo apt install mosquitto-clients
  1. 上記 SIM グループに所属する IoT SIM を利用するデバイスで、以下のコマンドを実行します。

    $ mosquitto_pub -d -h beam.soracom.io -t beamdemo -m "Hello, World"
    
    Client (null) sending CONNECT
    Client (null) received CONNACK (0)
    Client (null) sending PUBLISH (d0, q0, r0, m1, 'beamdemo', ... (12 bytes))
    Client (null) sending DISCONNECT
    

    データが Beam に送信され、Amazon SNS 経由でメールが送信されます。

  2. メールが届いていることを確認します。

上記のコマンドの実行のとおり、Beam の設定を行った SIM グループに属する IoT SIM を利用するデバイスからは、コマンド実行時にデバイス証明書を指定することなく、AWS IoT へデータを送信できています。

なお、Beam を使用しない場合は、AWS IoT Core Developer Guide の Connect a Raspberry Pi or another device にもあるとおり、以下のように証明書ファイル等を指定して送信する必要があります。

$ mosquitto_pub --cafile rootCA.pem \
  --cert cert.pem \
  --key thing-private-key.pem \
  -h (ランダムな値)-ats.iot.ap-northeast-1.amazonaws.com -p 8883 \
  -q 1 -d -t topic/test -i clientid2 -m "Hello, World"

つまり、証明書を Beam で付与していることがわかります。このように Beam を使用すると、デバイスで証明書を保持する必要がありません。証明書の変更があった際も、Beam の設定を変更するだけで対応できます。

ステップ 4: AWS IoT Core からデータを受信する

次に デバイスで AWS IoT Core からのデータを受信してみましょう。

  1. IoT SIM を利用するデバイスで、以下のコマンドを実行し MQTT topic を subscribe します。ここでは例として messages/fromAWS という MQTT topic を subscribe します。

    $ mosquitto_sub -d -h beam.soracom.io -t messages/fromAWS
    
    Client mosq-FyNf82gCIce1UkNebM sending CONNECT
    Client mosq-FyNf82gCIce1UkNebM received CONNACK (0)
    Client mosq-FyNf82gCIce1UkNebM sending SUBSCRIBE (Mid: 1, Topic: messages/fromAWS, QoS: 0, Options: 0x00)
    Client mosq-FyNf82gCIce1UkNebM received SUBACK
    Subscribed (mid: 1): 0
    
  2. AWS IoT コンソール にアクセスします。

  3. [MQTT テストクライアント] をクリックし、[トピックに公開する] タブで以下の項目を設定します。

    • [トピック名]: デバイスが subscribe している MQTT topic 名を入力します。ここの例では messages/fromAWS です。
    • [メッセージペイロード]: デバイスへ送信するメッセージを入力します。デフォルトでは以下のメッセージが設定されています。
      {
        "message": "AWS IoT コンソールからの挨拶"
      }
      

  4. [発行] をクリックします。

    デバイスにメッセージが届き、以下のように表示されます。

    Client mosq-FyNf82gCIce1UkNebM received PUBLISH (d0, q0, r0, m0, 'messages/fromAWS', ... (57 bytes))
    {
      "message": "AWS IoT コンソールからの挨拶"
    }