SORACOM Funnel AWS IoT アダプターを使用してデータを送信する
はじめに
SORACOM Funnel(以下、Funnel)は、デバイスからのデータを特定のクラウドサービスに直接転送するアダプターです。
当ガイドでは、デバイスから送信するデータを AWS IoT Core に集約し、AWS IoT Core のルールエンジンでデータのフィルタリングを行い、Amazon SNS(Simple Notification Service)での通知を行う設定手順を例に、Funnel の AWS IoT アダプターの基本的な使い方を解説します。

AWS IoT Core にはデバイス管理など様々な機能がありますが、当ガイドでは、データの振り分けを行う「ルールエンジン」という機能を利用して Funnel から送ったデータの処理を行います。ルールエンジンの設定を変更すれば、システムの用途に合わせてデータの振り分けとアクションを指定できます。例えば、センサで取得した温度が特定の値を上回ったときに通知を出す、といった用途で利用できます。
サービスの詳細は 「SORACOM Funnelサービス概要ページ」 を参照ください。より詳細な技術仕様は「SORACOM Funnel機能詳細」をご覧ください。
ここではセットアップから動作確認までの流れを以下のステップに沿って解説します。
- IAM ユーザーの作成
- AWS IoT Core のエンドポイントの確認
- Funnel のセットアップ
- 動作確認1
- Amazon SNS のセットアップ
- AWS IoT Core のルールの作成
- 動作確認2
- 利用例
当ガイドの前提は以下のとおりです。
- SORACOM のアカウントを作成済みであること
- AWS のアカウントを作成済みであること
- IoT SIM で通信できるデバイスがお手元にあること
IAM ユーザーの作成
このガイドでは、 AWS IoT Core に届いたデータをルールエンジンで振り分け、条件に一致したデータがあれば SNS でメール通知します。はじめに SORACOM Funnel から AWS IoT Core へメッセージを Publish するための IAM ユーザーを作成します。 IAM のマネジメントコンソールを開き、左のメニュー画面の [ユーザー] をクリックします。ユーザー画面で [ユーザーの追加] をクリックするとユーザー作成画面が表示されます。ユーザー名は任意ですが、ここでは「funnel-test-user」としています。アクセスの種類については、今回は SORACOM から連携するので [プログラムによるアクセス]を 選択して次に進みます。

アクセス許可の設定では [既存のポリシーを直接アタッチ]を選択したあと、[ポリシーの作成] をクリックします。

新しく「ポリシーの作成」画面が表示されるので、それぞれ設定していきます。まず、[サービスの選択]では今回連携したい[IoT]を選択します。[アクション]では、検索ウィンドウに「Publish」と入力してそれを選択します。[リソース]では、[ARN の追加]をクリックして [Region][Account][Topic name]をそれぞれ記入或いは[すべて]にチェックを入れた後[追加]をクリックします。なお、当ドキュメントでは例として [Topic name] に myTopic
を指定します。すべての設定が終わったら、[ポリシーの確認]をクリックします。

最後にポリシーの名前を決めます。今回は「funnel-test-aws-iot-policy」としました。名前を決めて[ポリシーの作成]をクリックしたらポリシーの作成は完了です。

先ほどの「IAM ユーザー作成」の画面に戻り、右上の更新アイコンを一度クリックした後で、先ほど作成したポリシー名で検索すると、先ほど作成したポリシーが見つかりますので、選択して次に進みます。

以降はそのまま次に進んでいき、最後に [ユーザーの作成] をクリックすれば IAM ユーザーの作成は完了です。 IAM ユーザーの作成に成功すると、アクセスキー ID とシークレットアクセスキーが入手できますので、メモします。シークレットアクセスキーはアスタリスクで隠れていますが、[表示] をクリックすると見えるようになります。

AWS IoT Core のエンドポイントの確認
AWS IoT Core のマネジメントコンソールを開き、メニュー画面左下の [設定] をクリックします。
- はじめて AWS IoT Core を使う場合、AWSマネジメントコンソール画面中央の「Get Started」ボタンを押してください。メニュー画面に移動します。

ご自分の AWS アカウントに割り当てられたエンドポイントが表示されますので、内容をメモしてください。例えば、AWS 東京リージョンで AWS IoT Core をセットアップすると以下のようなエンドポイントが割り当てられます。
<ランダムな文字列>.iot.ap-norththeast-1.amazonaws.com

- エンドポイント
data.iot.[リージョン名].amazonaws.com
の利用は AWS から非推奨となっております。 - SORACOM Funnel から AWS IoT へデータを送信される場合はカスタムエンドポイント (
<ランダムな文字列>.iot.ap-norththeast-1.amazonaws.com
) をご利用くださいますようお願いします。詳細ついては AWS ブログをご参照ください。
Funnel のセットアップ
上記の設定が終わったら、SORACOM 側の設定に移ります。
認証情報の登録
SORACOM では、証明書や外部クラウドサービスの認証情報などを「認証情報ストア」に登録し、Beam や Funnel の認証に使います。今回は Funnel から AWS IoT Core にアクセスするために、 IAM ユーザーの Credential(Access Key, Secret Access Key)をユーザーコンソールに登録します。手順は以下のとおりです。
- SORACOM ユーザーコンソールにログインし、画面右上のユーザー名をクリックし「セキュリティ」を選択します。
- 左のメニューから「認証情報ストア」を選択し、「認証情報を登録」をクリックすると、認証情報の登録画面が表示されます。認証情報 ID に任意の文字列を入力し、概要は必要に応じて入力します。種別は「AWS 認証情報」を選択し、上記で作成した IAM ユーザーのアクセスキー ID とシークレットアクセスキーを入力します。

- 最後に登録ボタンをクリックすると登録は完了です。
SIM グループ設定
Funnel の設定は SIM グループ単位で行います。AWS IoT Core にデータ転送するよう以下の手順で設定を行います。
- SIMグループの詳細画面を開きます。(SIM グループが1つもなければ新しいグループを作成してください。)
- Funnel 詳細設定を開き、以下のように入力します
項目 | 設定内容 |
---|---|
ON/OFF スイッチ | ON にセット(設定を有効化) |
転送先サービス | AWS IoT を選択 |
転送先 URL | {ご自分のAWSアカウントに割り当てられたエンドポイント}/myTopic/ を入力 |
認証情報 | 先のステップで登録したものを選択 |
送信データ形式 | 要件に応じてフォーマットを指定。今回は JSON を選択 |

- 各項目の入力が終わり、「保存」ボタンをクリックすると設定完了です。
プレースホルダー機能
Funnel の 転送先 URL にはプレースホルダーを使うことができます。プレースホルダーを使うと IMSI, IMEI, LoRa デバイス ID, Sigfox デバイス ID を URL に自動的に入れ込むことができます。利用できるプレースホルダーは以下の通りです。通信方法によって利用できるものが異なる点に注意してください。
- IoT SIM で通信を行う場合:#{imsi} #{imei}
- LoRaWAN で通信を行う場合:#{deviceId}
- Sigfox で通信を行う場合:#{deviceId}
動作確認1
ここまでの設定で、デバイスからデータを Funnel を経由して AWS IoT Core に転送できるようになりました。 動作確認には IoT SIM で通信しているデバイスと AWS IoT Core の MQTT クライアントを使います。
AWS IoT Core のマネジメントコンソールを開き、画面左のメニューから「テスト」を選択し、MQTT クライアントを開きます。この画面では AWS IoT Core に対してデータを受信・送信するテストができます。
※初めて MQTT クライアントにアクセスする場合、操作できる状態になるまでしばらく時間がかかることがあります。その場合は少し待ってからアクセスしてみてください。
MQTT クライアントが表示されたら、「トピックのサブスクリプション」に myTopic/#
と入力し、「トピックへのサブスクライブ」をクリックします。これで myTopic
という名前のトピック配下に配信されたメッセージすべてを受信できるようになります。

これでデータの受信状況を確認できる環境が整いました。 IoT SIM で通信できるデバイスから Funnel 宛てにデータを送信します。
今回は次のような JSON 形式のデータをリクエストボディとして、HTTP で送信してみましょう。
{
"deviceid": "iot123",
"temp": 54.98,
"humidity": 32.43,
"coords": {
"latitude": 47.615694,
"longitude": -122.3359976
}
}
以下は Raspberry Pi に USB ドングルをセットして HTTP でデータ送信した場合のリクエストとレスポンスの例です。レスポンスとして 204 No Content
が返ってくれば、データ送信成功です。他の HTTP レスポンスコードが返ってきた場合には、エラーコードを元に送信データの形式などを確認してください。
pi@raspberrypi:~ $ curl -v -H "Content-Type:application/json" -d "{\"deviceid\" : \"iot123\", \"temp\" : 54.98, \"humidity\" : 32.43, \"coords\" : { \"latitude\" : 47.615694, \"longitude\" : -122.3359976 }}" funnel.soracom.io
* Rebuilt URL to: funnel.soracom.io/
* Hostname was NOT found in DNS cache
* Trying 100.127.65.43...
* Connected to funnel.soracom.io (100.127.65.43) port 80 (#0)
> POST / HTTP/1.1
> User-Agent: curl/7.38.0
> Host: funnel.soracom.io
> Accept: */*
> Content-Type:application/json
> Content-Length: 156
>
* upload completely sent off: 156 out of 156 bytes
< HTTP/1.1 204 No Content
< Date: Thu, 30 Mar 2017 11:12:43 GMT
< Connection: keep-alive
<
* Connection #0 to host funnel.soracom.io left intact
AWS IoT Core マネジメントコンソールの MQTT クライアントで、以下のようにメッセージが表示されれば AWS IoT Core までデータが届いていることが確認できます。 Funnel の設定でプレースホルダーを指定したので、トピックには自動的に IoT SIM の IMSI が入っています。

メッセージが受信できない場合は以下のポイントを確認してください。
- Funnel の設定で登録した転送先 URL がサンプルどおりになっているか
- 「認証情報ストア」に登録した IAM ユーザーのアクセスキーとシークレットアクセスキー(クレデンシャル)に誤りはないか
- IoT SIM が Funnel を設定したグループに所属しているか
Amazon SNS のセットアップ
次にメール通知に使う Amazon SNS をセットアップします。
AWS のドキュメントを参考に SNS トピックの作成とサブスクライブを行ってください。
- AWS Documentation: SNS トピックの作成
- AWS Documentation: SNS トピックへのサブスクライブ
- 今回は SNS トピックからメールで通知を受け取れるよう設定します。サブスクリプション作成の際、プロトコル は 「E メール」を指定し、エンドポイントには通知を受信するメールアドレスを登録してください。トピックへのサブスクライブを行うと確認メールが届きますので、メールにあるリンクをクリックし、登録を完了させてください。
AWS IoT Core のルールの作成
続いて、Funnel からのデータを受け取る AWS IoT Core をセットアップします。AWS IoT Core では、IoT デバイスから送られたデータをルールに沿って処理し、アクションを実行します。今回は、センサで取得した温度が特定の値を上回った場合にSNSに通知をするようルールを作成します。
画面左のメニューから [ACT] > [ルール]をクリックし、ルールを作成します。以下、myTopic
という名前のトピック配下に配信されたメッセージのうち、「temp」フィールドの値が特定の値を上回ったものだけフィルタリングし、該当するものがあった場合に SNS のメール機能でメッセージ全体を送信する、というルールを設定します。

ルールの名前と説明を入力します。(ここでは sns_test という名前にします)

ルールクエリステートメントを以下のように設定します。メッセージの「temp」フィールドの値が 30 を超えた場合にメールで通知するようになります。
SELECT * FROM 'myTopic/#' WHERE payloads.temp > 30

次に [1つ以上のアクションを設定する] の下の[アクションの追加]をクリックします。

[SNS プッシュ通知としてメッセージを送信する] を選択し[アクションの設定]をクリックします。

SNS ターゲットは先ほど作成した SNS トピックを設定します。 メッセージ形式は[RAW]を設定します。 IAM ロールは[ロールの作成]をクリックし、ロール名を設定して作成します。 上記設定ができたら、[アクションの追加]をクリックします。

[ルールの作成]をクリックします。

以上で AWS IoT Core の設定は完了です。 ルールの作成手順は AWS のドキュメントも参考にしてください。
- AWS Documentation: ルールの設定とテストを行う
動作確認2
ここまでの手順で、Funnel から AWS IoT Core へデータを転送し、SNS で通知を送る準備が整いました。最後に実際にデータを送信して SNS で設定したメールアドレス宛に通知が届くことを確認します。
動作確認 1 と同様の手順で、IoT SIM で通信できるデバイスから Funnel 宛てにデータを送信します。
SNS経由でメールが届くことを確認します。

メールが届かない場合は以下のポイントを確認してください。
- ルールの設定内容がサンプルどおりになっているか
- 確認のポイントは AWS IoT のトラブルシューティングガイド を参考にしてください。CloudWatch Logs でログ出力するとトラブルシューティングに役立ちます。
- SNSトピックにメールアドレスが登録されているか
利用例
Funnel の AWS IoT アダプタの長所は、デバイスから送信したデータを Funnel のエントリポイントに送信するだけで、AWS IoT Core によって様々な AWS サービスとの連携が可能となる点です。また、TCP/UDP/HTTP のプロトコルに対応しており、デバイスやシステムの要件に合ったプロトコルで通信できます。さらに、Funnel の設定項目の中では、転送先URL として#{imsi}
, #{imei}
を変数として URL のパスに埋め込むことができます。この機能を使うと、SIM の IMSI や IMEI を自動的にトピック名とすることが可能となり、特定の SIM やデバイスのみフィルタリングをかけてデータ処理を実行することも簡単に行うことができます。
具体的な利用例としては以下のようなものが挙げられます。
- IMSI をキーワードとして AWS IoT Core でフィルタリングし、特定の SIM からデータを受信したら Lambda Function で処理を行う。
- センサからのデータを AWS IoT Core に集約し、AWS DynamoDB に蓄積する。
なお、Funnel はデータをクラウドサービスにアップロードする機能に特化しており、デバイス宛の通信(下り通信)には対応していません。AWS IoT Core の Thing Shadow 機能を使う場合には SORACOM Beam を利用してください。