AWS IoT へのデプロイ
enebular では作成した Flow を AWS IoT にも書き出すことができます。
Flow の作成
今回は以下のような Flow を作成します。

フローが出来たら、デプロイして保存します。

保存したら、フローの Deploy タブから [Deploy] を押します。

Deploy Flow 画面に移動するので、 [Select Connection Type] を AWS IoT にして待機します。

AWS IoT で設定を作成
AWS IoT で今回用の設定を作成します。
モノの作成
メニューから 管理>モノ を選択し、[モノの登録]を押します。

[単一のモノを作成する]を押します。

適当な名前をつけて次に進みます。
他の項目は空欄でも構いません。

証明書の作成
1-Click 証明書作成の[証明書の作成]を押します。

鍵ファイルを全てダウンロードして有効化します。
AWS IoTのルートCAはダウンロードを押したリンク先より、RSA 2048 ビットキー: Amazon ルート CA 1をダウンロードしてください。
後で使用するので、わかりやすい場所にまとめて保存してください。


有効化が完了します。

新規ポリシーの作成
メニューの 安全性>ポリシー から[ポリシーの作成]を押します。

名前はわかりやすい名前を指定します。

つづいて、ステートメントを追加します。

ポリシー構文は以下のように指定します。
- アクション
- iot:*
- リソース ARN
- *

このポリシー構文は一旦試すための許可範囲が広い設定です。慣れてきたら、ポリシーも細かく調整してみてください。
作成ボタンを押してポリシーを保存します。

証明書へのポリシーのアタッチ
このままだとポリシーと証明書が結びついてないのでアタッチします。さきほど作成したモノの画面に移動して、メニューのセキュリティから作成した証明書を選択します。

右上の[アクション]から[ポリシーのアタッチ]を選択します。

さきほど作成したポリシーをアタッチします。

完了したら、証明書がポリシーとモノに結びついていることを確認します。


接続状態検知用ルールの作成
モノとAWS IoTの接続状態を正しく検知出来るためのルールを追加します。メニューから ACT を選択し、[ルールの作成]を押します。

わかりやすい名前を指定します。

[ルールのクエリステートメント]を以下のように指定します。
SQLバージョンは2016-03-23のものを使用してください。
SELECT * FROM 'enebular/things/+/shadow/update'

[アクションの追加]を押してルールにアクションを追加します。

アクションには[AWS IoT のトピックにメッセージを再パブリッシュする]を選択します。その後、[アクションの設定]を押します。

アクションのトピックは以下のように指定します。
- トピック
$$aws/things/${topic(3)}/shadow/update

[新しいロールの作成]を押してアクションのためのロールを作成します。
わかりやすいロール名を指定して[新しいロールの作成]を押します。

作成したロールを選択して、[アクションの追加]を押します。

これでルールの設定が完成しているので、「ルールの作成」を押します。

作成したルールが表示されます。

AWS IoT 用 IAM ユーザーの作成
enebular から AWS IoT を利用するための Access Key ID と Secret Access Key を作成します。
IAM のメニューのユーザーから[ユーザーを追加]を押します。

詳細では、わかりやすい名前をつけて [プログラムによるアクセス] にチェックをつけます。

アクセス権限では、[既存のポリシーを直接アタッチ]を選択して、[AWSIoTFullAccess]というポリシーを選択して次に進みます。 タグの追加は何も入力せず次に進みます。

最後に間違いがないか確認します。

完了したら、アクセスキー ID とシークレットアクセスキーが記載された CSV ファイルをダウンロードします(このタイミングでしかダウンロードできないので注意して下さい)。

フローに AWS IoT の設定を反映
先ほどの AWS IoT 設定画面に戻りフローに AWS IoT の設定を反映します。

Select Connection の右の [New] を押します。必要な情報を入力して Connection を作成します。

- Connection Name
- 任意の英数字
- AWS Access Key ID
- ダウンロードした CSV からコピーする
- AWS Secret Access Key
- ダウンロードした CSV からコピーする
- AWS IoT Endpoint URL
- モノのメニューの操作より確認できます(下の画像参照)

作成した Connection を選択すると登録されているモノが表示されます。

まだ Disconnected になっています。これはデバイスが AWS IoT にデプロイされていないまたは接続が切れていることを意味します。
enebular 側の操作は一旦置いておいて、次はパソコン上でデバイスのセットアップをしましょう。
デバイス(エージェント)のセットアップ
デバイスのセットアップを行います。なお、デバイスマスターからくる命令を受けて処理を行うコードベースのデバイスのラッパーのことをエージェントと呼びます。
GitHub からダウンロードします。
※以降の手順を進める際には、npmパッケージの n などを使用してNode.js のバージョンを8.9.0にしてください。
エージェントのコアモジュールをビルドします。
cd agent
npm install
npm run build
Node-RED のインスタンスをインストールします。
cd ../node-red
npm install
AWS IoT ポートのモジュールをインストールしてビルドします。
cd ../ports/awsiot
npm install
npm run build
AWS IoT ポートのディレクトリの下に、AWS IoT ポートを単にラップする example というモジュールがあります。example モジュールのディレクトリに移動し、モジュールをインストールします。example モジュールの package.jsonファイルを確認すると、Node-RED ディレクトリを指定する環境変数が設定されていることが分かります。
cd example
npm install
少し前の手順でダウンロードした AWS IoT Thing 用の証明書ファイルを example モジュールの certs ディレクトリににコピーします。
※ここでダウンロードしたファイルです。
コピーした証明書ファイルの正しいパスを含めて、この接続情報で example モジュールの config.jsonファイルを更新します。
{
"host": "<THING SHADOW REST API ENDPOINT>",
"port": 8883,
"clientId": "<THING NAME>",
"thingName": "<THING NAME>",
"caCert": "./certs/AmazonRootCA1.pem",
"clientCert": "./certs/<THING CERT>",
"privateKey": "./certs/<THING PRIVATE KEY>",
"topic": "aws/things/<THING NAME>/shadow/update"
}
<THING CERT>・・・xxxxxx-certificate.pem.crt<THING PRIVATE KEY>…xxxxxx-private.pem.key
<THING SHADOW REST API ENDPOINT>, <THING NAME> はモノのメニューの操作より確認できます。(下記画像参照)

実行
上記のセットアップが完了したら、エージェントは npm run start コマンドで example モジュールのディレクトリから起動できます。
デフォルトの状態ではエージェントがコンソールにログを出力しませんが、DEBUG 環境変数を info または debug のいずれかに設定することで出力するようにできます。
DEBUG=info npm run start
以下のようなログが表示されるかと思います。

エージェントが正常に起動して AWS IoT に接続できていた場合、次のログメッセージが表示されているかと思います。
internal: aws-iot: Connected to AWS IoT
これが表示されると、enebular でデバイスを使用することができます。
フローのデプロイ
デプロイの準備ができました。再度以下の画面に戻ってください。

左のチェックマークにチェックして、[Deploy] を押すとデプロイが完了します。デプロイの履歴で Deploy Status にチェックマークがついていれば成功しています。

また、デバイス側のログで更新されているのが確認できるかと思います。


unauthenticated と出ますが、ライセンスが未購入であるということです。購入をしなくてもフローは動作しますが、ライセンスを購入することでステータスやログの監視ができるようになります。
エージェントのコアを実行する時にさまざまなオプションを指定できます。AWS IoT の場合、このオプションの指定を ports/awsiot/src/index.js のソースコードで見ることができます。エージェントのコアがサポートするすべてのオプションには、agent/src/index.js のソースコードファイルを参照してください。