Soracom

Users

ドキュメント
Home ドキュメント SORACOM Funnel Getting Started

AWS IoT アダプターを使用する

デバイスから Funnel のエントリポイントに送信したデータを、AWS IoT Core に転送し、あらかじめ設定したルールに一致したときに Amazon SNS を利用してメールで通知する方法を説明します。

AWS IoT Core にはデバイス管理などのさまざまな機能がありますが、ここでは、データの振り分けを行う「ルールエンジン」という機能を利用して、Funnel から送信したデータを処理します。ルールエンジンの設定を変更すれば、システムの用途に合わせてデータの振り分けとアクションを指定できます。

たとえば、センサーで取得した温度が特定の値を上回ったときに通知を出す、といった用途で利用できます。

具体的な利用例

具体的な利用例としては以下のようなものが挙げられます。

  • IMSI をキーワードとして AWS IoT Core でフィルタリングし、特定の IoT SIM からデータを受信したら AWS Lambda で処理を行う。
  • デバイスで送信したデータを AWS IoT Core に集約し、Amazon DynamoDB に蓄積する。
操作を始める前に準備が必要です (クリックして確認してください)

(1) SORACOM のアカウントを作成して IoT SIM を申し込む / デバイスを購入する

デバイスと、そのデバイスで利用できる IoT SIM を用意します。

SORACOM アカウントの作成方法、IoT SIM の申し込み方法、およびデバイスの購入方法について詳しくは、SORACOM の利用を始める を参照してください。

(2) AWS のアカウントを用意する

AWS のアカウントを用意してください。

準備完了
AWS STS エンドポイントをアクティブ化してください

Amazon Data Firehose アダプターを使用する場合は、AWS が提供する AWS STS エンドポイントをアクティブ化してください。詳しくは、AWS STS エンドポイントをアクティブ化してください を参照してください。

ステップ 1: IAM ポリシーと IAM ロールを作成する

AWS IoT Core へメッセージを Publish するための IAM ポリシーと IAM ロールを作成します。

  1. IAM コンソール にアクセスし、[アクセス管理][ポリシー] の順にクリックして、[ポリシーの作成] をクリックします。

    「アクセス許可を指定」画面が表示されます。

  2. [サービスを選択] をクリックし、「IoT」を入力して、[IoT] をクリックします。

  3. [アクションをフィルタリング] に「Publish」を入力し、[Publish] にチェックを入れます。

  4. [リソース][特定][ARN を追加] の順にクリックします。

    「ARN を追加」画面が表示されます。

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

    項目説明
    [次のリソース]「このアカウント」を選択します。
    [リソースのリージョン]AWS IoT を作成したリージョンを入力するか、[任意のリージョン] にチェックを入れます。
    [Resource topic name]

    トピック名 (例: myTopic/*) を入力するか、[任意の topic name] にチェックを入れます。

    トピック名に IMSI や SIM ID を利用できます

    トピック名に IMSI や SIM ID を利用するには、[Resource topic name] と、Funnel を有効化する[転送先 URL] を以下のように設定します。

    • [Resource topic name]: IMSI や SIM ID を利用する場所に * を入力します。例: myTopic/*
    • Funnel を有効化する[転送先 URL]: IMSI や SIM ID を利用する場所にプレースホルダー (#{imsi}#{simId}#{imei}) を入力します。例: myTopic/#{imsi}

    なお、例の myTopic/ の部分は一致させてください。この myTopic (/ は含みません) を以降、${topic_name} と表記します。

  6. [ARN を追加] をクリックします。

    「アクセス許可を指定」画面に戻ります。

  7. [次へ] をクリックします。

  8. [ポリシー名] に AWS IAM ポリシーの名前を入力して、[ポリシーの作成] をクリックします。

    AWS IAM ポリシーが作成され、ポリシー画面が表示されます。

    次に、作成した IAM ポリシーを適用する IAM ロールを作成します。

  9. [アクセス管理][ロール] の順にクリックして、[ロールを作成] をクリックします。

  10. [AWS アカウント][別の AWS アカウント] の順にクリックし、Funnel を利用する IoT SIM のカバレッジタイプにあわせて [アカウント ID] に以下のいずれかを入力します。

    • 日本カバレッジ: 762707677580
    • グローバルカバレッジ: 950858143650

  11. [外部 ID を要求する] にチェックを入れ、[外部 ID] に任意の文字列を入力します。

    [外部 ID] に入力した文字列は、これ以降、${external_id} と表記します。例: External-ID-EP8tLuTcrzRibRU7

  12. [次へ] をクリックします。

    「許可を追加」画面が表示されます。

  13. [検索] に手順 8 で入力した AWS IAM ポリシーの名前を入力し、その AWS IAM ポリシーにチェックを入れて、[次へ] をクリックします。

  14. [ロール名] に IAM ロールの名前を入力して、[ロールを作成] をクリックします。

    ロール画面に戻ります。

  15. [ロールを表示] をクリックします。

  16. [ARN] をメモします。

    この ARN は、これ以降、${iam_role_arn} と表記します。例: arn:aws:iam::XXXXXXXXXXXX:role/funnel-test-aws-iot-role

ステップ 2: AWS IoT Core のドメイン設定を作成する

  1. AWS IoT コンソール にアクセスして、[接続][ドメイン設定] の順にクリックします。

    ドメイン設定画面が表示されます。

    はじめて AWS IoT Core を使う場合、AWS マネジメントコンソール画面中央の [Get Started] をクリックしてください。メニュー画面に移動します。

  2. [ドメイン設定を作成] をクリックします。

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

    項目説明
    [ドメイン設定名]ドメイン設定の名前を入力します。
    [セキュリティポリシーを選択]

    「IoTSecurityPolicy_TLS13_1_2_2022_10」(デフォルト) を選択します。

    Funnel が対応する TLS バージョンは 1.2 です

    [セキュリティポリシーを選択] では、TLS 1.2 に対応するセキュリティポリシーを選択してください。たとえば、「IoTSecurityPolicy_TLS13_1_2_2022_10」は TLS 1.2 に対応しています。

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

    項目説明
    [認証タイプ]「デフォルト」を選択します。
    [カスタムオーソライザー]「カスタムオーソライザーなし」を選択します。

  5. [ドメイン設定のステータス] で「有効にする」を選択して、[ドメイン設定を作成] をクリックします。

    ドメイン設定画面に戻ります。

  6. [ドメイン設定を表示] をクリックします。

  7. [ドメイン名] をメモします。

    ドメイン名は、これ以降、${device_data_endpoint} と表記します。例:<ランダムな文字列>.iot.ap-norththeast-1.amazonaws.com

    以下のようなエンドポイントは、非推奨とされています。利用しないでください。

    data.iot.[リージョン名].amazonaws.com
    

    Funnel から AWS IoT へデータを送信する場合は、上記のドメイン名 (<ランダムな文字列>.iot.ap-norththeast-1.amazonaws.com) を利用してください。詳細は、AWS IoT Core がお客様に提供する Symantec の認証局無効化の対応方法 | Amazon Web Services ブログ を参照してください。

ステップ 3: Funnel をセットアップする

IoT SIM を利用するデバイスから送信されたデータを、Funnel の AWS IoT アダプターを利用して、AWS IoT Core に転送するための設定を、ユーザーコンソールで行います。

認証情報ストアに AWS IAM ロール認証情報を登録する

ユーザーコンソールの 認証情報ストア に、Funnel から AWS IoT Core にデータを送信するための認証情報を登録します。認証情報は、${iam_role_arn} および ${external_id} です。

  1. 認証情報ストアの「認証情報を登録」画面を表示します。

    詳しくは、認証情報を登録する を参照してください。

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

    項目説明
    [認証情報 ID]認証情報を識別するために任意の名前を入力します。例: AWS-IAM-role-credentials
    [種別]「AWS IAM ロール認証情報」を選択します。
    [ロール ARN]${iam_role_arn} を入力します。例: arn:aws:iam::XXXXXXXXXXXX:role/funnel-test-aws-iot-role
    [外部 ID]${external_id} を入力します。例: External-ID-EP8tLuTcrzRibRU7

    credential registration credential registration

  3. [登録] をクリックします。

Funnel を有効化する

IoT SIM に対して Funnel を有効化します。

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

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

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

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

  2. スイッチをクリックして「ON」にします。

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

    項目説明
    [転送先サービス]「AWS IoT」を選択します。
    [転送先 URL]「${device_data_endpoint}/${topic_name}/#{imsi}」を入力します。例: <ランダムな文字列>.iot.ap-norththeast-1.amazonaws.com/myTopic/#{imsi}#{imsi} はプレースホルダー (*1) です。
    [認証情報]認証情報ストアに AWS IAM ロール認証情報を登録する で登録した認証情報を選択します。例: AWS-IAM-role-credentials
    [送信データ形式]ここでは、「JSON」を選択します。[送信データ形式] について詳しくは、SORACOM Funnel から送信されるデータ を参照してください。
    [SIM ID を追加][転送先 URL]#{simId} のプレースホルダーを指定した場合や、メッセージに SIM ID を含める場合は、オンにします。
    • (*1) [転送先 URL] には、プレースホルダー (#{imsi}#{simId}#{imei}) を指定できます。プレースホルダーは、Funnel でデータが転送される際に、それぞれ IoT SIM の IMSI、SIM ID、IMEI に置き換えられます。SIM ID を使う場合は、設定画面下段の [SIM ID を追加] を ON にします。

    funnel group setting funnel group setting

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

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

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

ステップ 4: MQTT テストクライアントを使って動作を確認する

ここまでの設定で、デバイスから Funnel を経由して AWS IoT Core にデータを転送できるようになりました。

動作確認のために、IoT SIM を利用するデバイスから MQTT を使用して AWS IoT Core にデータを送信します。

AWS の MQTT テストクライアントを設定する

送信されたデータは、AWS の MQTT テストクライアントを使って受信します。

  1. AWS IoT コンソール にアクセスして、メニュー画面の [MQTT テストクライアント] をクリックします。

    AWS MQTT テストクライアント AWS MQTT テストクライアント

    MQTT テストクライアント画面が表示されます。

    初めて MQTT テストクライアントにアクセスする場合、操作できる状態になるまでしばらく時間がかかることがあります。その場合は少し待ってからアクセスし直してください。

  2. [トピックのフィルター] に「${topic_name}/#」(例: myTopic/#) を入力し、[サブスクライブ] をクリックします。

    ${topic_name} 配下 (例: myTopic 配下) に配信されたメッセージが表示されるようになります。

    AWS MQTT テストクライアント AWS MQTT テストクライアント

    これで、MQTT テストクライアントで受信データを確認できます。

IoT SIM を利用するデバイスから Funnel 宛てにデータを送信する

以下のような JSON 形式のデータをリクエストボディとして、HTTP で Funnel に送信します。

{
  "deviceid": "iot123",
  "temp": 54.98,
  "humidity": 32.43,
  "coords": {
    "latitude": 47.615694,
    "longitude": -122.3359976
  }
}
  1. IoT SIM を利用するデバイスから Unified Endpoint を利用して Funnel にデータを送信します。ここでは Funnel のみが設定されたグループで、Unified Endpoint にリクエストします。

    $ curl -v uni.soracom.io \
    -H "Content-type: application/json" \
    -d '{ 
        "deviceId": "iot123", 
        "temp": 54.98, 
        "humidity": 32.43, 
        "coords": {
            "latitude": 47.615694, 
            "longitude": -122.3359976
        }
    }'
    
    * Host uni.soracom.io:80 was resolved.
    * IPv6: (none)
    * IPv4: 100.127.69.42
    *   Trying 100.127.69.42:80...
    * Connected to uni.soracom.io (100.127.69.42) port 80
    > POST / HTTP/1.1
    > Host: uni.soracom.io
    > User-Agent: curl/8.7.1
    > Accept: */*
    > Content-type: application/json
    > Content-Length: 119
    > 
    * upload completely sent off: 119 bytes
    < HTTP/1.1 204 No Content
    < Date: Tue, 22 Oct 2024 00:36:14 GMT
    < Connection: close
    < 
    * Closing connection
    

    上記のように、レスポンスとして HTTP/1.1 204 No Content が返ってくれば、データ送信に成功しています。

    他の HTTP レスポンスコードが返ってきた場合には、レスポンスコードを元に、送信データの形式などを確認してください。

    Unified Endpoint からのレスポンスは条件によって変わります

    Unified Endpoint のレスポンス形式を設定で変更できます。詳しくは Unified Endpoint の レスポンスの形式を設定する を参照してください。

    たとえば、レスポンスフォーマットを「Auto (デフォルト)」にして、Unified Endpoint から Funnel と Harvest Data の 2 つへのデータ送信に成功したときのレスポンスは、次のとおりです。

    * Host uni.soracom.io:80 was resolved.
    * IPv6: (none)
    * IPv4: 100.127.69.42
    *   Trying 100.127.69.42:80...
    * Connected to uni.soracom.io (100.127.69.42) port 80
    > POST / HTTP/1.1
    > Host: uni.soracom.io
    > User-Agent: curl/8.7.1
    > Accept: */*
    > Content-type: application/json
    > Content-Length: 119
    > 
    * upload completely sent off: 119 bytes
    < HTTP/1.1 200 OK
    < content-type: application/json
    < Date: Tue, 22 Oct 2024 00:48:42 GMT
    < Connection: close
    < Content-Length: 97
    < 
    * Closing connection
    {"result":"ok","detail":{"SoracomFunnel":{"statusCode":204},"SoracomHarvest":{"statusCode":201}}}%
    
    • リクエスト成功時のレスポンスのステータスコードは HTTP/1.1 200 OK です
    • レスポンスボディに、各サービス (ここでは Funnel と Harvest Data) それぞれへのリクエストの成否が JSON で返されます
  2. AWS IoT コンソール の MQTT テストクライアントの [サブスクリプション] に、メッセージが表示されることを確認します。

    Funnel の設定でプレースホルダー (#{imsi}) を指定すると、トピックには IoT SIM の IMSI が入ります。

    aws mqtt client aws mqtt client

メッセージが受信できないときは以下の点を確認してください
  • ステップ 1: IAM ロールを作成する の手順 2 で指定したアカウント ID が対応するカバレッジタイプと、Funnel を有効化した IoT SIM のカバレッジタイプが一致していること

  • 認証情報ストアに AWS IAM ロール認証情報を登録する で認証情報ストアに登録した [ロール ARN][外部 ID] が、それ以前に設定した値 (${iam_role_arn}、および ${external_id}) と一致していること

  • Funnel を有効化する で指定した [転送先 URL] がサンプルどおりになっていること

    特に myTopic を任意の文字列に変更する場合は、このページで設定するすべての myTopic を同じ文字列に置き換える必要があります。

  • Funnel にデータを送信するデバイスで利用する IoT SIM が、Funnel を設定したグループに所属していること

ステップ 5: Amazon SNS をセットアップする

Amazon SNS の SNS トピックからメールで通知を受け取れるように設定します。

SNS トピック

Amazon SNS コンソール にアクセスして、以下の設定の SNS トピックを作成してください。詳しくは、Amazon SNS トピックを作成する を参照してください。

項目説明
[タイプ]「スタンダード」を選択します。
[名前]SNS トピックの名前を入力します。[名前] に入力した文字列は、これ以降、${sns_topic} と表記します。例: my-sns-topic

SNS サブスクリプション

同様に Amazon SNS コンソール にアクセスして、以下の設定の SNS サブスクリプションを作成してください。詳しくは、Amazon SNS トピックへサブスクライブする を参照してください。

項目説明
[トピック ARN]SNS トピック で作成した SNS トピックの ARN を入力します。
[プロトコル]「E メール」を選択します。
[エンドポイント]通知を受信するメールアドレスを入力します。

なお、SNS サブスクリプションを作成すると、[エンドポイント] に入力したメールアドレスに、確認メールが送信されます。確認メールに表示されているリンクをクリックして、登録を完了させてください。

ステップ 6: AWS IoT Core のルールを作成する

AWS IoT Core では、IoT デバイスから送信されたデータは、ルールに従って処理され、アクションが実行されます。今回は、${topic_name} 配下 (例: myTopic 配下) に配信されたメッセージのうち、「temp」フィールド (センサーで取得した温度) の値が特定の値を上回った場合に、Amazon SNS に通知するルールを作成します。

  1. AWS IoT コンソール にアクセスし、[メッセージのルーティング][ルール] の順にクリックして、[ルールを作成] をクリックします。

    「ルールのプロパティを指定」画面が表示されます。

  2. [ルール名] を入力して、[次へ] をクリックします。

    「SQL ステートメントを設定」画面が表示されます。

  3. [SQL ステートメント] に以下の内容を入力して、[次へ] をクリックします。

    SELECT * FROM 'myTopic/#' WHERE payloads.temp > 30
    
    • (*) myTopic/# は、「${topic_name}/#」を入力してください。

    この設定で、${topic_name} 配下 (例: myTopic 配下) に配信されたメッセージの「temp」フィールドの値が 30 を超えた場合に、Amazon SNS に通知されます。

    「ルールアクションをアタッチ」画面が表示されます。

  4. [アクション 1] で「Simple Notification Service (SNS)」を選択し、以下の項目を設定します。

    項目説明
    [SNS トピック]SNS トピック で作成した SNS トピックの ARN を選択します。
    [メッセージ形式]「RAW」を選択します。

  5. [新しいロールを作成] をクリックします。

    「ロールを作成」画面が表示されます。

  6. [ロール名] に IAM ロールの名前を入力して、[作成] をクリックします。

    「ルールアクションをアタッチ」画面に戻ります。

  7. [次へ][作成] の順にクリックします。

ルールの作成手順について詳しくは、デバイスデータを他のサービスにルーティングする AWS IoT ルールの作成 を参照してください。

ステップ 7: メールの送信を確認する

ここまでの手順で、デバイスから Funnel にデータを送信すると、AWS IoT Core に転送され、Amazon SNS を経由してメールが送信される仕組みが整いました。最後にデバイスからデータを送信して、Amazon SNS で設定したメールアドレスにメールが届くことを確認します。

  1. IoT SIM を利用するデバイスから Unified Endpoint を利用して Funnel にデータを送信します。ここでは Funnel のみが設定されたグループで、Unified Endpoint にリクエストします。

    temp の値が 30 を超えていることを確認してください。

    $ curl -v uni.soracom.io \
    -H "Content-type: application/json" \
    -d '{ 
        "deviceId": "iot123", 
        "temp": 54.98, 
        "humidity": 32.43, 
        "coords": {
            "latitude": 47.615694, 
            "longitude": -122.3359976
        }
    }'
    
    * Host uni.soracom.io:80 was resolved.
    * IPv6: (none)
    * IPv4: 100.127.69.42
    *   Trying 100.127.69.42:80...
    * Connected to uni.soracom.io (100.127.69.42) port 80
    > POST / HTTP/1.1
    > Host: uni.soracom.io
    > User-Agent: curl/8.7.1
    > Accept: */*
    > Content-type: application/json
    > Content-Length: 119
    > 
    * upload completely sent off: 119 bytes
    < HTTP/1.1 204 No Content
    < Date: Tue, 22 Oct 2024 00:36:14 GMT
    < Connection: close
    < 
    * Closing connection
    

    上記のように、レスポンスとして HTTP/1.1 204 No Content が返ってくれば、データ送信に成功しています。

    他の HTTP レスポンスコードが返ってきた場合には、レスポンスコードを元に、送信データの形式などを確認してください。

    Unified Endpoint からのレスポンスは条件によって変わります

    Unified Endpoint のレスポンス形式を設定で変更できます。詳しくは Unified Endpoint の レスポンスの形式を設定する を参照してください。

  2. SNS サブスクリプション[エンドポイント] に指定したメールアドレスに、以下のようなメールが送信されていることを確認します。

    funnel test funnel test

メールが届かない場合は

以下のポイントを確認してください。

  • ルールの設定内容が、上記の説明どおりになっていること
  • SNS サブスクリプション[エンドポイント] に有効なメールアドレスが登録されていること
  • temp の値が 30 を超えていること