デバイスから 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 ロールを作成します。
IAM コンソール にアクセスし、 → の順にクリックして、 をクリックします。
「アクセス許可を指定」画面が表示されます。
をクリックし、「IoT」を入力して、 をクリックします。
に「Publish」を入力し、 にチェックを入れます。
→ → の順にクリックします。
「ARN を追加」画面が表示されます。
以下の項目を設定します。
項目 説明 「このアカウント」を選択します。 AWS IoT を作成したリージョンを入力するか、 にチェックを入れます。トピック名 (例:
myTopic/*
) を入力するか、 にチェックを入れます。トピック名に IMSI や SIM ID を利用できます
トピック名に IMSI や SIM ID を利用するには、Funnel を有効化する の を以下のように設定します。
と、*
を入力します。例:myTopic/*
: IMSI や SIM ID を利用する場所に - Funnel を有効化する の : IMSI や SIM ID を利用する場所にプレースホルダー (
#{imsi}
、#{simId}
、#{imei}
) を入力します。例:myTopic/#{imsi}
なお、例の
myTopic/
の部分は一致させてください。このmyTopic
(/
は含みません) を以降、${topic_name} と表記します。をクリックします。
「アクセス許可を指定」画面に戻ります。
をクリックします。
に AWS IAM ポリシーの名前を入力して、 をクリックします。
AWS IAM ポリシーが作成され、ポリシー画面が表示されます。
次に、作成した IAM ポリシーを適用する IAM ロールを作成します。
→ の順にクリックして、 をクリックします。
→ の順にクリックし、Funnel を利用する IoT SIM のカバレッジタイプにあわせて に以下のいずれかを入力します。
- 日本カバレッジ:
762707677580
- グローバルカバレッジ:
950858143650
- 日本カバレッジ:
にチェックを入れ、 に任意の文字列を入力します。
に入力した文字列は、これ以降、${external_id} と表記します。例:External-ID-EP8tLuTcrzRibRU7
外部 ID の詳細は、AWS の AWS リソースへのアクセス権を第三者に付与するときに外部 ID を使用する方法 - AWS Identity and Access Management を参照してください。
をクリックします。
「許可を追加」画面が表示されます。
に手順 8 で入力した AWS IAM ポリシーの名前を入力し、その AWS IAM ポリシーにチェックを入れて、 をクリックします。
に IAM ロールの名前を入力して、 をクリックします。
ロール画面に戻ります。
をクリックします。
をメモします。
この ARN は、これ以降、${iam_role_arn} と表記します。例:
arn:aws:iam::XXXXXXXXXXXX:role/funnel-test-aws-iot-role
ステップ 2: AWS IoT Core のドメイン設定を作成する
AWS IoT コンソール にアクセスして、 → の順にクリックします。
ドメイン設定画面が表示されます。
はじめて AWS IoT Core を使う場合、AWS マネジメントコンソール画面中央の
をクリックしてください。メニュー画面に移動します。をクリックします。
以下の項目を設定します。
項目 説明 ドメイン設定の名前を入力します。 「IoTSecurityPolicy_TLS13_1_2_2022_10」(デフォルト) を選択します。
Funnel が対応する TLS バージョンは 1.2 です
では、TLS 1.2 に対応するセキュリティポリシーを選択してください。たとえば、「IoTSecurityPolicy_TLS13_1_2_2022_10」は TLS 1.2 に対応しています。
以下の項目を設定します。
項目 説明 「デフォルト」を選択します。 「カスタムオーソライザーなし」を選択します。 で「有効にする」を選択して、 をクリックします。
ドメイン設定画面に戻ります。
をクリックします。
をメモします。
ドメイン名は、これ以降、${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} です。
認証情報ストアの「認証情報を登録」画面を表示します。
詳しくは、認証情報を登録する を参照してください。
以下の項目を設定します。
項目 説明 認証情報を識別するために任意の名前を入力します。例: AWS-IAM-role-credentials
「AWS IAM ロール認証情報」を選択します。 ${iam_role_arn} を入力します。例: arn:aws:iam::XXXXXXXXXXXX:role/funnel-test-aws-iot-role
${external_id} を入力します。例: External-ID-EP8tLuTcrzRibRU7
をクリックします。
Funnel を有効化する
IoT SIM に対して Funnel を有効化します。
Funnel の設定はグループに対して行います
ここでは、グループの設定を変更する操作のみを説明します。グループの仕組みやグループを作成する操作について詳しくは、グループ設定 を参照してください。
SIM グループ画面で
をクリックします。SIM グループ画面を表示する操作について詳しくは、グループの設定を変更する を参照してください。
スイッチをクリックして「ON」にします。
以下の項目を設定します。
項目 説明 「AWS IoT」を選択します。 「${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 から送信されるデータ を参照してください。 について詳しくは、 に#{simId}
のプレースホルダーを指定した場合や、メッセージに SIM ID を含める場合は、オンにします。- (*1)
#{imsi}
、#{simId}
、#{imei}
) を指定できます。プレースホルダーは、Funnel でデータが転送される際に、それぞれ IoT SIM の IMSI、SIM ID、IMEI に置き換えられます。SIM ID を使う場合は、設定画面下段の を ON にします。 には、プレースホルダー (
- (*1)
をクリックします。
IoT SIM の Funnel の設定が完了しました。
ステップ 4: MQTT テストクライアントを使って動作を確認する
ここまでの設定で、デバイスから Funnel を経由して AWS IoT Core にデータを転送できるようになりました。
動作確認のために、IoT SIM を利用するデバイスから MQTT を使用して AWS IoT Core にデータを送信します。
AWS の MQTT テストクライアントを設定する
送信されたデータは、AWS の MQTT テストクライアントを使って受信します。
AWS IoT コンソール にアクセスして、メニュー画面の をクリックします。
MQTT テストクライアント画面が表示されます。
初めて MQTT テストクライアントにアクセスする場合、操作できる状態になるまでしばらく時間がかかることがあります。その場合は少し待ってからアクセスし直してください。
に「${topic_name}/#」(例:myTopic/#
) を入力し、 をクリックします。${topic_name} 配下 (例:
myTopic
配下) に配信されたメッセージが表示されるようになります。これで、MQTT テストクライアントで受信データを確認できます。
IoT SIM を利用するデバイスから Funnel 宛てにデータを送信する
以下のような JSON 形式のデータをリクエストボディとして、HTTP で Funnel に送信します。
{
"deviceid": "iot123",
"temp": 54.98,
"humidity": 32.43,
"coords": {
"latitude": 47.615694,
"longitude": -122.3359976
}
}
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 で返されます
- リクエスト成功時のレスポンスのステータスコードは
AWS IoT コンソール の MQTT テストクライアントの に、メッセージが表示されることを確認します。
Funnel の設定でプレースホルダー (
#{imsi}
) を指定すると、トピックには IoT SIM の IMSI が入ります。
メッセージが受信できないときは以下の点を確認してください
ステップ 1: IAM ロールを作成する の手順 2 で指定したアカウント ID が対応するカバレッジタイプと、Funnel を有効化した IoT SIM のカバレッジタイプが一致していること
認証情報ストアに AWS IAM ロール認証情報を登録する で認証情報ストアに登録した と が、それ以前に設定した値 (${iam_role_arn}、および ${external_id}) と一致していること
Funnel を有効化する で指定した がサンプルどおりになっていること
特に
myTopic
を任意の文字列に変更する場合は、このページで設定するすべてのmyTopic
を同じ文字列に置き換える必要があります。Funnel にデータを送信するデバイスで利用する IoT SIM が、Funnel を設定したグループに所属していること
ステップ 5: Amazon SNS をセットアップする
Amazon SNS の SNS トピックからメールで通知を受け取れるように設定します。
SNS トピック
Amazon SNS コンソール にアクセスして、以下の設定の SNS トピックを作成してください。詳しくは、Amazon SNS トピックを作成する を参照してください。
項目 | 説明 |
---|---|
「スタンダード」を選択します。 | |
SNS トピックの名前を入力します。my-sns-topic | に入力した文字列は、これ以降、${sns_topic} と表記します。例:
SNS サブスクリプション
同様に Amazon SNS コンソール にアクセスして、以下の設定の SNS サブスクリプションを作成してください。詳しくは、Amazon SNS トピックへサブスクライブする を参照してください。
項目 | 説明 |
---|---|
SNS トピック で作成した SNS トピックの ARN を入力します。 | |
「E メール」を選択します。 | |
通知を受信するメールアドレスを入力します。 |
なお、SNS サブスクリプションを作成すると、
に入力したメールアドレスに、確認メールが送信されます。確認メールに表示されているリンクをクリックして、登録を完了させてください。ステップ 6: AWS IoT Core のルールを作成する
AWS IoT Core では、IoT デバイスから送信されたデータは、ルールに従って処理され、アクションが実行されます。今回は、${topic_name} 配下 (例: myTopic
配下) に配信されたメッセージのうち、「temp」フィールド (センサーで取得した温度) の値が特定の値を上回った場合に、Amazon SNS に通知するルールを作成します。
AWS IoT コンソール にアクセスし、 → の順にクリックして、 をクリックします。
「ルールのプロパティを指定」画面が表示されます。
を入力して、 をクリックします。
「SQL ステートメントを設定」画面が表示されます。
に以下の内容を入力して、 をクリックします。
SELECT * FROM 'myTopic/#' WHERE payloads.temp > 30
- (*)
myTopic/#
は、「${topic_name}/#」を入力してください。
この設定で、${topic_name} 配下 (例:
myTopic
配下) に配信されたメッセージの「temp」フィールドの値が 30 を超えた場合に、Amazon SNS に通知されます。「ルールアクションをアタッチ」画面が表示されます。
- (*)
で「Simple Notification Service (SNS)」を選択し、以下の項目を設定します。
項目 説明 SNS トピック で作成した SNS トピックの ARN を選択します。 「RAW」を選択します。 をクリックします。
「ロールを作成」画面が表示されます。
に IAM ロールの名前を入力して、 をクリックします。
「ルールアクションをアタッチ」画面に戻ります。
→ の順にクリックします。
ルールの作成手順について詳しくは、デバイスデータを他のサービスにルーティングする AWS IoT ルールの作成 を参照してください。
ステップ 7: メールの送信を確認する
ここまでの手順で、デバイスから Funnel にデータを送信すると、AWS IoT Core に転送され、Amazon SNS を経由してメールが送信される仕組みが整いました。最後にデバイスからデータを送信して、Amazon SNS で設定したメールアドレスにメールが届くことを確認します。
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 の レスポンスの形式を設定する を参照してください。
SNS サブスクリプション で に指定したメールアドレスに、以下のようなメールが送信されていることを確認します。
メールが届かない場合は
以下のポイントを確認してください。
- ルールの設定内容が、上記の説明どおりになっていること
- 確認のポイントは AWS IoT のトラブルシューティング を参照してください。特に、CloudWatch Logs でログを出力すると、トラブルシューティングに役立ちます。
- SNS サブスクリプション の に有効なメールアドレスが登録されていること
temp
の値が 30 を超えていること