Example Flow: AWS IoT

Flowのデプロイ先はそのままデプロイボタンを押すと、enebularが利用しているサーバーにデプロイされますが、オプションとしてAWS IoTにデプロイすることも可能です。このページでは、AWS IoTにFlowをデプロイする手順を説明します。

新規Flowの作成

enebularで作成したFlowは、AWS IoTにもデプロイすることができます。AWS IoTを利用することで、Raspberry Pi等のデバイス上でのFlowの実行に加え、それらの遠隔での更新が可能になります。このチュートリアルでは、作成したFlowをAWS IoTにデプロイして、お使いのパソコンをデバイスとして動作確認するまでを説明します。

まずAWS IoTへDeployするFlowを作成しましょう(Projectは作成済みとします)。作成したProjectを選択してProjectの管理画面に移動した後、左のサイドバーの “New Flow” を押すと、Node-REDの編集画面が立ち上がります。この編集画面でデータフローを編集してFlowを作成します。

データフローの編集

データフローを作成します。動作確認のため、タイムスタンプをファイルに追記していくだけのフローを作成しましょう。

右上の赤色のDeployボタンを押してDeployした後、Deployボタンの右にある下矢印から「Export to Other Services」を選択します。

「Export to Other Services」を選択すると、新しくウインドウが開いて以下のようなフォームが表示されます。

ここでこのウインドウは一旦置いておいて、AWS IoTのコンソールを開きます。

AWS IoTにてThingを作成・設定

AWSコンソールのAWS IoTページに移動します。Get Startedから始めます。

「Create a thing」にて、Nameに任意の英数字を入れて、「Create」でThingを作成します。

作成したら、「View Thing」でThingの情報を確認します。

「Update shadow」タブにて、JSONの中身を何も変えずに下にある「Update shadow」を押します(これを行っていないとデバイス側でエラーがでます)。

次に「Detail」タブの下部にある、「Connect a Device」を押します。

Connect a Deviceページに移動します。ここでは、デバイス側に書き込むAWSの認証情報等を取得します。まず、デバイスの言語を選択します。今回は、お使いのパソコンのNodeJS上で動かすので「NodeJS」を選択します。

鍵をダウンロードするよう、3つのリンクが出てくるのですべてダウンロードします。ダウンロードが終わったら、「Confirm & start connecting」を押します。

「Confirm & start connecting」を押すと、JSONが表示されます。

先ほどダウンロードした鍵とこちらのJSONをデバイスに書き込むことで、デバイスをThingとして扱うことができます。画面はこのままにしておいて、ターミナルでの作業に移りましょう。

パソコンのローカル環境でデバイスを立ち上げる準備をする

お使いのパソコンのNodeJS環境で、デバイスを立ち上げる準備をします。

新しくプロジェクト用のディレクトリを作成して、npmのプロジェクトを作成します。また、certs.node-redというフォルダもあらかじめ作っておきます。

$ mkdir enebular-agent-pj && cd enebular-agent-pj
$ npm init
$ mkdir certs .node-red

作成したら、Node-RED(v0.13.4)とenebular-agent-aws-iot モジュールをインストールします。

$ npm install -S [email protected]
$ npm install -S node-red enebular-agent-aws-iot

インストールが終わったら、config.jsonを作成して、AWS IoTで取得したJSONを貼付けます。ただ、少し情報を変更する必要があります。caCertclientCertprivateKey./certs/をつけます。また、topicを追加します。topicはAWS IoTの「Detail」タブの「MQTT Topic」に記載されています。

config.jsonの編集が終わったら、ダウンロードした3つの鍵をcertsフォルダにコピーします。

それに加えて、こちらのファイルをダウンロードして、同じcertsフォルダにroot-CA.crtというファイル名で保存します。

最後にNode-REDのための設定ファイルである、settings.jsを作成します。

//settings.js
module.exports = {
  flowFile: "flows.json",
  userDir: "./.node-red"
};

AWS IoTにフローをデプロイ&動作確認

ステップ2で立ち上げたウインドウ(Deployment Settings)に戻ります。「Connection Type」を「AWS IoT」に切り替えます。

Connectionのフィールドの右側にあるNewを押して新しいConnectionを作成しましょう。

AWSのアクセスキーは、AWSIoTConfigReadOnlyAccessAWSIoTDataAccess相当のポリシーで作成してください。AWS コンソールのIAMページやAWS IoTページから該当する情報をフォームにすべて書いたら、「Save」で保存します。

保存が終わると、Connectionのselectボックスにて追加したConnectionが選択できるようになっていますが、選択する前に、ステップ4で準備したをagentを起動します。

// enebular-agent-pj にいる状態で
$ ./node_modules/.bin/enebular-agent-aws-iot run ./node_modules/.bin/node-red

エラー(Cannot read property 'power' of undefined)が出ることがありますが、無視して大丈夫です(Cannot read property 'desire' of undefinedと出た場合は、AWS IoTコンソールで「Update shadow」をもう一度実行して下さい)。さきほどのウインドウに戻って、Connectionのselectボックスにて追加したConnectionが選択します。選択したら下のテーブルに、デプロイできるThing情報が表示されるので、チェックボックスを入れて「Deploy Flow」を押してデプロイします。

成功したら、完了画面が表示されます。

デプロイされたflowをデバイス上のenebular-agentで読み込むためには、Thing Shadowのpower属性を切り替えてNode-REDを再起動させる必要があります。これは遠隔で操作することができます。

AWS IoTの画面の対象Thingの「Update Shadow」タブで、Thing Shadowを変更することができます。以下の"power"の部分(ない場合は新しく追加)を、一度"off"にしてから「Update Shadow」をクリックし、"on"に戻して、もう一度「Update Shadow」をクリックしてください。

これはAWS IoTのAPI経由でも行うことができます。参考までに、example projectnpm runコマンドでon,offを行うためのサンプルを記述しています。

最後に、もう一度以下のコマンドでagentを起動してみて、以下画像のような表示(Node-REDの起動メッセージ)が出れば動作確認(同期)完了です。

// enebular-agent-pj にいる状態で
$ ./node_modules/.bin/enebular-agent-aws-iot run ./node_modules/.bin/node-red

Well Done!

今回は、パソコンのローカル環境を使用しましたが、実際はRaspberry Piなどにenebular-agent-aws-iotをインストールして使います。Node-REDの詳しい使い方については、Node-REDの公式サイトを参照下さい。