さくらのIoT PlatformをAWSに連携する

AWS IoT

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

ども、大瀧です。 前回のエントリーでは、さくらのIoT Platform α(以下IoT Platform)を利用するためのセットアップと動作確認を試してみました。今回はIoT PlatformのデータをAWSに連携する構成をご紹介します。

AWSのサービス選び

IoT Platformの外部連携機能としては、Outgoing WebhookとWebSocketの2つがありました。Amazon EC2であればWebサーバーでWebhookの受信、WebSocketクライアントでWebSocketサービスにアクセスできますが、ここはひとつAWSのマネージドサービスで対応できるかを考えてみます。今回はOutgoing WebhookでAPI Gatewayをリクエストし、それをAWS IoTに転送する構成を考えてみました。

sakura-iot11

API Gatewayを利用することで認証周りを柔軟に選択できること、AWS IoTのメッセージ転送機能で他のAWSサービスとのスムーズに連携することを狙ったものです。

AWSの構成

API Gatewayは、ma2shitaさんの以下の記事を参考に、任意のAPIを作成、/リソースのPOSTメソッドを追加し、統合タイプにAWSサービスプロキシとして「IoT Data」(AWS IoTのデータ送受信用API)を設定します。

IoT Platformが送出するPOSTリクエストは、以下のようにリクエストボディのJSONのmodule要素にモジュールIDが含まれるので、[URLパスパラメータ]の[マッピング元]にmethod.request.body.moduleとし[パス上書き]のパスに含める(今回はパラメータ名module)ことでデバイスIDごとにAWS IoTのトピックを分けてみました。

{
  "payload": {
    : 
  },
  "module": "1234567890ab",
  "datetime": "2016-06-06T07:53:07.257754759Z",
  "type": "channels"
}

sakura-iot12

マッピング元に`method.request.body`が指定できるのはAPI Gatewayのドキュメントや管理コンソールに記載が無い非公式な設定なので、今後動作しなくなるかもしれません。

あとは、ドキュメントを参考に以下とします。

  • [AWSサブドメイン]は、aws iot describe-endpointコマンドで得られるサブドメインを入力
  • [メソッド]は「POST」を選択
  • [パス上書き]はtopics/modules/{module}と入力(topics/は固定、modulesは任意)
  • [実行ロール]はiot:Publishアクションが付与されたIAMロールを用意し、ARNを入力
  • [URL パスパラメータ]には名前module、マッピング元method.request.body.moduleを追加
  • [URL クエリ文字列パラメータ]には名前qos、マッピング元'1'(シングルクオートを含めること)を追加

この設定で任意のステージを設定、デプロイすれば準備OKです。

AWS IoTの設定

上記設定により、API Gatewayで受け取ったリクエストは、AWS IoTのトピックmodules/<モジュールID>にパブリッシュされます。AWS IoTの管理コンソールのMQTTクライアントを利用し、トピックをSubscribeしましょう。

sakura-iot13

トピックのタブを開いたままにしておきましょう。もちろん、トピックに対してルールを追加し、Amazon S3などAWSの各サービスにデータを転送することもできます。最近サポートされたAmazon Elasticsearch Serviceを利用するとデータを簡単に可視化できるのでオススメです。

さくらのIoT Platformの設定

最後に、IoT PlatformのOutgoing WebhookサービスにAPI Gatewayのエンドポイントを追加し、モジュールのデータをAPI GatewayにPOSTします。さくらのIoT Platformのコントロールパネルから[サービス追加]をクリックし、[Payload URL]にAPI GatewayのPOSTメソッドのURLを入力、[名前]と[Secret]は適当なものでOKです。[保存する]をクリックして設定完了です。

sakura-iot04

前回のエントリーのスケッチでモジュールを動作させてみると。。。

sakura-iot14

モジュールのデータがIoT Platform、API Gateway経由でAWS IoTまで送信されました!

おまけ : API Gatewayの認証設定(未検証)

今回のAPI Gatewayの構成では認証なしのフルオープンになっているため、IoT Platform以外のホストからも自由にデータをアップロードできてしまいます。IoT PlatformのOutgoing WebhookにあるSecretパラメータが、リクエストヘッダのX-Sakura-Signatureの署名元文字列として利用されていそうです。署名アルゴリズムが公開されれば、以下の記事のようにAPI GatewayのCustom Authorizationによる署名検証を噛ませてIoT Platformからのアクセスのみに限定することができそうです。

まとめ

さくらのIoT Platform αとAWSを連携し、モジュールから送信されるデータをAWS IoTに転送する設定をご紹介しました。手軽に利用できるさくらのIoT PlatformからのデータをAmazon ESに繋いでダッシュボードを見るもよし、S3に蓄積してあとから分析するもよし、AWSでおいしく料理していただければと思います。