[新機能] AWS IoT Coreから独自のWebサービスに直接データ送信できるようになりました

AWS IoT Coreから独自のWebサービスに直接データ送信できるようになったので試してみました。
2019.11.27

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

まいど、大阪の市田です。 本日、IoT関連サービスで大量のリリースが行われました。その中の1つで「IoT Rulesにて独自のWebサービスへデータをPOSTできる」ようになりました。

このアップデートは何がうれしいの?

これまでだと同じことをやりたい場合は、IoT RulesにLambdaアクションを選択する必要がありました。
今回のアップデートでLambdaを使う必要がなくなったので、 ノーコーディングでセンサーデータなどを独自のWebサービス(API Gateway含む)へ簡単に送ることができるようになりました。

それでは試してみます。

準備:サンプル用のWebサービスの用意

データを送る為にAPI Gatewayで簡単なサービスを作成します。
確認なので超簡単に下記のLambdaを用意します。

import json

def lambda_handler(event, context):
    # TODO implement
    print(event)
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

次にAPI Gatewayを用意します。
詳細な手順は割愛しますが、マッピングテンプレートも確認のため簡単に下記のようにしています。

{
    "body-json" : $input.json('$') 
}

IoT Ruleの作成

AWS IoT Coreのコンソールでルールを作成します。ルール名とクエリ内容を入力します。
一時的な動作確認だけなのでクエリも以下の通り簡単なものにします。

SELECT * FROM 'iot/httptest'

アクションの選択で、今回新たに追加になった 「Send a message to a downstream HTTPS endpoint」 を選択しましょう。

02-select-httpaction

選択した状態で 「Configure action」 をクリック すると、具体的な設定画面になります。
ここでデータを送りたいWebサービスのエンドポイントを指定します。先程API Gatewayで作成したHTTPS Endpoint(POSTするリソースまで)を入力して「Add action」をクリックします。

03-https-endpoint

元の画面に戻るので 「Create rule」 をクリックしてルールの作成を完了します。
(この画面を見ると、追加したactionがちゃんと追加されていますね。)

04-create-rule

このルールアクションを追加するとAWS IoT Coreから指定したエンドポイントに確認メッセージが送られます。これは設定者がエンドポイントの管理者でアクセス権があることを検証する為です。

この中に含まれている一意のトークンを取得して、AWS IoT側に登録することで追加したルールが使用できるようになります。

今回、データ送信先として「Webサービス」をAPI Gatewayにしているので、CloudWatch Logsにてトークン内容を確認することができます。下記のconfirmationTokenがその内容で、これをAWS IoTに登録するので控えておきましょう。

06-confirmationtoken

AWS IoT Coreのコンソールの「Act」にある「Distinations」を開きます。この画面ではトピックルールの宛先、つまりデータをルーティングするWebサービスのエンドポイントの一覧とそのステータスを確認することができます。
ステータスとは、データ送信するためのそれぞれの宛先の状態のことです。

宛先の状態については下記を参照してください。

今回作成したAPI Gatewayは、まだトークンの登録前なので、「IN PROGRESS」 となっています。実際にコンソールに見えているURLは対象のAPI Gatewayのものです。
では、この宛先をクリックしてトークンを登録しましょう。

05-destination

Actionsから「Confirm and Enable」をクリックします。

07-confirmation-token

トークンの入力欄が現れるので、先程のconfirmationTokenの値を登録します。

08-cofirm-destination-token

トークンが正しければ、対象のエンドポイントの宛先が「有効」となります。コンソールでもステータスが「enable」になっていることが分かります。

これで、このIoT Ruleがトリガーされる度にこのエンドポイントにデータを送ることができるようになりました。

09-status-enable

なお、この 「confirmationToken」は3日間のみ有効 なので、速やかに検証を済ませてしまいましょう。

動作確認

それでは実際にデータを送ってみたいと思います。デバイスを用意していないので、IoTコンソールからMQTTでメッセージをPublishしてみたいと思います。

10-publish

CloudWatch Logsに下記の通りPublishしたメッセージを確認することができたので、AWS IoT Coreを通して正常にAPI GatewayにPOSTできたことが分かりました。

11-cloudwatchlogs

AWS IoT CoreのログからもHTTPアクションが実行されたことが確認できました。

12-aws-iot-log

制限事項

このHTTPアクションには、次のような制限があるので利用の前に確認しておきましょう。
特にリクエストタイムアウトはリトライも含めて3秒までのようです。(後述の参考リンクをご参照ください。)

項目 制限
The HTTPS protocol requires a valid certificate issued by a public certificate authority (CA) N/A
Ports allowed for HTTP action 443 and 8443
Maximum topic rule destinations per account 1,000
Request timeout 3,000 ms
Maximum number of headers per action 100
Maximum size of a header key 256 bytes
Maximum length of an endpoint URL 2 KiB
HTTP method supported POST

最後に

今回はAPI Gatewayを使いましたが、独自のWebサービスなどにも簡単にIoTデータを送ることができると思います。送信先のHTTPアクションの定義も他のバリエーションを指定できるようなので、時間を見つけて試してみたいと思います。

ぜひご活用ください。

参考

こちからは以上です。