enebularを触ってRaspberryPiへのデプロイを試みた（初心者向けチュートリアル）

はじめまして、[isaax](https://isaax.io)のCPO杉田と申します。
実はこれがQiitaへの初投稿だったりします。

enebularの山崎さんにお声がけいただいたので僭越ながら初日の記事を担当いたします。

## 注意書き

以前からenebularとisaaxうまいこと連携できないかな〜と考えていたので、思いっきりポジショントークが出てくると思います。

## enebularの概要

enebularを使うにはまずアカウント登録をします。

https://enebular.com/

登録できたらまずは、ドキュメントを読んでみましょう。

https://docs.enebular.com/ja/

![enebularの概要](https://i.gyazo.com/64b4e448bcbf896a9d53d8587e554554.png)

enebularのダッシュボード上で作ったAssetsをエッジデバイスやクラウドサーバーなどのデバイスにデプロイする機能を持ているようです。なるほど**isaax**と似たような機能を持っているんですね。

対象となるエッジデバイスは以下の通り

* mbed Cloud
* AWS IoT

mbed CloudやAWS IoTなどのデバイスマネジメントサービスを使って実デバイスまで配信するのかな（違ったらすみません）

なるほど、enebularとisaaxは競合サービスに成り得ないな（ポジショントーク）

## Hello World的なのやってみた

[Getting Started](https://docs.enebular.com/ja/GetStarted/)あたりをやってみましょう。

![Create Project](https://qiita-image-store.s3.amazonaws.com/0/14211/82673b8e-71ea-1af2-6df0-fab343bc2bab.png)
プロジェクト名は英数とアンダースコアorハイフンだけで構成する必要があります。


![Edit Flow](https://qiita-image-store.s3.amazonaws.com/0/14211/3b8149b6-674b-5f00-fe2f-0c42586fd6b5.png)
とくにつまづくこと無くFlowを編集して`hello enebular`の文字を表示することまでできました。Flowを編集したら**デプロイ**ボタンを押すのが保存の変わりになるのかな？

これでデプロイすべきFlowはできました。

## AWS IoTでRaspberry Pi 3Bにデプロしてみる

Getting Startedに書かれている方法はherokuへのデプロイ方法だったので、[AWS IoTへのデプロイの記事](https://docs.enebular.com/ja/Deploy/DeployFlow/AWSIoT/)を読みながら、実際のエッジデバイスRaspberry Pi 3Bにデプロイしてみたいと思います。

### 前提知識

* Raspberry Piの基礎知識
* Node.jsの基礎知識
* AWSマネジメントコンソールの基本操作
* AWS IoTの基礎知識
* IAMの基礎知識

別に知らなくてもenebularのドキュメントを読んでよく確認しながら操作をすればできると思いますが、Node.jsの基礎知識がないと後述するように詰むと思いますのでお気をつけください。

### まずはAWSのセットアップ

とりあえず[ドキュメント](https://docs.enebular.com/ja/Deploy/DeployFlow/AWSIoT/)に従ってひたすらAWS IoTとAIMの設定をしていきます。

だいたい15分位で最初の関門に差し掛かると思います。
![選択肢がない！](https://docs.enebular.com/ja/_asset/images/Deploy/DeployFlow/AWSIoT/deploy-deployflow-awsiot_rule_05.png)
ん？？？？
2018年12月1日現在のAWS IoTには「AWS IoTのトピックにメッセージを再パブリッシュする」という選択肢はないようです。

おそらくre:Inventの直後だったこともあり色々AWSの仕様が変わったのではないかと予想します。現在のアクションの一覧をキャプチャーしてみました。
![現在の選択肢](https://qiita-image-store.s3.amazonaws.com/0/14211/fb566419-8d7c-394e-eb42-93426887cab9.png)
とりあえず一番近そうな「IoT Analyticsチャネルにメッセージを送信」を選択してみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/14211/dd7f0fb0-7258-2115-773e-152dbc5c436c.png)
できました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/14211/825a7d31-4cd3-ff8b-f480-5ce23f46bd8e.png)
enebularのダッシュボードに戻り、AWS ToTへのコネクションを設定します。やっぱりAWSの基礎知識がある方が設定は楽ですね。

### ようやくRaspberry Piのセットアップ
ドキュメントの**デバイス（エージェント）のセットアップ**のセクションに該当する作業をします。

Githubのリリースページから最新の安定版をダウンロードします。
https://github.com/enebular/enebular-runtime-agent/releases
2018年12月1日現在は2.3.0が最新だったので、バージョンは適宜読み替えてください。

```bash:RaspberryPi
$ wget https://github.com/enebular/enebular-runtime-agent/releases/download/2.3.0/2.3.0-prebuilt.tar.gz
$ tar -zxvf 2.3.0-prebuilt.tar.gz
```

そう言えば初期状態のラズパイにはnpmが入っていないようなのでインストールします。（[IoTit](http://iotit.isaax.io/)でSDカードを作ったからかも？）

```bash:RaspberryPi
$ sudo apt-get update
$ sudo apt-get install -y nodejs npm
```

（焼酎お湯割りを飲みながら待つこと数分）npmをインストールできたらドキュメントに従って作業を進めます。

```bash:RaspberryPi
$ cd 2.3.0/agent
$ npm install
$ npm run build
$ cd ../node-red
$ npm install
$ cd ../ports/awsiot
$ npm install
$ npm run build
```

（焼酎お湯割りを飲みながら）インストールとビルドが終わるのを待ちながら、enebularエージェントの[ソースコード](https://github.com/enebular/enebular-runtime-agent/blob/master/agent/src/startup.js)を流し読みします。
isaaxやAWS IoT Core同様にsystemdにUnitを登録してるっぽい。このへんの仕組みは2日目以降の詳しい人達が書いてくれると期待しましょう。

#### Node.jsのバージョンで詰まる

（焼酎お湯割りを飲みながら）順調に進んだかのように思いましたが、私の技術力の低さを露呈するようなトラブルが。。。

```bash:RaspberryPi
$ cd 2.3.0/agent
$ npm install
$ npm run build
$ cd ../node-red
$ npm install
(node:17523) [DEP0022] DeprecationWarning: os.tmpDir() is deprecated. Use os.tmpdir() instead.
npm WARN package.json node-red@1.0.0 No description
npm WARN package.json node-red@1.0.0 No repository field.
npm WARN package.json node-red@1.0.0 No README data
npm ERR! Error: Method Not Allowed
npm ERR!     at errorResponse (/usr/share/npm/lib/cache/add-named.js:260:10)
npm ERR!     at /usr/share/npm/lib/cache/add-named.js:203:12
npm ERR!     at saved (/usr/share/npm/node_modules/npm-registry-client/lib/get.js:167:7)
npm ERR!     at FSReqWrap.oncomplete (fs.js:135:15)
npm ERR! If you need help, you may report this *entire* log,
npm ERR! including the npm and node versions, at:
npm ERR!     <http://github.com/npm/npm/issues>

npm ERR! System Linux 4.14.34-v7+
npm ERR! command "/usr/bin/node" "/usr/bin/npm" "i"
npm ERR! cwd /home/pi/2.3.0/node-red
npm ERR! node -v v8.11.1
npm ERR! npm -v 1.4.21
npm ERR! code E405
npm ERR! git clone git@github.com:file:.node-red-config/enebular-agent-dynamic-deps undefined
npm ERR! git clone git@github.com:file:.node-red-config/enebular-agent-dynamic-deps undefined
npm ERR! 
npm ERR! Additional logging details can be found in:
npm ERR!     /home/pi/2.3.0/node-red/npm-debug.log
npm ERR! not ok code 0
```

ぬ？Node−REDのインスタンスをインストールできない？

再びドキュメントを読み返してみると、、、

> 以降の手順を進める際には、npmパッケージの n などを使用してNode.js のバージョンを8.9.0にしてください。

```bash:RaspberryPi
$ node -v
v8.11.1
```

なるほど、RaspberryPiにインストールされたNode.jsのバージョンが`v8.11.1`だから動かないんですね。Node.jsほとんど使ったこと無い私には少々ハードルが高そうなので今日はこの辺にしといてやるか（おい）

## enebular使ってみた印象

え？おわり？！とか言わないでください。ごめんなさい、ごめんなさい。npmのnモジュールを少し触ってから出直してきます。

Node-REDのフローを保存してデプロイするパイプラインを組むのはやったことが無いけど、大変そうだなぁというのは容易に想像ができます。enebularを使えば、Node-REDを使ったプログラミングからデバイスまでのデプロイまで一気通貫でできて便利そうな印象でした。
isaaxと異なりGitの操作が不要なので、非プログラマにとっても使いやすそうです。
センサーモジュールやカメラなどを接続したときにどうやってプログラミングするのかはまだ分からなかいのでもう少し勉強してみようと思いました。


宣伝
[Isaax Advent Calendar 2018](https://qiita.com/advent-calendar/2018/isaax)もやってますのでご参加いただけますと大変光栄です！本当にお願いします涙