デバイスから 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 エンドポイントをアクティブ化してください
AWS IoT アダプターを使用する場合は、AWS が提供する AWS STS エンドポイントをアクティブ化してください。詳しくは、AWS STS エンドポイントをアクティブ化してください を参照してください。
ステップ 1: IAM ポリシーと IAM ロールを作成する
Funnel の AWS IoT アダプターが、お客様の AWS アカウントの AWS IoT Core へメッセージを Publish するために、お客様の AWS アカウントに以下の設定の IAM ポリシーと IAM ロールを作成します。操作手順について詳しくは、IAM ポリシーと IAM ロールを作成する を参照してください。
項目 | 説明 |
---|---|
IAM ポリシー | このページで説明する機能を体験するために、お客様の AWS アカウントの AWS IoT のトピック ( 具体的には以下のように設定します。
トピック名に IMSI や SIM ID を利用できますトピック名に IMSI や SIM ID を利用するには、Funnel を有効化する の を以下のように設定します。 と、
なお、例の |
IAM ロール | このページで説明する機能を体験するために、「SORACOM の AWS アカウント」を信頼できるエンティティとして指定した IAM ロールを作成します。 具体的には以下のように設定します。
なお、ここで作成した IAM ロールの ARN を、これ以降、${iam_role_arn} と表記します。例:
|
ステップ 2: AWS IoT Core のドメイン設定を作成する
このページで説明する機能を体験するために、AWS IoT Core のドメイン設定を作成します。操作手順について詳しくは、AWS IoT Core のドメイン設定を作成する を参照してください。
具体的には以下のように設定します。
項目 | 説明 |
---|---|
ドメイン設定の名前を入力します。例: funnel-test-aws-iot-domain | |
「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-northeast-1.amazonaws.com
以下のようなエンドポイントは、非推奨とされています。利用しないでください。
data.iot.[リージョン名].amazonaws.com
Funnel から AWS IoT へデータを送信する場合は、上記のドメイン名 (<ランダムな文字列>.iot.ap-northeast-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 にデータを Publish (送信) するために、IAM ロールに関する認証情報を、SORACOM ユーザーコンソールに登録します。
具体的には、認証情報ストアの「認証情報を登録」画面で以下のように登録します。この画面の表示方法については、認証情報を登録する を参照してください。
項目 | 説明 |
---|---|
認証情報を識別するために任意の名前を入力します。例: 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-northeast-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 に HTTP でデータを送信し、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 を使用してメールを送信する仕組みを作成します。操作手順について詳しくは、Amazon SNS のトピックを作成する を参照してください。
具体的には以下のように設定します。
項目 | 説明 |
---|---|
「スタンダード」を選択します。 | |
任意の文字列を入力します。例: my-sns-topic | |
|
なお、ここで作成した Amazon SNS トピックの ARN を、これ以降、${sns_topic_arn} と表記します。例: arn:aws:sns:ap-northeast-1:XXXXXXXXXXXX:my-sns-topic
ステップ 6: AWS IoT Core のルールを作成する
このページで説明する機能を体験するために、AWS IoT Core に送信されたデータに応じて SNS トピックを呼び出すルールを作成します。操作手順について詳しくは、AWS IoT Core のルールを作成する を参照してください。
具体的には以下のように設定します。
項目 | 説明 |
---|---|
任意の文字列を入力します。例: sns_test | |
「2016-03-23」を選択します。 | |
myTopic 配下のトピック (例: myTopic/test) に Publish (送信) されたメッセージのうち、「temp」フィールドの値が 30 を超えた場合に、アクションを実行するように、以下の SQL を入力します。
| |
「Simple Notification Service (SNS)」を選択します。 | |
${sns_topic_arn} を選択します。例: Amazon SNS のトピックが見つからない場合は、リージョンを確認してください。AWS IoT Core と Amazon SNS のリージョンは同一である必要があります。 | |
「RAW」を選択します。 | |
新しいロールを作成します。
|
ステップ 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 の レスポンスの形式を設定する を参照してください。
ステップ 5: Amazon SNS のトピックを作成する で に指定したメールアドレスに、以下のようなメールが送信されていることを確認します。
メールが届かない場合は
以下のポイントを確認してください。
- ルールの設定内容が、上記の説明どおりになっていること
- 確認のポイントは AWS IoT のトラブルシューティング を参照してください。特に、CloudWatch Logs でログを出力すると、トラブルシューティングに役立ちます。
- SNS サブスクリプション の に有効なメールアドレスが登録されていること
temp
の値が 30 を超えていること